Embedded : : Linux/: : ALSA

[ALSA] 6. Timer API

Jay.P Morgan 2026. 3. 11. 14:32

 

 

  6.  Timer API

 

  6.1  ALSA Timer

 

ALSA Timer는 고정밀 타이밍 이벤트를 제공합니다. PCM 스트림과 동기화하거나 독립적인 타이머로 사용할 수 있습니다.

       Hardware Timer: 실제 하드웨어 타이머 (RTC, HPET, 사운드 카드 타이머)

       Software Timer: 커널 hrtimer 기반

       PCM Timer: PCM 스트림의 period elapsed와 동기화

 



  /* 타이머 생성 */
  struct snd_timer *timer;
  struct snd_timer_id tid = {
         .dev_class = SNDRV_TIMER_CLASS_CARD,
         .dev_sclass = SNDRV_TIMER_SCLASS_NONE,
         .card = card->number,
         .device = 0,
         .subdevice = 0,
  };
 
  int err = snd_timer_new(card, "MyTimer", &tid, &timer);
  timer->private_data = chip;
  timer->hw = my_timer_hw;
  strcpy(timer->name, "My Hardware Timer");
 
  /* 타이머 HW 정의 */
  static struct snd_timer_hardware my_timer_hw = {
         .flags = SNDRV_TIMER_HW_AUTO,
         .resolution = 1000000,   /* 1us (나노초 단위) */
         .ticks = 1000000,
         .open = my_timer_open,
         .close = my_timer_close,
         .start = my_timer_start,
         .stop = my_timer_stop,
  };
 

 

 

ALSA Timer API는 사운드 카드의 하드웨어 인터럽트나 시스템 클럭을 활용하여 정밀한 시간 간격으로 이벤트를 발생시키는 메커니즘입니다. 주로 MIDI 시퀀싱, 오디오 스트리밍의 동기화, 그리고 커널 내부의 주기적인 작업을 처리할 때 사용됩니다.

오디오 엔지니어링 관점에서 이 API는 단순한 '타이머' 그 이상의 의미를 갖습니다.

 

 

1. ALSA Timer의 핵심 구조

ALSA 타이머 시스템은 크게 세 가지 계층으로 나뉩니다.

     (1)  Timer Hardware (Source): 실제 클럭을 제공하는 하드웨어입니다. (예: 시스템 타이머, 사운드 카드의 하드웨어 인터럽트, 외부 클럭 등)

     (2)  Timer Interface (Backend): 하드웨어를 제어하고 추상화하는 커널 내부 인터페이스입니다.

     (3)  Timer Instance (Frontend): 애플리케이션이나 다른 커널 모듈이 타이머를 사용하기 위해 생성한 객체입니다.

 

 

2. 주요 개념 및 용어

       Resolution (해상도): 타이머가 틱(Tick)을 발생시키는 최소 단위입니다. 나노초(ns) 단위까지 설정 가능하지만 하드웨어 성능에 의존합니다.

       Tick (틱): 타이머가 한 번 '울리는' 이벤트입니다.

       Ticks per Interrupt: 한 번의 하드웨어 인터럽트가 발생할 때 처리할 타이머 틱의 개수를 설정할 수 있습니다.

 

 

3. 커널 드라이버에서의 구현 (정의 및 등록)

사운드 카드 드라이버(예: i.MX8M SAI 드라이버)가 자체적인 타이머를 제공해야 할 경우, struct snd_timer를 생성하고 등록해야 합니다.

 

 

 

4. 사용자 공간(User-space)에서의 활용

애플리케이션은 /dev/snd/timer 장치 파일을 통해 타이머에 접근합니다. alsa-lib을 사용하면 다음과 같은 흐름으로 동작합니다.

  1. snd_timer_open(): 특정 타이머 장치를 엽니다.
  2. snd_timer_params(): 해상도(Resolution)와 틱 간격을 설정합니다.
  3. snd_timer_start(): 타이머를 구동합니다.
  4. poll()  or  read(): 타이머 틱이 발생할 때마다 알림을 받습니다.

 

 

5. 실무적 관점: ADSP-21569와의 동기화

사용자께서 진행 중인 i.MX8M Plus + ADSP-21569 환경에서는 ALSA Timer가 다음과 같이 활용될 수 있습니다.

       System Clock Sync: SoC의 시스템 타이머를 기준으로 DSP의 오디오 처리를 동기화할 때 사용합니다.

       MIDI 시퀀싱: DSP 내부에서 돌아가는 MIDI 신디사이저가 있다면, ALSA Timer를 통해 정확한 박자(Tempo)를 유지합니다.

       Latency 측정: 오디오 패킷이 전송되는 주기와 실제 타이머 틱 사이의 오차를 계산하여 스트리밍 버퍼의 안정성을 평가합니다.

 

 

6. 시스템 성능과 타이머 (주의사항)

       High Resolution Timers (HRT): 최신 리눅스 커널은 SNDRV_TIMER_GLOBAL_SYSTEM 하에 고해상도 시스템 타이머를 제공합니다. 하드웨어 타이머가 별도로 없다면 이 글로벌 타이머를 사용하는 것이 가장 정밀합니다.

       CPU 부하: 타이머 해상도를 너무 높게(예: 수 마이크로초 단위) 설정하면 빈번한 인터럽트로 인해 i.MX8M Plus의 CPU 부하가 급증하여 오디오 끊김(XRUN)이 발생할 수 있습니다.

 

요약

ALSA Timer API는 오디오 데이터의 흐름과 시간의 흐름을 동기화하는 기준점입니다. 드라이버 레벨에서 snd_timer_notify()를 통해 이벤트를 알리고, 애플리케이션은 이를 받아 정확한 시점에 작업을 수행합니다.

 

 

 

 

  6.2  PCM Timer 통합

 

PCM 서브시스템은 자동으로 period elapsed 타이밍을 타이머 이벤트로 변환합니다. 사용자 공간은 /dev/snd/timer를 열고 PCM 타이머에 연결하여 정밀한 동기화를 구현할 수 있습니다.

 

 

  6.3 특정 하드웨어 인터럽트를 ALSA Timer 소스로 등록

 

특정 하드웨어 인터럽트(예: 외부 DSP의 Ready 신호나 SoC의 타이머 인터럽트)를 ALSA Timer 소스로 등록하려면, 드라이버에서 snd_timer 객체를 생성하고 하드웨어의 인터럽트 서비스 루틴(ISR) 내에서 snd_timer_interrupt()를 호출하여 틱(Tick)을 발생시켜야 합니다.

i.MX8M Plus와 외부 하드웨어 간의 동기화를 가정한 구체적인 드라이버 구현 구조를 단계별로 설명해 드릴게요.

 

 

1. 하드웨어 타이머 구조체와 Ops 정의

우선 하드웨어 타이머를 제어하기 위한 콜백 함수(snd_timer_hardware)를 정의해야 합니다.

 

 

2. 하드웨어 인터럽트 핸들러 (핵심)

실제 하드웨어 인터럽트가 발생했을 때 ALSA 타이머 시스템에 "틱이 발생했다"고 알려주는 부분입니다.

 

 

3. 타이머 객체 생성 및 등록

드라이버의 probe 함수 내에서 타이머를 시스템에 등록합니다.

 

 

4. 실무적 활용 포인트 (DSP 엔지니어 관점)

  1. 정밀한 동기화: 만약 외부 ADSP-21569에서 "데이터 한 블록 처리가 끝났다"는 신호를 GPIO 인터럽트로 i.MX8M Plus에 준다면, 위 코드를 통해 ALSA Timer 틱을 발생시킬 수 있습니다. 사용자 공간의 MIDI 시퀀서나 오디오 분석 툴은 이 틱에 맞춰 연산을 동기화할 수 있습니다.
  2. 해상도 설정: 하드웨어 인터럽트 주기가 일정하다면 .resolution 필드에 정확한 나노초 값을 입력해야 합니다. 예를 들어  오디오에서 $128\text{ samples}$마다 인터럽트가 발생한다면, $\frac{128}{48000} \approx 2.66\text{ms}$가 됩니다.
  3. 병목 주의: 인터럽트가 너무 빈번하면(예:  이하) 시스템 전체가 ISR 처리에 매몰되어 오디오 끊김이 발생할 수 있으므로, 적절한 버퍼 사이즈와 인터럽트 주기의 트레이드오프가 필요합니다.

 

 

다음 단계 제언

하드웨어 인터럽트를 타이머로 승격시키는 방법까지 이해하셨다면, 이제 "이 타이머를 사용하여 사용자 공간 앱과 드라이버 간에 어떻게 오디오 지연(Latency)을 측정하는지" 혹은 "ALSA 시퀀서(Sequencer) 인터페이스와 이 타이머를 연결하는 방법"에 대해 알아보는 것은 어떨까요?

 

 

 

 

'Embedded : : Linux > : : ALSA' 카테고리의 다른 글

[ALSA] 8. Compress Offload  (0) 2026.03.11
[ALSA] 7. HW Dep (Hardware Dependent)  (0) 2026.03.11
[ALSA] 5. MIDI & Raw MIDI  (0) 2026.03.11
[ALSA] 4. Control (Mixer) 인터페이스  (0) 2026.03.10
[ALSA] 3. PCM 서브시스템  (0) 2026.03.10