没有合适的资源?快使用搜索试试~ 我知道了~
首页linux ALSA.pdf
资源详情
资源评论
资源推荐

1 ALSA
1.1 架构简述
ALSA 是 Advanced Linux Sound Architecture 的缩写, 官网 : http://www.alsa-project.org.
在内核设备驱动层, ALSA 提供了 alsa-driver. 同时在应用层, ALSA 为我们提供了 alsa-lib, 应用
程序只要调用 alsa-lib 提供的 API, 即可以完成对底层音频硬件的控制.
从数据结构的组织层面来看, ALSA 用 Card 代表一个池子, Card 下面可以有一个或多个逻辑设
备 Device; 每个 Device 下面可以有其它细分设备(例如 PCM Device), 也可以不再继续细分
(例如 Control Device).

从硬件的角度来说, 简单来说, 可以认为一个 Card 对应一块板子, 一个 Device 则对应板子上
的一路通道.
例如假设一个 CPU 有 3 个 I2S, 然后外接了一块 WM8920 音频芯片, 该音频芯片有三路接口
AIF1、AIF2、AIF3. 那这样一块电路板就有一个 Card, 下面三个 Device (I2S1 – AIF1, I2S2 – AIF2,
I2S3 – AIF3).
当然, 一块板子上也可存在多个 Card, 这种情况下一般是把一类接口抽象为一个 Card. 例如所
有的 I2S 接口抽象为一路 Card, 所有的 PCM 接口抽象为一路 Card.
一个 Device 也可能只是单纯的软件层面的抽象, 并没有与具体的硬件对应. 因此我们通常称
Device 为逻辑设备.
1.2 设备节点介绍
/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, pcmC0D0c 最后一个 c 代表 capture, pcmC0D0p 最后一个 p 代表
playback,这些都是 alsa-driver 中的命名规则.
/proc/asound
dr-xr-xr-x 6 root root 0 Oct 8 00:04 card0
-r–r–r– 1 root root 0 Oct 8 00:04 cards
-r–r–r– 1 root root 0 Oct 8 00:04 devices
-r–r–r– 1 root root 0 Oct 8 00:04 modules
dr-xr-xr-x 2 root root 0 Oct 8 00:04 oss
-r–r–r– 1 root root 0 Oct 8 00:04 pcm
dr-xr-xr-x 2 root root 0 Oct 8 00:04 seq
-r–r–r– 1 root root 0 Oct 8 00:04 timers
-r–r–r– 1 root root 0 Oct 8 00:04 version
✓ cards : 可显示系统中存在多少个声卡
✓ card0 : 代表某个声卡
✓ devices : 可显示系统中存在多少个逻辑设备
/proc/asound/card0
该节点提供该 card 的一些 info.
-r–r–r– 1 root root 0 Oct 7 19:57 audiopci
dr-xr-xr-x 2 root root 0 Oct 7 19:57 codec97#0
-r–r–r– 1 root root 0 Oct 7 19:57 id
-r–r–r– 1 root root 0 Oct 7 19:57 midi0
dr-xr-xr-x 3 root root 0 Oct 7 19:57 pcm0c
dr-xr-xr-x 3 root root 0 Oct 7 19:57 pcm0p
dr-xr-xr-x 3 root root 0 Oct 7 19:57 pcm1p
/sys/class/sound/
lrwxrwxrwx 1 root root 0 Oct 7 20:27 card0
-> ../../devices/pci0000:00/0000:00:11.0/0000:02:02.0/sound/card0

……
1.3 card 的创建与注册
1.3.1 card 是什么
struct snd_card 可以说是整个 ALSA 音频驱动最顶层的一个结构, 整个声卡的软件逻辑结构开
始于该结构, 几乎所有与声音相关的逻辑设备都是在 snd_card 的管理之下, 声卡驱动的第一
个动作通常就是创建一个 snd_card 结构体.
1.3.2 数据结构
struct snd_card
一个 struct snd_card 用于描述一个声卡.
头文件 : include/sound/core.h
struct snd_card
Comment
int number
声卡编号, 内核支持创建多个声卡
…
struct list_head devices
记录该声卡下所有逻辑设备的链表
struct list_head controls
记录该声卡下所有的控制单元的链表
struct snd_info_entry *proc_root
一个声卡可以有多个 snd_info_entry, 每个 entry 代表/proc/asound/cardx/下面的一
个节点.
这些 entry 以树形结构组织, proc_root 是这个数的树根.
…
void *private_data;
声卡的私有数据,可以在创建声卡时通过参数指定数据的大小
剩余77页未读,继续阅读




安全验证
文档复制为VIP权益,开通VIP直接复制

评论0