一、概述
ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構。
首先來了解一下,alsa架構的組成部分以及它們的作用。
Native ALSA Application:tinyplay/tinycap/tinymix,這些用戶程序直接調用 alsa 用戶庫接口來實現播放、錄音、控制。
ALSA Library API:alsa 用戶庫接口,常見有 tinyalsa、alsa-lib。
ALSA CORE:alsa 核心層,向上提供邏輯設備(PCM/CTL/MIDI/TIMER/…)系統調用,向下驅動硬件設備(Machine/I2S/DMA/CODEC)。
ASoC CORE:asoc 是建立在標准 alsa core 基礎上,為了更好支持嵌入式系統和應用於移動設備的音頻 codec 的一套軟件體系。
Hardware Driver:音頻硬件設備驅動,由三大部分組成,分別是 Machine、Platform、Codec
二.ALSA設備文件結構
在ubuntu系統中,看一下alsa設備的文件結構:
cd /dev/snd
ls -l
crw-rw----+ 1 root audio controlC0 crw-rw----+ 1 root audio midiC0D0 crw-rw----+ 1 root audio pcmC0D0c crw-rw----+ 1 root audio pcmC0D0p crw-rw----+ 1 root audio pcmC0D1p crw-rw----+ 1 root audio seq crw-rw----+ 1 root audio timer
可以看到以下設備文件:
controlC0 --> 用於聲卡的控制,例如通道選擇,混音,麥克風的控制等
midiC0D0 --> 用於播放midi音頻
pcmC0D0c --〉 用於錄音的pcm設備
pcmC0D0p --〉 用於播放的pcm設備
seq --〉 音序器
timer --〉 定時器
其中,C0D0代表的是聲卡0中的設備0,pcmC0D0c最后一個c代表capture,pcmC0D0p最后一個p代表playback,這些都是alsa-driver中的命名規則。從上面的列表可以看出,我的聲卡下掛了6個設備,根據聲卡的實際能力,驅動實際上可以掛上更多種類的設備,在include/sound/core.h中,定義了以下設備類型:
#define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0)
#define SNDRV_DEV_CONTROL ((__force snd_device_type_t) 1)
#define SNDRV_DEV_LOWLEVEL_PRE ((__force snd_device_type_t) 2)
#define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)
#define SNDRV_DEV_PCM ((__force snd_device_type_t) 0x1001)
#define SNDRV_DEV_RAWMIDI ((__force snd_device_type_t) 0x1002)
#define SNDRV_DEV_TIMER ((__force snd_device_type_t) 0x1003)
#define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)
#define SNDRV_DEV_HWDEP ((__force snd_device_type_t) 0x1005)
#define SNDRV_DEV_INFO ((__force snd_device_type_t) 0x1006)
#define SNDRV_DEV_BUS ((__force snd_device_type_t) 0x1007)
#define SNDRV_DEV_CODEC ((__force snd_device_type_t) 0x1008)
#define SNDRV_DEV_JACK ((__force snd_device_type_t) 0x1009)
#define SNDRV_DEV_LOWLEVEL ((__force snd_device_type_t) 0x2000)
通常,我們更關心pcm和control這兩種設備。
三. 驅動代碼的文件結構