Chapter 14

ISOAL과 등시성 타이밍

LE 오디오 코덱 LC3는 7.5 ms나 10 ms마다 압축된 소리 한 덩어리(SDU)를 낸다. 무선은 ISO 간격마다 정해진 수의 PDU를 보낸다. 둘의 박자가 같으면 덩어리를 그대로 실으면 되지만, 7.5 ms 덩어리를 10 ms 간격에 실으려면 쪼개고 이어 붙이고 “원래 언제 만들어졌는지”를 함께 보내야 한다. 이 일을 하는 층이 ISOAL(등시성 적응 계층)이다. 이 장은 그 두 방식과 지연 공식을 사양의 예로 맞춰 본다.

프레임 없는 PDU: 박자가 맞을 때

ISO 간격이 SDU 간격과 같거나 그 정수배이고, 상위 계층이 SDU를 전송 박자에 맞춰 만들어 주면 프레임 없는(unframed) PDU를 쓸 수 있다. 추가 머리말이 없다. SDU가 Max_PDU보다 길면 최소 개수의 조각(fragment)으로 나누고, 각 조각은 PDU 하나에 담는다. 끝 조각이나 SDU 전체를 담은 PDU는 LLID = 0b00, 시작·중간 조각은 0b01이다.

정해진 칸 수의 기차

기차(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바이트가 남지 않으면 새 세그먼트를 시작하지 않는다.

WORKBENCH

SDU 박자 → 프레임 있는 PDU (분할 모드)

대역 조건 BN×(Max_PDU−2) ≥ F×(5 + Max_SDU)—
밀린 바이트(이벤트 8 뒤)—
이벤트 0~7의 PDU 바이트. 파랑 = 분할 헤더(SC/CMPLT 바이트, 길이), 주황 = Time_Offset(µs, 리틀 엔디언), 나머지 = SDU 데이터(S0, S1 …의 첫 바이트를 SDU 번호로 채웠다). 모델: SDU j는 j × SDU 간격에 생기고, 이벤트 k(시각 k × ISO 간격)의 PDU에는 그 전에 생긴 데이터만 싣는다. F = (1 + 100 ppm) × ISO 간격 ÷ SDU 간격. 해볼 것: ① 7.5 ms SDU를 10 ms 간격에 실으면 어떤 이벤트에는 SDU 시작이 둘, 어떤 이벤트에는 이어지는 조각이 들어간다. ② Max_PDU를 줄여 대역 조건이 깨지면 밀린 바이트가 쌓인다. ③ SDU 간격 = ISO 간격(10/10)이면 프레임 없는 PDU로도 된다(아래 계산기).

분할 헤더(그림 2.3, Table 2.2·2.3)·Time_Offset·5바이트 규칙·모드: [Vol 6] Part G §2.2 · Time_Offset 정의: §3.1

프레임 없음박자가 맞을 때 헤더 SDU 조각 (머리말 없음) LLID 0b00 = 끝 조각·SDU 전체LLID 0b01 = 시작·중간·채움 프레임 있음박자가 다를 때 헤더 분할 헤더2 B Time_Offset3 B SDU j의 앞부분 분할 헤더2 B Time_Offset3 B SDU j+1 … SC = 0 (새 SDU), CMPLT = 1이면 이 세그먼트로 SDU가 끝남 헤더 분할 헤더2 B SDU j+1의 나머지 SC = 1 (이어짐): Time_Offset 없음 PDU에 5바이트(헤더 2 + Time_Offset 3)가 남지 않으면 새 SDU를 시작하지 않는다
그림 14-1. ISOAL의 두 PDU. 프레임 없는 PDU는 SDU 조각을 그대로 담고 LLID만으로 끝 조각을 표시한다. 프레임 있는 PDU는 세그먼트마다 2바이트 분할 헤더(SC, CMPLT, 길이)를 붙이고, 새 SDU의 첫 세그먼트(SC = 0)에는 원래 박자를 되살릴 Time_Offset 3바이트를 더한다. 분할 모드에서는 한 PDU에 여러 SDU의 세그먼트가 함께 실린다.

설정이 충분한가: Max_PDU와 BN

사양은 대역이 모자라지 않도록 두 조건을 준다. MaxDrift(SDU 박자의 평균 오차)는 100 ppm이다.

분할 모드: BN × (Max_PDU − 2) ≥ F × 5 + F × Max_SDU, F = (1 + MaxDrift) × ISO_Interval ÷ SDU_Interval
비분할 모드: 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가 정수일 때만 가능하다.

CALCULATOR

ISOAL 설정 점검과 전송 지연

CIS 센트럴 → 페리페럴 방향의 전송 지연. 프레임 없음: CIG_Sync_Delay + FT × ISO_Interval − SDU_Interval. 프레임 있음: CIG_Sync_Delay + FT × ISO_Interval + (분할 모드면 SDU_Interval, 비분할이면 0). 해볼 것: ① 10/10, 40/40이면 프레임 없음 BN 1, UPPS 1. ② SDU 10, ISO 20이면 USPI 2(사양의 예: SDU 두 개를 묶느라 10 ms 더). ③ SDU 7.5, ISO 10이면 프레임 없음은 불가. 분할 모드는 SDU 간격만큼 더 늦다.
예측해 보기

SDU 간격 10.6 ms, ISO 간격 10 ms. 분할 모드와 비분할 모드의 “틀 짜기 지연”(framing delay)은 각각?

최대 틀 짜기 지연은 분할 모드에서 ISO 간격 + SDU 간격, 비분할 모드에서 ISO 간격.

사양 [Vol 6] Part G §3.2.1의 예 그대로다. 분할 모드는 SDU를 PDU 경계에 맞춰 쪼개며 기다리는 시간이 하나 더 든다. 대신 비분할 모드는 PDU 하나에 SDU를 통째로 넣어야 해서 Max_PDU가 커야 한다.

대역 조건과 비분할 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

핵심 정리

  1. 프레임 없는 PDU: ISO 간격이 SDU 간격의 정수배이고 박자가 맞을 때. USPI = ISO ÷ SDU, UPPS ≥ ⌈Max_SDU ÷ Max_PDU⌉, BN = UPPS × USPI, LLID 0b00(끝·전체)·0b01(시작·중간·채움).
  2. 프레임 있는 PDU: 세그먼트마다 분할 헤더 2바이트(SC, CMPLT, 길이), 새 SDU의 첫 세그먼트엔 Time_Offset 3바이트.
  3. 분할 모드는 SDU를 나누고 섞어 담는다(필수), 비분할 모드는 SDU를 통째로(선택). 5바이트가 남지 않으면 새 SDU를 시작하지 않는다.
  4. 분할 모드: BN × (Max_PDU − 2) ≥ F × (5 + Max_SDU). 비분할: Max_PDU = ⌈…⌉ × 5 + Max_SDU.
  5. 전송 지연(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은?

USPI = 2, UPPS = ⌈100 ÷ 60⌉ = 2, BN = 4.

분할 헤더의 SC가 0이면?

[Vol 6] Part G Table 2.3. 끝을 알리는 것은 CMPLT다.

프레임 없는 PDU에서 SDU를 담은 마지막 PDU의 LLID는?

끝 조각이나 SDU 전체는 0b00, 시작·중간·채움은 0b01.

10 ms마다 40바이트 SDU를 ISO 간격 7.5 ms, BN 1, 비분할 모드로 보낼 때 Max_PDU는?

⌈0.75 × 1.0001 ÷ 1⌉ × 5 + 40 = 45. 사양의 예다.