转载:点击打开链接
1 ALSA Overview
ALSA(Advanced Linux Sound Architecture(高级Linux声音体系)的缩写)是为声卡提供驱动的Linux内核组件,以替代原先的OSS(开放声音系统)。ALSA除了像OSS那样提供一组内核驱动程序模块以外,还专门为简化应用程序的编写提供了相应的库函数,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一点 [QW--我就是想知道怎么使用 ,嘿嘿]。
1.1 ALSA features
ALSA has the following significant features:
1.Efficient support for all types of audio interfaces, from consumer sound cards to professional multichannel audio interfaces. (支持多种声卡设备--QW--从通用音频卡到混合通道音频接口)
2.Fully modularized sound drivers. (模块化的内核驱动程序)
3.SMP and thread-safe design. (支持SMP和多线程)[SMP--多处理系统]
4.User space library (alsa-lib) to simplify application programming and provide higher level functionality. (提供应用开发函数库以简化应用程序开发)
5.Support for the older Open Sound System (OSS) API, providing binary compatibility for most OSS programs. (支持OSS API,兼容OSS应用程序)
1.2 ALSA子项目
ALSA具有更加友好的编程接口,并且完全兼容于OSS,对应用程序来讲无疑是一个更佳地选择。ALSA系统包括以下7个子项目,其中只有驱动包是必须的:
---------------- 驱动包alsa-driver
------------------开发包alsa-libs
------------------开发包插件alsa-libplugins
-------------------- 设置管理工具包alsa-utils
-------------------其他声音相关处理小程序包alsa-tools
-------------------特殊音频固件支持包alsa-firmware
--------------------OSS接口兼容模拟层工具alsa-oss.
alsa-driver指内核驱动程序,包括硬件相关的代码和一些公共代码,非常庞大。[QW--尼玛,辰汉说是商业机密,不给提供阿]
alsa-libs指用户空间的函数库,提供给应用程序使用,应用程序应包括头文件asoundlib.h。并使用共享库libasound.so。
alsa-utils包含一些基于ALSA的用于控制声卡的应用程序,如alsaconf(侦测系统中声卡并写一个适合的ALSA配置文件),aplay(基于命令行的声音文件播放),arecord(基于命令行的声音文件录制)等。[QW--测了N多遍话筒就是不好使啊,录音录制不了阿]
1.3 ALSA接口 [QW--这些接口都不是给用户使用的阿,都是给alsa-lib使用的,所以主要功夫还应该下在lib上啊]
目前ALSA内核提供给用户空间的接口有:
信息接口(proc/asound)
控制接口(dev/snd/controlCX):提供管理声卡注册和请求可用设备的通用功能
混音器接口(dev/snd/mixerCXDX)
PCM接口(dev/snd/pcmCXDX):管理数字音频回放(playback)和录音(capture)的接口[QW--现在我就是用的这个接口啊]
Raw迷笛接口(dev/snd/midiCXDX):支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。这些API提供对声卡上MIDI总线的访问。这个原始接口基于MIDI事件工作,由程序员负责管理协议以及时间处理。
音序器接口(dev/snd/seq)
定时器接口(dev/snd/timer):为同步音频事件提供对声卡上时间处理硬件的访问。
和OSS类似,上述接口也以文件的方式被提供,不同的是这些接口被提供给alsa-lib使用,而不是直接给应用程序使用的。应用程序最好使用alsa-lib或者更高级的接口。
1.4 ALSA体系结构
下图所示为ALSA声卡驱动与用户空间体系结构的简图,从中可以看出ALSA内核驱动与用户空间库及OSS之间的关系
[QW--此处缺图]
ALSA体系结构
1.5 ALSA-driver文件结构[QW--辰汉电子没有提供阿,说是机密阿]
从code文件夹中找到alsa-driver-1.0.23.tar.bz2,在linux下解压,我们可以得到alsa-driver-1.0.23文件夹,我们可以看到ALSA驱动文件的目录结构:
sound
/core
/oss
/seq
/oss
/include
/drivers
/mpu401
/op13
/opl4
/pcsp
/vx
/i2c
/other
/synth
/emux
/pci
/(cards)
/isa
/(cards)
/arm
/ppc
/sparc
/usb
/pcmcia/(cards)
/oss
下面我们来看一下各个目录的具体作用:
core目录
这个目录包含了中间层,ALSA的核心驱动。
core/oss
关于PCM和mixer的OSS模拟的模块保存在这个目录里面。Raw midi OSS模拟也被包含在ALSA rawmidi代码中,因为它非常小。音序器代码被保存在core/seq/oss目录里面
*core/ioctl32(老版本里面的)
这个目录包含32bit-ioctl到64bit架构(如x86-64,ppc64,sparc64)的转换。对于32bit和alpha的架构,他们是不被编译的。
core/seq
它和它的子目录主要是关于ALSA的音序器。它包含了音序器的core和一些主要的音序器模块如:snd-seq-midi,snd-seq-virmidi等等。它们仅仅在内核配置中当CONFIG_SND_SEQUENCER被设定的时候才会被编译。我们在使用的ALSA驱动中也没有使用。
core/seq/oss
包含了OSS音序器的模拟的代码。
core/seq/instr
包含了一些音序器工具层的一些模块。
include目录
这里面放的是ALSA驱动程序开放给用户空间,或者被其他不同目录引用的共同头文件。
Drivers目录
这个目录包含了不同架构的系统中的不同驱动共享的文件部分。它们是硬件无关的。在子目录里面,会放一些不同组件的代码,他们是根据不同的bus和cpu架构实现的。
i2c目录
这里面包含了ALSA的i2c组件。虽然LINUX有i2c的标准协议层,ALSA还是拥有它关于一些card的专用i2c代码,因为一些声卡仅仅需要一些简单的操作,而标准的i2c的API函数对此显得太过复杂了。
synth目录
它包含了synth(合成器)的中间层模块
pci目录
它和它的一些子目录文件负责PCI声卡和一些PCI BUS的上层card模块。
isa目录
它和它的一些子目录文件是处理ISA声卡的上层card模块。
arm,ppc和sparc目录
这里放置一些和芯片架构相关的一些上层的card模块。
usb目录
这里包含一些USB-AUDIO驱动。在最新版本里面,已经把USB MIDI 驱动也集成进USB-AUDIO驱动了。
pcmcia目录
PCMCIA卡,特别是PCCcard驱动会放到这里。CardBus驱动将会放到pci目录里面,因为API函数和标准PCI卡上统一的。
oss目录
和ALSA无关。