Linux ALSA驱动:框架简介(一)
一、概述
ALSA,全称是Advanced Linux Sound Architecture,是Linux中提供声音设备驱动的内核组件,应用可以通过ALSA接口实现音频播放、录音、设备通路控制、音量控制、通话等功能。
在 Linux 内核设备驱动层,ALSA 提供了 alsa-driver
,在应用层,ALSA 为我们提供了 alsa-lib,故在其支持下,Linux 应用程序只需要调用 alsa-lib 提供的 API,即可完成对底层音频硬件的控制。linux内核中ALSA的软件结构如下:

ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序只需要调用alsa-lib提供的API就可以完成对底层硬件的操作。
在alsa-driver中主要为以下两部分:
ALSA CORE:核心层,提供逻辑设备供用户空间访问。向上提供逻辑设备(PCM、CTL、MIDI、TIMER…)系统调用,向下驱动硬件设备(Machine、I2S、DMA、CODEC)。
ASoC Driver: 音频硬件设备驱动,由三大部分组成,分别是 Machine Driver、Platform Driver和Codec Driver。
二、ALSA ASoc
ASoC 把嵌入式设备的音频系统同样分为 3 大部分,Machine,Platform 和 Codec。
Machine:是指某一款机器,每个 Machine 上的硬件实现可能都不一样,CPU 不一样,Codec 不一样,音频的输入、输出设备也不一样。Machine 为 CPU、Codec、输入输出设备提供了一个载体,可以认为是 Platform 和 Codec 之间的粘合剂。Machine Driver则负责处理机器特有 Machine control。
Platform:主要作用是完成音频数据的管理,通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。实际上,把 Platform 认为是某个 SoC 更好理解。Platform Driver包含了该 SoC 平台的音频 DMA 和音频接口的配置和控制(I2S,PCM 等)。
Codec: 字面上的意思就是编解码器,Codec 里面包含了 I2S 接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM) 和多个输出(耳机、喇叭、听筒,Line-out)。
三、ALSA 设备文件结构
Linux 系统下看到的设备文件结构如下:
从上面能看到有如下设备文件:
comprC0D11 --> compress设备,用于compress播放
hwC0D10 -->. hwdep设备,用于对dsp的相关操作
controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克控制,音量加减,开关等
pcmC0D0c --> 用于录音的pcm设备
pcmC0D0p --> 用于播放的pcm设备
timer --> 定时器
//有些设备也会有
seq --> 音序器
其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。根据声卡的实际能力,驱动实际上可以挂上更多种类的设备,在include/sound/core.h中,定义了以下设备类型:
/* type of the object used in snd_device_*()
* this also defines the calling order
*/
enum snd_device_type {
SNDRV_DEV_LOWLEVEL,
SNDRV_DEV_INFO,
SNDRV_DEV_BUS,
SNDRV_DEV_CODEC,
SNDRV_DEV_PCM,
SNDRV_DEV_COMPRESS,
SNDRV_DEV_RAWMIDI,
SNDRV_DEV_TIMER,
SNDRV_DEV_SEQUENCER,
SNDRV_DEV_HWDEP,
SNDRV_DEV_JACK,
SNDRV_DEV_CONTROL, /* NOTE: this must be the last one */
};
通常,我们更关心的是pcm和control这两种设备。