ALSA와 ASoC, 사용자 라이브러리를 나누어 봅니다
ALSA는 Linux의 오디오 인터페이스와 driver 체계를 제공합니다. ASoC는 SoC·codec·보드 연결을 나누어 구성하는 데 쓰입니다. 사용자 공간의 alsa-lib plugin도 별도 역할이 있습니다. 예를 들어 dmix는 alsa-lib의 software mixing plugin이지, 모든 PCM stream이 반드시 통과하는 커널 mixer는 아닙니다. ALSA PCM plugin
- 사용자 프로그램 / 오디오 서비스
지원 format과 buffer 조건에 맞춰 PCM 데이터를 준비합니다.
PCM frame을 버퍼에 공급합니다.
- PCM buffer와 DMA
DMA가 정해진 전송 조건으로 데이터를 peripheral에 공급합니다.
DAI에서 serial data를 전송합니다.
- SoC DAI와 codec DAI
clock·slot·format을 맞춰 디지털 오디오를 주고받습니다.
codec 및 출력 경로를 통과합니다.
- 출력 장치
필요한 전원·mute·route가 설정돼야 실제 소리가 납니다.
화살표는 이 예의 재생 데이터 경로입니다. 모든 장치에 외부 codec이나 같은 DMA engine이 있으며 모든 제어가 한 함수에서 실행된다는 뜻은 아닙니다.
machine 쪽 구성은 어떤 CPU DAI와 codec을 연결하는지, clock과 오디오 경로를 어떻게 맞추는지를 표현합니다. PCM 장치가 보이더라도 실제 보드 배선·전원·clock까지 맞았다는 보장은 없습니다. ASoC 구성 요소
sample, frame, period를 구분합니다
| 단위 | stereo 예에서의 뜻 |
|---|---|
| sample | 한 채널의 한 시점 값입니다. |
| frame | 같은 시점의 모든 채널 sample 묶음입니다. stereo라면 두 채널 값입니다. |
| period | PCM 전송에서 진행을 관리하는 frame 묶음입니다. |
| buffer | 여러 frame을 보관하는 공간이며 period·buffer 조건은 장치가 허용하는 범위에 맞춰야 합니다. |
예를 들어 48,000 frame/s의 stereo PCM에서 period가 240 frame이면 한 period 분량은 5 ms입니다. 이것이 앱 입력부터 스피커까지의 전체 지연이 5 ms라는 뜻은 아닙니다. 여러 buffer와 scheduling·처리·하드웨어 지연이 더해질 수 있습니다.
playback에서 데이터를 제때 공급하지 못하면 underrun이 발생할 수 있고, capture에서 제때 가져가지 못하면 overrun이 발생할 수 있습니다. ALSA의 XRUN 상태와 복구 결과를 확인해야 하며 buffer 크기만 무작정 키우면 지연과 오류 원인을 함께 가릴 수 있습니다. PCM 상태·frame·XRUN
24비트 sample이라고 BCLK가 항상 24비트 기준은 아닙니다
예: sample rate = 48,000 frame/s
frame마다 slot = 2개
slot width = 32 bit
BCLK = 48,000 × 2 × 32 = 3,072,000 Hz위 값은 한 frame에 32비트 slot 두 개를 보내는 serial link의 계산 예입니다. 실제 유효 sample이 24비트여도 slot이 32비트라면 전송 clock은 32비트 폭을 기준으로 셉니다. PCM 메모리 format, 유효 bit 수, serial slot 폭을 한 값으로 취급하지 않습니다.
| clock | 확인할 내용 |
|---|---|
| frame clock / LRCLK | sample frame의 주기를 나타냅니다. 예에서는 48 kHz입니다. |
| BCLK | serial data를 넘기는 bit clock입니다. slot 수·폭과 protocol 조건을 확인합니다. |
| MCLK / SYSCLK | codec·SoC 내부 동작에 쓰이는 기준 clock입니다. BCLK와 항상 같은 값은 아닙니다. |
| clock 공급 방향 | SoC와 codec 중 누가 각 clock을 공급하고 누가 받는지 설정과 배선을 함께 확인합니다. |
수치는 board와 DAI 규격에 맞춰 계산해야 합니다. LRCLK만 맞고 bit clock 비율·극성·data 지연이 틀리면 재생 속도, 채널 또는 sample 값이 잘못될 수 있습니다. ASoC clock과 설정 API
DPCM의 front end와 back end
DPCM은 PCM stream과 실제 디지털 오디오 경로 사이의 연결을 실행 중 바꾸는 데 쓰입니다. front end는 앱에 보이는 PCM 쪽, back end는 실제 DAI 연결 쪽으로 읽습니다. DSP가 중간에서 변환하면 양쪽의 rate·format이 같지 않을 수 있습니다.
| 변화 | 확인할 상태 |
|---|---|
| 헤드셋에서 스피커로 전환 | 기존 경로를 종료하고 새 경로의 자원·clock·parameter를 준비하는 순서를 봅니다. |
| 하나의 PCM을 여러 출력에 연결 | 각 back end의 조건과 route가 함께 성립하는지 봅니다. |
| hostless stream | 주 CPU가 매 sample을 운반하지 않아도 DSP·장치 사이의 오디오가 동작할 수 있습니다. |
이때의 hostless는 Linux가 어떠한 제어도 하지 않는다는 뜻이 아닙니다. 데이터가 흐르는 곳과 경로를 설정하는 곳이 다를 수 있다는 뜻입니다. Dynamic PCM과 hostless stream
소리가 안 날 때는 경로를 나누어 확인합니다
- PCM open·parameter 설정이 성공했는지와 XRUN 발생 여부를 확인합니다.
- DMA와 PCM의 진행 위치가 움직이는지 봅니다.
- BCLK·frame clock과 data가 핀에서 기대한 형식으로 나오는지 확인합니다.
- codec의 route·전원·mute·gain과 실제 출력 연결을 확인합니다.
DMA 위치가 움직이는 것은 메모리에서 전송이 진행된다는 단서입니다. 그 정보 하나로 codec 뒤의 아날로그 출력까지 정상이라고 판정하지 않습니다. 반대로 핀에서 clock이 안 보이면 PCM 데이터 파일만 바꿔 가며 시험하기 전에 clock 공급과 활성화 조건을 확인해야 합니다.