一、概述
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这两种设备。