Linux内核工程导论——硬件:音频子系统

音频子系统

音频框架

音频设备是非常常用,但又最容易在linux下出现问题的设备之一。音频设备种类和芯片繁多,所以必须提供足够多的驱动,并且有内核有足够的驱动与设备的匹配能力。也正是由于多样性,内核必须向上提供一个统一的接口。于是就有了音频框架。

音频框架与其他框架一样,作用都是向下提供要求,要求每个音频驱动都必须要实现的结构体和函数,向上提供统一的操作,使得上层软件只需要调用固定的操作函数,识别固定的结构体就可以操作所有的音频设备。

以前内核中的音频框架为OSS(Open SoundSystem),后来Gentoo开发了用户空间的音频架构ALSA,到2.6又将其移动到内核,从此内核采用了ALSA架构,原来的OSS架构标记为废弃。

         ALSA向上提供了两种级别的抽象,内核开发者都可以调用,一种是alsa-lib,一种是alsa-soc。soc的是对slsa-lib的再封装。用户端的库也叫alsa-lib,但编译后叫libasound。Andriod还简化修改了这个库,形成了TinyAlsa库。更高级的音频封装还有SDL、OpenAL等。

音频接口

         音频接口有很多种,我们现在最常见的是HD Audio,其次是AC 97。其他常用的还有I2S、PCM。

         HDAudio是最新的标准,是2004年提出的,用来取代AC 97的。HD与AC 97声卡在使用上的最大不同是,HD Audio的音频接口是可以任意插的,任何一个音频接口,你可以把他配置为麦克风,也可以配置为音响。而AC 97是固定的,绿色的音响二级,粉色的麦克风,插错了是无法播放声音的。HD Audio还有一个很强大的功能,就是可以多路输出,例如一台电脑同时玩游戏和听音乐,能够配置让两组声音从不同的物理HD Audio插口输出(首先你得有多个插口,很多机器前面板是AC 97的,后面板是HD Audio的)。

         AC97开创双芯片模式,将音频的所有数字部分集成为一个芯片,所有模拟部分集成为一个芯片。HD Audio也是一样,但提高了能力。但输出也可以是数字的。HD的数字部分叫做Controller,里面包含一个或多个codec,codec是专门用来编解码的。因此大部分的驱动都是工作在这里。

音频驱动

         Linux把alsa驱动分为了3个层次:Machine、Platform和Codec。Machine驱动负责Platform和Codec之间的耦合。其中,codec部分内核不需要实现,都是厂商提供的,但是linux系统中设备驱动普遍采取内核模块的形式以源代码提供,所以常用的codec还是在内核中集成的。Linux对HD Audio的支持还不够完善,只有一个snd-hda-intel驱动,还经常出现问题。对于codec驱动,HD Audio的是snd-hda-codec,AC 97的是ac97_codec。

snd模块是最基本的alsa模块,被所有设备使用。snd-pcm-oss可以模拟oss pcm设备最新的数字部分都继承到SoC中,因此也有很多模块是soc的驱动。

音频设备

         Alsa框架规定了很多设备种类,在include/sound/core.h中定义。我们常见的设备有两种:MIDI、PCM音频。还有其他如定时器、时序器、混音器等。

MIDI是数字化乐器的通信标准,它记录和传输的不是具体的声音波形,而是操作乐器的指令,通过这个指令MIDI乐器就可以播放指定的音乐。在MIDI乐器上弹奏的音乐,也可以以MIDI指令的形式存储为文件由内核识别。这种设备家用较少,一般为专业音乐人员使用。

         PCM音频是家用的音响系统。PCM本身是一种脉冲调制方式,一般指模拟的音频信号。

音乐记录在PC上可以是模拟的(pcm文件),也可以是数字的(mp3等),但是在播放时,都需要转换为模拟的,然后输出到播放模拟音频信号的设备去播放。对应的录音设备也是一样。

现代计算机系统,一般存储在PC上的都是数字格式的,根据采样定理对模拟信号以高频率采样后可以获得与模拟信号可完全互相转化的数字格式的音频,然后再对这个完整的数字格式音频进行转化。我们经常听到有关无损音频,例如ape、flac格式的文件,还有有损的如mp3、mpeg等,都是针对这个数字格式而言的(由于未压缩的数字格式与模拟格式可以互相转化,所以也相当于针对模拟音乐而言),采用不同的压缩算法,有的根据语音的特点欺骗人耳,将人耳不能听到或者不敏感的声音区域删除,人耳无法分辨,但已经不是之前的音乐了。

还有一个比较重要的设备接口是Controller,Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频codec芯片中的多路开关,滑动控件等。对于Mixer(混音)来说,Control接口显得尤为重要,从ALSA 0.9.x版本开始,所有的mixer工作都是通过control接口的API来实现的。当然,这部分是HD Audio的东西,AC 97在ALSA中有兼容的实现。control可以用来控制声音的回放、捕捉、音量加强等。

 

 

你可能感兴趣的:(linux,linux,kernel,内核)