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_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
[2]Archlinux上介绍ALSA的Wiki:https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
[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/

转载于:https://www.cnblogs.com/zys-simon/p/9196247.html

转载:Linux音频驱动-OSS和ALSA声音系统简介及其比较相关推荐

  1. Linux 音频驱动(五) ALSA音频驱动之PCM逻辑设备

    目录 1. 前言 2. PCM逻辑设备 2.1. 创建 PCM逻辑设备: 2.2. PCM逻辑设备文件操作函数集:snd_pcm_f_ops[] 2.3. Open PCM逻辑设备 2.4. Writ ...

  2. Linux 音频驱动

    Linux 音频驱动 硬件介绍 WM8960与IMX6ULL之间有两个通信接口:I2C和I2S 其中I2C用于配置WM8960 I2S用于音频数据传输 修改设备树文件 编写I2C子节点设备树 code ...

  3. STM32MP157驱动开发——Linux 音频驱动

    STM32MP157驱动开发--Linux 音频驱动 一.简介 1.CS42L51 简介 2.I2S总线 3.STM32MP1 SAI 总线接口 二.驱动开发 1.音频驱动 1)修改设备树 i2c 接 ...

  4. Linux 音频驱动(四) ASoC音频驱动之Machine驱动

    目录 1. 基本介绍 2. 源码分析 2.1. Machine数据结构 struct snd_soc_dai_link 3. 声卡 3.1. 数据结构struct snd_soc_card 3.2. ...

  5. linux 音频架构绕过,linux音频驱动架构

    1.linux音频驱动架构分为3部分组成:硬件无关层(核心层ALSA).板级音频数字接口层驱动(McASP.McBSP等).外部codes驱动 sound/soc/davinci/ti81xx-etv ...

  6. Linux 音频驱动(二) ASoC音频驱动之Platform驱动

    目录 1. 简介 2. 源码分析 2.1. CPU DAI 2.1.1. 数据结构struct snd_soc_dai_driver 2.1.2. 注册CPU DAI:snd_soc_register ...

  7. Linux音频驱动之二:Control接口的调用

    本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记 一. control接口说明 Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频 ...

  8. win10系统没声音 服务器,win10系统音频驱动正常但是没有声音的解决方法

    win10系统使用久了,好多网友反馈说win10系统音频驱动正常但是没有声音的问题,非常不方便.有什么办法可以永久解决win10系统音频驱动正常但是没有声音的问题,面对win10系统音频驱动正常但是没 ...

  9. Linux音频驱动整理

    典型的数字音频系统电路组成如图所示: 通过PCM. IIS 或 AC97 这些音频接口连接外部的音频编解码器即可实现声音的 AD 和 DA 转换,图中的功放完成模拟信号的放大功能.音频编解码器是数字音 ...

最新文章

  1. HTML5之Viewport详解
  2. 浏览器的渲染原理简介
  3. Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches
  4. VS2008创建dll,并使用dll
  5. stm32 外部8M晶振 改为12M的方法
  6. NOIP模拟赛20161016R2
  7. 拓端tecdat|R语言生态学模拟对广义线性混合模型GLMM进行功率(功效、效能、效力)分析power analysis环境监测数据
  8. PHP file_get_contents与file_put_contents
  9. python水仙花数的代码_Python水仙花数的编程代码如何写
  10. python将数据导入wps_使用python调用wps v9转换office文件到pdf
  11. 交大计算机软件学院,上海交通大学软件学院
  12. thymeleaf select 回显
  13. div+css静态网页设计——男女装商城-功能齐全(40页) HTML+CSS+JavaScript 大学生网店作品 商城网页设计作业模板 学生网页制作源代码下载
  14. 提示:The word is not correctly spelled 解决方法
  15. java 项目文件夹_java项目三大文件夹的区别(package,source folder,folder)
  16. 穷苦人民如何用移动固态配置unbutu22.04
  17. Windows Server 2008 域操作(创建域、加入域、创建普通用户、组策略管理设置)
  18. DFP算法_python
  19. 纯css制作烟花特效
  20. 基于数据思维的科学减肥_能量与营养

热门文章

  1. JavaScript时间加减、时间加一天、时间加一个月、时间加一年、时间戳转“yyyy-MM-dd HH:mm:ss”
  2. 不是我吓唬你,写不出这种代码,那就等着被leader开除吧
  3. android 信封打开动画,CSS3 信封开启的动画
  4. 阿哔,你飘了呀~ 大胆! 阿哔也是你叫的? 叫哔哥!
  5. 大数据哔哔集20210106 - Hadoop3.0有哪些新特性
  6. 金蝶kis商贸采购单商品代码_金蝶kis商贸版采购管理相关问题及解决方法2013
  7. MFC快捷键功能使用总结
  8. 获取小米手环的信息前期准备
  9. VUE用浏览器调用USB摄像头
  10. 经典的十种排序算法 C语言版