我之所以钻研Linux内核,只想是知道为什么我的系统还是没有声音……
Linux音频系统架构问题由来已久……远远比你想像的复杂。如果你想理 清从读取音频文件到最终从你的扬声器中播放出来这一过程中所用到的技术之间 的关系的话,纸上的结构图足以像炸酱面一样混乱,而你根本找不到任何头绪。
Linux 音频系统简析
这是因为,音频系统本身就比其他架构更加复杂。OSI模型每一层都有自己的作用域和功能,每一层几乎不会有任何交集,所以你{jd1}不会碰到任何混乱情 况。但是,在Linux音频系统上,却上演着这样的事情:没有明确的底层,各种音频技术各自为政。Linux的音频系统架构有点像地壳构造,偶尔就地震一 下,要不就火山爆发一下,上层结构则要使劲遮掩发生的一切。
Open Sound Protocol(开放声音协议?),原本用来内核和声卡通信的(驱动),www.linuxidc.com但是现在却成了alsa的一个胶合层(也不错,驱动声卡)。alsa兼顾底层和 硬件通信,为应用程序提供api,即负责混音,又负责硬件资源调用,多声道支持,环绕立体声输出等,甚至还要负责解码(什么时候alsa负责mp3 解码了?我out了)。所以当众多发行版使用PulseAudio或者Gstreamer时候,错误就不断的发生了…
ALSA
输入: PulseAudio, Jack, GStreamer, Xine, SDL, ESD
输出: Hardware, OSS
首先,让我们从了解alsa(Advanced Linux Sound Architecture, 高级Linux音频架构)开始。alsa直接和内核通信,并提供音频接口功能以供调用。但是,似乎alsa做了“比当好一个驱动程序”更多的事情:为系统 混音,为其他程序提供音频输出输出接口,为程序员提供api。他的目标好像要同Windows的ASIO或者OS X的CoreAudio一样,作为一个底层而稳定的后台程序运行。
本来alsa是设计成为oss的继任者的,值得庆幸的是,oss并没有真的死亡,凭借着alsa的兼容层重生了。所以可以简单的把alsa理解为声 卡的驱动层。实际驱动声卡的还是oss。声卡需要加载前缀为snd_的内核驱动模块,以在发声事件时驱动声卡发声。这也就是你需要Linux声卡驱动的原 因,这也可能是你不出声音的原因…
幸运的是,大部分的发行版都已经自动配置好相关设备以及驱动模块,alsa负责提供api给应用程序,应用程序可以调用api发声。最初这个设计是 给oss用的~(当时大部分驱动都是如此),但是会引发声卡独占问题(即只有一个程序可以发声,其他程序只能进入队列等待)。
alsa需要一个软件部件监测声卡并管理声卡。当有两个或多个程序需要同时发声,alsa则进行软混音——如果你的声卡支持,则使用声卡硬混音。 alsa最多可以同时管理8路的声频硬件,还可以同时支持mid特性。当然这个特性要取决于你的计算机硬件,所以随着硬件的发展,这个特性不是显得那么重 要了。
alsa和其他驱动不同之处是它的可制定性。也正是因为高度的可制定性,导致Linux音频系统架构越来越复杂。通过配置文件(/usr /share/alsa/alsa.conf)你可以管理一切——不论是混音方式,输出设备选 择,采样率,比特深度,还是实时音效。
alsa因其透明性、高效性和灵活性使之成为 了Linux音频系统的标准,也成为了几乎其他所有的音频架构和硬件通信的桥梁。
PulseAudio
输入: GStreamer, Xine, ALSA
输出: ALSA, Jack, ESD, OSS
如果你认为让alsa当后台就万无一失,那可就大错特错了。alsa虽然可以管理硬件,但是软件层却是其力所不及的地方。
这就是pulse,连接软件和硬件,远程计算机和本地计算机。它可以像alsa那样处理本地音频流,可以更灵活的处理远程计算机的音频流并在本地发 声。因为其灵活性,可用性,已经被众多Linux发行版所采用(为什么arch还是alsa而不是pulse,囧)。
附加效果和alsa一样,高度的灵活性带来了高度的复杂性。但是似乎pulse的问题更为复杂,因为pulse是面向用户设计的,所以用户的错误配 置可能轻易的引起故障。所以就算是,系统也尽量不会让用户更改其配置文件。
当你使用面板上的音量调节工具调节音量时,实际上你调节的是个虚拟设备——你调节pulse的虚拟设备,pulse调节alsa,alsa反馈给 pulse,pulse再反馈给虚拟设备……(多纠结啊)
好像pulse没有给Linux音频系统带来什么增益?所以反对的声音不绝于耳(他们觉得和alsa相比就是重复造轮子?)。他没有使已有的操作起 来更简单(指alsa),也没有带来更好地音效(本子想要hifi效果?),但是它带来了几个非常重要的特性。首当其冲就是混音特性。
如果所有的程序都使用pulse,一切都将变得美好起来。开发者们不用再考虑系统复杂性,因为pulse是跨平台的。但正是因为如此,所以有这么多 其他的音频解决方案的主要原因之一。
不像alsa那样,pulse可以跨平台,运行在不同的操作系统上,包括POSIX标准的unix-like系统和微软的Windows。也就是说 呢,如果你写的程序使用pulse而不是alsa,那么移植起来会非常轻松。
事情其实并不简单,因为在Linux上,pulse依赖于alsa,pulse把自身模拟成输出设备,供alsa调用。这点有点和Jack相似,处 在alsa和桌面之间,使用管道来传输数据。
不同于jack,它不主动添加或删除音频源,所以你可以对所有输出的音频程序音量等进行分控,哈哈,至少用这个特性你可以让那些吵人的网站全部静音 (firefox静音吗?flashblock就好了嘛~)