声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
一. 概述
由图1.1可以看出,用户空间的alsa-lib对应用程序提供统一的API接口,这样可以隐藏了驱动层的实现细节,简化了应用程序的实现难度。内核空间中,alsa-soc其实是对alsa-driver的进一步封装,他针对嵌入式设备提供了一些列增强的功能。本系列博文仅对嵌入式系统中的alsa-driver和alsa-soc进行讨论。
二. ALSA设备文件结构
$
$
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,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)
三. 驱动的代码文件结构