Linux 6.18 ASoC 문서 · ALSA PCM interface

ALSA·ASoC: PCM 버퍼에서 오디오 핀까지

frame·period·DMA·DAI clock을 연결하고 소리가 나지 않는 구간을 나누어 찾습니다.

ALSA와 ASoC, 사용자 라이브러리를 나누어 봅니다

ALSA는 Linux의 오디오 인터페이스와 driver 체계를 제공합니다. ASoC는 SoC·codec·보드 연결을 나누어 구성하는 데 쓰입니다. 사용자 공간의 alsa-lib plugin도 별도 역할이 있습니다. 예를 들어 dmix는 alsa-lib의 software mixing plugin이지, 모든 PCM stream이 반드시 통과하는 커널 mixer는 아닙니다. ALSA PCM plugin

DMA playback을 사용하는 보드의 예
  1. 사용자 프로그램 / 오디오 서비스

    지원 format과 buffer 조건에 맞춰 PCM 데이터를 준비합니다.

    PCM frame을 버퍼에 공급합니다.

  2. PCM buffer와 DMA

    DMA가 정해진 전송 조건으로 데이터를 peripheral에 공급합니다.

    DAI에서 serial data를 전송합니다.

  3. SoC DAI와 codec DAI

    clock·slot·format을 맞춰 디지털 오디오를 주고받습니다.

    codec 및 출력 경로를 통과합니다.

  4. 출력 장치

    필요한 전원·mute·route가 설정돼야 실제 소리가 납니다.

화살표는 이 예의 재생 데이터 경로입니다. 모든 장치에 외부 codec이나 같은 DMA engine이 있으며 모든 제어가 한 함수에서 실행된다는 뜻은 아닙니다.

machine 쪽 구성은 어떤 CPU DAI와 codec을 연결하는지, clock과 오디오 경로를 어떻게 맞추는지를 표현합니다. PCM 장치가 보이더라도 실제 보드 배선·전원·clock까지 맞았다는 보장은 없습니다. ASoC 구성 요소

sample, frame, period를 구분합니다

단위stereo 예에서의 뜻
sample한 채널의 한 시점 값입니다.
frame같은 시점의 모든 채널 sample 묶음입니다. stereo라면 두 채널 값입니다.
periodPCM 전송에서 진행을 관리하는 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 / LRCLKsample frame의 주기를 나타냅니다. 예에서는 48 kHz입니다.
BCLKserial data를 넘기는 bit clock입니다. slot 수·폭과 protocol 조건을 확인합니다.
MCLK / SYSCLKcodec·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 공급과 활성화 조건을 확인해야 합니다.