ISOAL과 등시성 타이밍
LE 오디오 코덱 LC3는 7.5 ms나 10 ms마다 압축된 소리 한 덩어리(SDU)를 낸다. 무선은 ISO 간격마다 정해진 수의 PDU를 보낸다. 둘의 박자가 같으면 덩어리를 그대로 실으면 되지만, 7.5 ms 덩어리를 10 ms 간격에 실으려면 쪼개고 이어 붙이고 “원래 언제 만들어졌는지”를 함께 보내야 한다. 이 일을 하는 층이 ISOAL(등시성 적응 계층)이다. 이 장은 그 두 방식과 지연 공식을 사양의 예로 맞춰 본다.
- 프레임 없는 PDU를 쓸 수 있는 조건과 USPI·UPPS·BN, LLID 0b00/0b01, 채움 PDU를 안다.
- 프레임 있는 PDU의 분할 헤더(SC·CMPLT·길이)와 Time_Offset을 바이트로 만들 수 있다.
- 분할 모드와 비분할 모드에서 Max_PDU가 충분한지 판단할 수 있다.
- CIG·BIG의 전송 지연을 프레임 없음·있음에 따라 계산할 수 있다.
프레임 없는 PDU: 박자가 맞을 때
ISO 간격이 SDU 간격과 같거나 그 정수배이고, 상위 계층이 SDU를 전송 박자에 맞춰 만들어 주면 프레임 없는(unframed) PDU를 쓸 수 있다. 추가 머리말이 없다. SDU가 Max_PDU보다 길면 최소 개수의 조각(fragment)으로 나누고, 각 조각은 PDU 하나에 담는다. 끝 조각이나 SDU 전체를 담은 PDU는 LLID = 0b00, 시작·중간 조각은 0b01이다.
- USPI = ISO_Interval ÷ SDU_Interval: ISO 간격 하나에 들어오는 SDU 수.
- UPPS: SDU 하나에 배정하는 PDU 수. 적어도 ⌈Max_SDU ÷ Max_PDU⌉.
- BN = UPPS × USPI: ISO 이벤트 하나에 보내는 새 PDU 수. SDU가 UPPS보다 적은 조각이 되면 길이 0, LLID 0b01인 채움 PDU로 개수를 맞춘다.
기차(ISO 이벤트)는 매번 같은 수의 칸(BN)을 달고 정시에 떠난다. 박자가 맞으면 짐(SDU) 하나를 칸 몇 개에 나눠 싣고(프레임 없음), 칸이 남으면 빈 칸을 단다. 짐이 기차 시간표와 다른 박자로 들어오면, 짐을 쪼개 칸마다 이름표(분할 헤더)와 “짐이 도착한 시각”(Time_Offset)을 붙여 아무 칸에나 이어 싣는다(프레임 있음).
ISOAL 기능과 프레임 없는 PDU를 쓸 조건: [Vol 6] Part G §2 · LLID·USPI·UPPS·BN·채움 PDU: §2.1
프레임 있는 PDU: 분할 헤더와 Time_Offset
박자가 맞지 않으면 프레임 있는(framed) PDU를 쓴다. PDU 페이로드는 세그먼트 여러 개이고, 세그먼트마다 2바이트 분할 헤더가 붙는다. 첫 바이트의 비트 0이 SC(0 = 새 SDU의 시작, 1 = 이어짐), 비트 1이 CMPLT(1 = 이 세그먼트로 SDU가 끝남), 둘째 바이트가 길이다. SC = 0인 세그먼트에는 헤더 뒤에 3바이트 Time_Offset(µs)이 붙고, 길이는 Time_Offset을 포함한다. Time_Offset은 SDU의 기준 시각에서 그 SDU의 첫 세그먼트를 싣는 CIG 기준점(또는 BIG 앵커 포인트)까지의 시간이라, 받는 쪽이 원래 박자를 복원할 수 있다.
모드는 둘이다. 분할 모드(Segmentable, 필수)는 SDU 하나를 여러 PDU에 걸쳐 나눌 수 있고 PDU 하나에 여러 SDU를 담을 수 있다. 비분할 모드(Unsegmented, 선택)는 SDU를 나누지 않고 PDU 하나에 통째로 넣는다. PDU에 헤더와 Time_Offset을 넣을 5바이트가 남지 않으면 새 세그먼트를 시작하지 않는다.
SDU 박자 → 프레임 있는 PDU (분할 모드)
분할 헤더(그림 2.3, Table 2.2·2.3)·Time_Offset·5바이트 규칙·모드: [Vol 6] Part G §2.2 · Time_Offset 정의: §3.1
설정이 충분한가: Max_PDU와 BN
사양은 대역이 모자라지 않도록 두 조건을 준다. MaxDrift(SDU 박자의 평균 오차)는 100 ppm이다.
비분할 모드: Max_PDU = ⌈ISO_Interval ÷ SDU_Interval × (1 + MaxDrift) ÷ BN⌉ × 5 + Max_SDU
사양의 예: 10 ms마다 40바이트 SDU를 7.5 ms ISO 간격, BN 1로 보내면 비분할 모드의 Max_PDU는 45바이트다(PDU 하나에 SDU 하나, 헤더 2 + Time_Offset 3). 프레임 없는 PDU는 USPI와 UPPS가 정수일 때만 가능하다.
ISOAL 설정 점검과 전송 지연
SDU 간격 10.6 ms, ISO 간격 10 ms. 분할 모드와 비분할 모드의 “틀 짜기 지연”(framing delay)은 각각?
최대 틀 짜기 지연은 분할 모드에서 ISO 간격 + SDU 간격, 비분할 모드에서 ISO 간격.
대역 조건과 비분할 Max_PDU, 45바이트 예: [Vol 6] Part G §2.2 · 프레임 있는 경우 지연(10.6/10 → 20.6 ms): §3.2.1 · 프레임 없는 경우 지연(10/20 → 10 ms): §3.2.2
핵심 정리
- 프레임 없는 PDU: ISO 간격이 SDU 간격의 정수배이고 박자가 맞을 때. USPI = ISO ÷ SDU, UPPS ≥ ⌈Max_SDU ÷ Max_PDU⌉, BN = UPPS × USPI, LLID 0b00(끝·전체)·0b01(시작·중간·채움).
- 프레임 있는 PDU: 세그먼트마다 분할 헤더 2바이트(SC, CMPLT, 길이), 새 SDU의 첫 세그먼트엔 Time_Offset 3바이트.
- 분할 모드는 SDU를 나누고 섞어 담는다(필수), 비분할 모드는 SDU를 통째로(선택). 5바이트가 남지 않으면 새 SDU를 시작하지 않는다.
- 분할 모드: BN × (Max_PDU − 2) ≥ F × (5 + Max_SDU). 비분할: Max_PDU = ⌈…⌉ × 5 + Max_SDU.
- 전송 지연(CIS C→P): 프레임 없음 CIG_Sync_Delay + FT × ISO − SDU, 프레임 있음 CIG_Sync_Delay + FT × ISO + (분할이면 SDU 간격).
확인 퀴즈
ISO 간격 20 ms, SDU 간격 10 ms, Max_SDU 100, Max_PDU 60이면 BN은?
분할 헤더의 SC가 0이면?
프레임 없는 PDU에서 SDU를 담은 마지막 PDU의 LLID는?
10 ms마다 40바이트 SDU를 ISO 간격 7.5 ms, BN 1, 비분할 모드로 보낼 때 Max_PDU는?