ALSA是Advanced Linux Sound Architecture 的缩写,目前是linux主流的音频体系架构。
参考网站:http://www.alsa-project.org/
内核空间,ALSA提供了ALSA Driver core,用户空间,ALSA提供了ALSA lib库,为用户程序提供统一的编程接口,简化应用程序编写的难度。
SOC(system on chip),片上系统即嵌入式系统,即表示硬件、又可以表示软件。针对SOC,在ALSA Driver core的基础上进行了封装和增强,形成ALSA SOC架构,简称ASOC。
ALSA架构把音频驱动分为三个部分:platform driver、codec driver、machine driver。
同一个platform和codec,由于硬件接法的不同,machine也会不一样。同一个platform上可以接各种codec,当codec改变时只需要移植codec driver和修改部分machine driver即可,不需要修改platform driver。同理,codec移植到不同的platform上时,codec driver也不需要修改。
2:ALSA代码文件结构
sound
/core
/oss
/seq
/ioctl32
/include
/drivers
/i2c
/synth
/emux
/pci
/(cards)
/isa
/(cards)
/arm
/ppc
/sparc
/usb
/pcmcia /(cards)
/oss
/soc
/codecs
core 该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分
core/oss 包含模拟旧的OSS架构的PCM和Mixer模块
core/seq 有关音序器相关的代码
include ALSA驱动的公共头文件目录,该目录的头文件需要导出给用户空间的应用程序使用,通常,驱动模块私有的头文件不应放置在这里
drivers 放置一些与CPU、BUS架构无关的公用代码
i2c ALSA自己的I2C控制代码
pci pci声卡的顶层目录,子目录包含各种pci声卡的代码
isa isa声卡的顶层目录,子目录包含各种isa声卡的代码
soc 针对system-on-chip体系的中间层代码
soc/codecs 针对soc体系的各种codec的代码,与平台无关
3:ALSA 设备文件结构
/dev/snd
crw-rw----+ 1 root audio 116, 8 2011-02-23 21:38 controlC0
crw-rw----+ 1 root audio 116, 4 2011-02-23 21:38 midiC0D0
crw-rw----+ 1 root audio 116, 7 2011-02-23 21:39 pcmC0D0c
crw-rw----+ 1 root audio 116, 6 2011-02-23 21:56 pcmC0D0p
crw-rw----+ 1 root audio 116, 5 2011-02-23 21:38 pcmC0D1p
crw-rw----+ 1 root audio 116, 3 2011-02-23 21:38 seq
crw-rw----+ 1 root audio 116, 2 2011-02-23 21:38 timer
controlC0用于声卡的控制,例如通道选择,混音,麦克风的控制等
midiC0D0 用于播放midi音频
pcmC0D0c用于录音的pcm设备
pcmC0D0p用于播放的pcm设备
seq 音序器
timer定时器
C0D0表示声卡0中的设备0,pcmC0D0p中的p表示playback,pcmC0D0c中的c表示capture
一个声卡设备可以实现挂载多个子设备,设备类型在include/sound/core.h文件里定义设备的类型如下:
typedef int __bitwise snd_device_type_t;
#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_COMPRESS
((__force snd_device_type_t) 0x100A)
#define SNDRV_DEV_LOWLEVEL
((__force snd_device_type_t) 0x2000)