Linux 音频驱动 - OSS 和 ALSA 声音系统简介及其比较
概述
昨天想在 Ubuntu 上用一下 HTK 工具包来绘制语音信号的频谱图和提取 MFCC 的结果, 但由于前段时间把 Ubuntu 升级到 13.04, 系统的声卡驱动是 ALSA(Advanced Linux Sound Architecture, 高级 Linux 声音体系), 而不是 HTK 中所使用的 OSS(Open Sound System, 开放声音系统). 网上查阅了大半天, 按照 http://forum.ubuntu.org.cn/viewtopic.php?t=316792 中提供的方法用 OSS4 来替换 ALSA, 结果 OSS4 没替换成功, 而原来的 ALSA 也不好使了, 真坑爹啊! 到现在还没办法完全复原, 现在只能通过 alsamixer 来设置音量了, 系统的音量设置根本无法用, 而且声音设置中的输入设备和输出设备都是空的.(现在将系统升级到 13.10 版, 系统的音量设置可以用了, 哈哈)捣鼓了半天也没还原回来唉, 整个人都快崩溃了, 都是由于对 Linux 不熟悉才被虐至如此地步, 得恶补啊!!! 下面本文就主要介绍一下 OSS 和 ALSA, 并将二者进行比较.
在介绍 OSS 和 ALSA 之前, 先介绍一下音频设备的一些基础知识.
数字音频设备, 有时也称 codec,PCM,DSP,ADC/DAC 设备, 用来播放或录制数字化的声音. 它的指标主要有: 采样速率 (电话为 8K,DVD 为 96K),channel 数目(单声道, 立体声), 采样分辨率(8-bit,16-bit) 等.
mixer(混频器): 用来控制多个输入, 输出的音量, 也控制输入 (microphone,line-in,CD) 之间的切换.
synthesizer(合成器): 通过一些预先定义好的波形来合成声音, 有时用在游戏中声音效果的产生.
MIDI 接口: MIDI 接口是为了连接舞台上的 synthesizer, 键盘, 道具, 灯光控制器的一种串行接口.
OSS 开放声音系统简介
Open Sound System 是一个类 Unix 和 POSIX 兼容系统上一个可选的声音架构. OSSv3 是 Linux 下原始的声音系统并集成在内核里, 但是 OSSv4 在 2002 年 OSS 成为商业软件时它地位被 ALSA 所取代. OSSv4 在 2007 年又成为了开源软件, 4Front Technologies 以 GPL 协议发布了它的源码.
OSS(Open Sound System)是 unix 平台上一个统一的音频接口. 以前, 每个 Unix 厂商都会提供一个自己专有的 API, 用来处理音频. 这就意味着为一种 Unix 平台编写的音频处理应用程序, 在移植到另外一种 Unix 平台上时, 必须要重写. 不仅如此, 在一种平台上具备的功能, 可能在另外一个平台上无法实现. 但是, OSS 出现以后情况就大不一样了, 只要音频处理应用程序按照 OSS 的 API 来编写, 那么在移植到另外一个平台时, 只需要重新编译即可. 因此, OSS 提供了源代码级的可移植性.
同时, 很多的 Unix 工作站中, 只能提供录音与放音的功能. 有了 OSS 后, 给这些工作站带来了 MIDI 功能, 加上音频流, 语音识别 / 生成, 计算机电话(CT),JAVA 以及其它的多媒体技术, 在 Unix 工作站中, 同样可以享受到同 Windows,Macintosh 环境一样的音频世界. 另外, OSS 还提供了与视频和动画播放同步的音频能力, 这对在 Unix 中实现动画, 游戏提供了帮助.
在 Unix 系统中, 所有的设备都被统一成文件, 通过对文件的访问方式 (首先 open, 然后 read/write, 同时可以使用 ioctl 读取 / 设置参数, 最后 close) 来访问设备. 在 OSS 中, 主要有以下的几种设备文件:
/dev/mixer: 访问声卡中内置的 mixer, 调整音量大小, 选择音源.
/dev/sndstat: 测试声卡, 执行 cat /dev/sndstat 会显示声卡驱动的信息.
/dev/dsp,/dev/dspW,/dev/audio: 读这个设备就相当于录音, 写这个设备就相当于放音./dev/dsp 与 / dev/audio 之间的区别在于采样的编码不同,/dev/audio 使用μ律编码,/dev/dsp 使用 8-bit(无符号)线性编码,/dev/dspW 使用 16-bit(有符号)线形编码./dev/audio 主要是为了与 SunOS 兼容, 所以尽量不要使用.
/dev/sequencer: 访问声卡内置的, 或者连接在 MIDI 接口的 synthesizer.
OSS 为音频编程提供三种设备, 分别是 / dev/dsp,/dev/dspW 和 / dev/audio, 用户可以直接使用 Unix 的命令来放音和录音, 命令 cat /dev/dsp>xyz 可用来录音, 录音的结果放在 xyz 文件中; 命令 cat xyz>/dev/dsp 播放声音文件 xyz. 如果通过编程的方式来使用这些设备, 那么 Unix 平台通过文件系统提供了统一的访问接口. 程序员可以通过文件的操作函数直接控制这些设备, 这些操作函数包括: open,close,read,write,ioctl 等.
ALSA 高级 Linux 声音系统简介
高级 Linux 声音体系 (英语: Advanced Linux Sound Architecture, 缩写为 ALSA) 是 Linux 内核中, 为声卡提供的驱动组件, 以替代原先的 OSS(开放声音系统). 一部分的目的是支持声卡的自动配置, 以及完美的处理系统中的多个声音设备, 这些目的大多都已达到. 另一个声音框架 JACK 使用 ALSA 提供低延迟的专业级音频编辑和混音能力.
这个项目开始于为 1998 年 Gravis Ultrasound 所开发的驱动, 它一直作为一个单独的软件包开发, 直到 2002 年他被引进入 Linux 内核的开发版本(2.5.4-2.5.5). 从 2.6 版本开始 ALSA 成为 Linux 内核中默认的标准音频驱动程序集, OSS 则被标记为废弃.
ALSA 由许多声卡的声卡驱动程序组成, 同时它也提供一个称为 libasound 的 API 库. 应用程序开发者应该使用 libasound 而不是内核中的 ALSA 接口. 因为 libasound 提供最高级并且编程方便的编程接口. 并且提供一个设备逻辑命名功能, 这样开发者甚至不需要知道类似设备文件这样的低层接口. 相反, OSS/Free 驱动是在内核系统调用级上编程, 它要求开发者提供设备文件名并且利用 ioctrl 来实现相应的功能. 为了向后兼容, ALSA 提供内核模块来模拟 OSS, 这样之前的许多在 OSS 基础上开发的应用程序不需要任何改动就可以在 ALSA 上运行. 另外, libaoss 库也可以模拟 OSS, 而它不需要内核模块. 另外, ALSA 还包含插件功能, 使用插件可以扩展新的声卡驱动, 包括完全用软件实现的虚拟声卡. ALSA 提供一系列基于命令行的工具集, 比如混音器(mixer), 音频文件播放器(aplay), 以及控制特定声卡特定属性的工具.
ALSA API 主要分为以下几种接口:
控制接口: 提供灵活的方式管理注册的声卡和对存在的声卡进行查询.
PCM 接口: 提供管理数字音频的捕捉和回放.
原始 MIDI 接口: 支持 MIDI (Musical Instrument Digital Interface), 一种标准电子音乐指令集. 这些 API 提供访问声卡上的 MIDI 总线. 这些原始借口直接工作在 The MIDI 事件上, 程序员只需要管理协议和时间.
记时接口: 为支持声音的同步事件提供访问声卡上的定时器.
音序器接口: 一个比原始 MIDI 接口高级的 MIDI 编程和声音同步高层接口. 它可以处理很多的 MIDI 协议和定时器.
混音器接口: 控制发送信号和控制声音大小的声卡上的设备.
API 库使用逻辑设备名而不是设备文件. 设备名字可以是真实的硬件名字也可以是插件名字. 硬件名字使用 hw:i,j 这样的格式. 其中 i 是卡号, j 是这块声卡上的设备号. 第一个声音设备是 hw:0,0. 这个别名默认引用第一块声音设备并且在本文示例中一真会被用到. 插件使用另外的唯一名字. 比如 plughw:, 表示一个插件, 这个插件不提供对硬件设备的访问, 而是提供像采样率转换这样的软件特性, 硬件本身并不支持这样的特性.
OSS 与 ALSA 的优缺点比较
ALSA 是一个完全开放源代码的音频驱动程序集, 除了像 OSS 那样提供了一组内核驱动程序模块之外, ALSA 还专门为简化应用程序的编写提供了相应的函数库, 与 OSS 提供的基于 ioctl 的原始编程接口相比, ALSA 函数库使用起来要更加方便一些. 利用该函数库, 开发人员可以方便快捷的开发出自己的应用程序, 细节则留给函数库内部处理. 当然 ALSA 也提供了类似于 OSS 的系统接口, 不过 ALSA 的开发者建议应用程序开发者使用音频函数库而不是驱动程序的 API.Ubuntu 默认使用 ALSA 作为底层声音驱动, 程序则与 PulseAudio 交互, 这是一个很不错的方案.
下面来比较一下 OSS 和 ALSA 的优缺点:
(1)OSS 的优点(对用户来说)
在内核空间 (kernel space) 里面包含了一个透明软件混音器(vmix). 这样多个程序就可以同时使用声音设备而且没有任何问题.
这个混音器可以让你单独调节各个程序的音量.
对某些老声卡有着更好的支持比如创新 (Creative) 的 X-Fi.
声音程序的初始反应时间一般更好.
对使用 OSS 的应用程序接口 (API) 的程序有更好的支持, 很多程序都支持 OSS 的 API, 而不需要 ALSA 的模拟.
(2)OSS 的优点(对开发者来说)
清晰的 API 文档, 更易于使用.
支持用户空间的声音驱动.
可移植性强, OSS 也可以在 BSDs 和 Solaris 下运行.
本身可以跨平台, 可以更方便移植到新的操作系统.
(3)ALSA 的优点
ALSA 对 USB 音频设备支持更好, 而 OSS 的输出还在试验中, 输入还未实现.
ALSA 支持蓝牙声音设备.
ALSA 支持 AC'97 和 HDAudio dial-up soft-modems (比如 Si3055).
ALSA 对 MIDI 支持得更好, 但用 OSS 你只能通过软件合成器 (如 timidity 和 fluidsynth) 来使用 MIDI.
ALSA 对待机支持更好, 而用 OSS, 你需要在待机前使用 soundoff 来停止 OSS 驱动, 在恢复后使用 soundon 来启动 OSS.
OSS 的 jack 检测目前在某些 HDAudio-powered 主板上不能正常工作. 也就是说在某些型号的主板上, 你可能需要在插入耳机的时候手动关闭外置扬声器. 而 ALSA 没这个问题.
参考资料
[1]Archlinux 上介绍 OSS 的 Wiki:https://wiki.archlinux.org/index.php/OSS_(简体中文)
[2]Archlinux 上介绍 ALSA 的 Wiki:https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(简体中文)
[3]OSS-- 跨平台的音频接口简介: http://www.ibm.com/developerworks/cn/linux/l-ossapi/
[4]Linux ALSA 声卡驱动之一: ALSA 架构简介: http://blog.csdn.net/droidphone/article/details/6271122
[5]Linux ALSA 声卡编程简介: http://enmind.blog.163.com/blog/static/164138001201092334620355/
来源: http://www.bubuko.com/infodetail-2649803.html