Linux音频驱动-ALSA概述
来源:互联网 发布:乳胶床垫 知乎 编辑:程序博客网 时间:2024/06/11 13:15
概述
ALSA(Advanced Linux Sound Architecture)是linux上主流的音频结构,在没有出现ALSA架构之前,一直使用的是OSS(Open Sound System)音频架构。关于OSS的退出以及ALSA的出现,可以看 Linux音频驱动-OSS和ALSA声音系统简介及其比较。
关于OSS和ALSA音频架构之间的区别图如下:
主要的区别就是在OSS架构下,App访问底层是直接通过Sound设备节点访问的。而在ALSA音频架构下,App是通过ALSA提供的alsa-lib库访问底层硬件的操作,不再访问Sound设备节点了。这样做的好处可以简化App实现的难度。
同样ALSA为了兼容OSS,ALSA提供了内核模块来模拟OSS声音驱动,所以在OSS架构下编写的App无需修改就可以在ALSA下运行。另外libaoos库也可以模拟OSS,无需OSS相关的内核模块。
音频子系统文件目录结构
音频系统的文件位于kernel/sound下:
root@test:~/k3.18/kernel/sound$ lsac97_bus.c atmel firewire Kconfig mips pci sh sound_firmware.c synthaoa core i2c last.c oss pcmcia soc sparc usbarm drivers isa Makefile parisc ppc sound_core.c spi主要的目录的介绍信息如下:
ALSA接口信息
proc接口
关于音频的proc接口,位于/proc/asound目录下:(以我的pc机为例,ubuntu12.04)
root@test:/proc/asound$ ls -l总用量 0dr-xr-xr-x 5 root root 0 11月 22 13:41 card0-r--r--r-- 1 root root 0 11月 22 13:41 cards-r--r--r-- 1 root root 0 11月 22 13:41 devices-r--r--r-- 1 root root 0 11月 22 13:41 hwdep-r--r--r-- 1 root root 0 11月 22 13:41 modulesdr-xr-xr-x 2 root root 0 11月 22 13:41 osslrwxrwxrwx 1 root root 5 11月 22 13:41 PCH -> card0-r--r--r-- 1 root root 0 11月 22 13:41 pcmdr-xr-xr-x 2 root root 0 11月 22 13:41 seq-r--r--r-- 1 root root 0 11月 22 13:41 timers-r--r--r-- 1 root root 0 11月 22 13:41 version如下是我手机的中的详细信息,会个pc机上的有差别。
test:/proc/asound # ls -ltotal 0dr-xr-xr-x 21 root root 0 2012-01-02 03:19 card0-r--r--r-- 1 root root 0 2012-01-02 03:19 cards-r--r--r-- 1 root root 0 2012-01-02 03:19 devices-r--r--r-- 1 root root 0 2012-01-02 03:19 pcmlrwxrwxrwx 1 root root 5 2012-01-02 03:19 xxx -> card0-r--r--r-- 1 root root 0 2012-01-02 03:19 timers-r--r--r-- 1 root root 0 2012-01-02 03:19 version相比的话,差不了多少,只是手机上没有一些功能而已。接下来详细介绍每个目录的大体含义。
card0: 其中0代表的是声卡号,每个声卡系统都存在这样的目录。
cards: 列出系统中可用的,注册的声卡。
root@test:/proc/asound$ cat cards 0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xf7d00000 irq 45devices: 列出系统card下所有注册的device,包括control,pcm,timer,seq等等。
root@test:/proc/asound$ cat devices 1: : sequencer 2: [ 0- 2]: digital audio capture 3: [ 0- 0]: digital audio playback 4: [ 0- 0]: digital audio capture 5: [ 0- 0]: hardware dependent 6: [ 0] : control 33: : timerhwdep: 列出所有硬件依赖(hardward dependent)的设备。此设备不是所有系统上都存在的。
modoles: 列出所有ALSA声卡驱动模块列表。
oss: 此目录下包含了ALSA用来模拟OSS的模拟仿真模块。
pcm: 列去出系统的cpm设备,包括capture和playback。
root@test:/proc/asound$ cat pcm 00-00: ALC662 rev1 Analog : ALC662 rev1 Analog : playback 1 : capture 100-02: ALC662 rev1 Analog : ALC662 rev1 Analog : capture 1seq: 此目录保护一些音序相关的信息。
timers: 描述一些ALSA相关的定时器信息。
version: 描述ALSA版本信息。
root@test:/proc/asound$ cat version Advanced Linux Sound Architecture Driver Version 1.0.25.
devices字段详细解释,会在后面更了解各个字段的含义。
有关proc的详细信息可以见:http://alsa.opensrc.org/Proc_asound_documentation#The_.2Fproc.2Fasound.2Foss.2F_directory
dev接口信息
关于sound的dev节点信息,位于/dev/snd下。
root@test:/dev/snd$ ls -l总用量 0drwxr-xr-x 2 root root 60 11月 16 10:47 by-pathcrw-rw---T+ 1 root audio 116, 6 11月 16 10:47 controlC0crw-rw---T+ 1 root audio 116, 5 11月 16 10:47 hwC0D0crw-rw---T+ 1 root audio 116, 4 11月 16 11:00 pcmC0D0ccrw-rw---T+ 1 root audio 116, 3 11月 22 14:45 pcmC0D0pcrw-rw---T+ 1 root audio 116, 2 11月 16 10:47 pcmC0D2ccrw-rw---T+ 1 root audio 116, 1 11月 16 10:47 seqcrw-rw---T+ 1 root audio 116, 33 11月 16 10:47 timer上述是sound下的常见的设备文件。首先看看各个字段的含义:
介绍写各个设备文件的功能:
control: 用于声卡的控制。
pcmC0D0c: 用于录音的pcm设备。
pcmC0D0p: 用于播音的pcm设备。
seq: 音序器接口。
timer: 定时器接口。
linux内核定义了如下的设备类型:
enum {SNDRV_DEVICE_TYPE_CONTROL,SNDRV_DEVICE_TYPE_SEQUENCER,SNDRV_DEVICE_TYPE_TIMER,SNDRV_DEVICE_TYPE_HWDEP,SNDRV_DEVICE_TYPE_RAWMIDI,SNDRV_DEVICE_TYPE_PCM_PLAYBACK,SNDRV_DEVICE_TYPE_PCM_CAPTURE,SNDRV_DEVICE_TYPE_COMPRESS,};通常更关心control和pcm设备。
代码入口分析
ALSA的proc接口信息的代码实现在kernel/sound/core/sound.c中。
大概的逻辑图如下:
下一步就需要分析是谁调用snd_register_device_for_dev函数来注册sound设备的。
以上只是列出了pcm和control设备的流程,并没有关心timer, seq等设备的流程。其实大致流程一致。
因为pcm,control,timer,seq等这些设备都在所谓的card下管理着。所以下面几节就从card,control,pcm三个方面入手。
0 0
- Linux音频驱动-ALSA概述
- linux ALSA音频驱动框架
- linux驱动:音频驱动(一)ALSA
- linux下ALSA音频驱动软件开发
- Linux ALSA音频驱动(二)
- Linux ALSA音频驱动(一)
- ALSA音频驱动研究
- alsa音频驱动相关
- ALSA驱动概述
- linux驱动:音频驱动(七)交叉编译alsa库及工具集alsa-utils
- linux音频alsa-uda134x驱动文档阅读之一(over-view)
- linux音频alsa-uda134x驱动文档阅读之二(时钟)
- linux音频alsa-uda134x驱动文档阅读之三(解码器)
- linux音频alsa-uda134x驱动文档阅读之六(插口)
- linux音频alsa-uda134x驱动分析之一(over-view)
- linux音频alsa-uda134x驱动分析之二(时钟)
- linux音频alsa-uda134x驱动分析之三(解码器)
- Linux ALSA 音频驱动框架-以MINI2440-UDA1341TS为例
- opencv_python学习笔记十一
- SQLite多次访问造成的error
- 完全备份、差异备份以及增量备份的区别
- caffe安装系列——安装GCC4.7和G++4.7并降级
- opencv_python学习笔记十二
- Linux音频驱动-ALSA概述
- JavaScript中call、apply、bind函数的用法
- word中图片较多时用的小技巧
- HTC Vive开发笔记之手柄震动 转
- 使用WITH AS提高性能简化嵌套SQL
- Android轻量缓存框架ASimpleCache
- 使用Mock对接口(controller层)进行单元测试
- php serialize序列化使用 和json效率对比
- C/C++系列——函数声明全解析