OSS(Open Sound System)是unix平台上一个统一的音频接口。以前,每个Unix厂商都会提供一个自己专有的API,用来处理音频。这就意味着为一种Unix平台编写的音频处理应用程序,在移植到另外一种Unix平台上时,必须要重写。不仅如此,在一种平台上具备的功能,可能在另外一个平台上无法实现。但是,OSS出现以后情况就大不一样了,只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。因此,OSS提供了源代码级的可移植性。

同时,很多的Unix工作站中,只能提供录音与放音的功能。有了OSS后,给这些工作站带来了MIDI功能,加上音频流、语音识别/生成、计算机电话(CT)、JAVA以及其它的多媒体技术,在Unix工作站中,同样可以享受到同Windows、Macintosh环境一样的音频世界。另外,OSS还提供了与视频和动画播放同步的音频能力,这对在Unix中实现动画、游戏提供了帮助。

本文首先解释在音频编程时经常遇到的名词、设备文件的含义,然后分别在录音、播放、Mixer方面对OSS接口的使用方法进行介绍。由于OSS API十分丰富,因此在本文中只介绍那些最为常用的接口。对于OSS API的一个完整描述,可以参考[1]。

一、基础知识

数字音频设备(有时也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声道,立体声)、采样分辨率(8-bit,16-bit)。

mixer(混频器):用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD)之间的切换。

synthesizer(合成器):通过一些预先定义好的波形来合成声音,有时用在游戏中声音效果的产生。

MIDI 接口:MIDI接口是为了连接舞台上的synthesizer、键盘、道具、灯光控制器的一种串行接口。

在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兼容,所以尽量不要使用。

l /dev/sequencer:访问声卡内置的,或者连接在MIDI接口的synthesizer。

这些设备文件的设备编号见[1]。

二、音频编程

OSS为音频编程提供三种设备,分别是/dev/dsp,/dev/dspW和/dev/audio,前面已经提到了它们之间的区别。

用户可以直接使用Unix的命令来放音和录音,命令cat /dev/dsp >xyz可用来录音,录音的结果放在xyz文件中;命令cat xyz >/dev/dsp播放声音文件xyz。

如果通过编程的方式来使用这些设备,那么Unix平台通过文件系统提供了统一的访问接口。程序员可以通过文件的操作函数直接控制这些设备,这些操作函数包括:open、close、read、write、ioctl等。下面我们就分别讨论打开音频设备、放音、录音和参数调整。

1. 打开音频设备

1) 头文件定义

/*

* Standard includes

*/

#include

#include

#include

#include

/*

* Mandatory variables.

*/

#define BUF_SIZE 4096

int audio_fd;

unsigned char audio_buffer[BUF_SIZE];

2) 打开设备

if ((audio_fd = open(DEVICE_NAME, open_mode, 0)) == -1) {

/* Open of device failed */

perror(DEVICE_NAME);

exit(1);

}

open_mode有三种选择:O_RDONLY,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。

2. 录音

int len;

if ((len = read(audio_fd, audio_buffer, count)) == -1) {

perror("audio read");

exit(1);

}

count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。

3. 放音

放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。

注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。

另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。

4. 设置参数

设置采样格式

int format;

format = AFMT_S16_LE;

if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {

/* fatal error */

perror("SNDCTL_DSP_SETFMT");

exit(1);

}

if (format != AFMT_S16_LE) {

/* 本设备不支持选择的采样格式. */

}

在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:

int mask;

if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) == -1) {

/* Handle fatal error ... */

}

if (mask & AFMT_MPEG) {

/* 本设备支持MPEG采样格式 ... */}

设置通道数目

int channels = 2; /* 1=mono, 2=stereo */

if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {

/* Fatal error */

perror("SNDCTL_DSP_CHANNELS");

exit(1);

}

if (channels != 2)

{/* 本设备不支持立体声模式 ... */}

设置采样速率

int speed = 11025;

if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1) {

/* Fatal error */

perror("SNDCTL_DSP_SPEED");

exit(Error code);

}

if ( /* 返回的速率(即硬件支持的速率)与需要的速率差别很大... */ ) {

/* 本设备不支持需要的速率... */

}

音频设备通过分频的方法产生需要的采样时钟,因此不可能产生所有的频率。驱动程序会计算出最接近要求的频率来,用户程序要检查返回的速率值,如果误差较小,可以忽略,但误差不能太大。

三、Mixer编程

对Mixer的控制,包括调节音量(volume)、选择录音音源(microphone,line-in)、查询mixer的功能和状态,主要是通过Mixer设备/dev/mixer的ioctl接口。相应的,ioctl接口提供的功能也分为三类:调节音量、查询mixer的能力、选择mixer的录音通道。下面就分别介绍使用的方法:

下面的mixer_fd是对mixer设备执行open操作返回的文件描述符。

调节音量

应用程序通过ioctl的SOUND_MIXER_READ和SOUND_MIXER_WIRTE功能号来读取/设置音量。在OSS中,音量的大小范围在0-100之间。使用方法如下:

int vol;

if (ioctl(mixer_fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol) == -1) {

/* 访问了没有定义的mixer通道... */

SOUND_MIXER_MIC是通道参数,表示读microphone通道的音量,结果放置在vol中。如果通道是立体声,那么vol的最低有效字节为左声道的音量值,接着的字节为右声道的音量值,另外的两个字节不用。如果通道是单声道,vol中左声道与右声道具有相同的值。

查询mixer的能力

int mask;

if (ioctl(mixer_fd, SOUND_MIXER_READ_xxxx, &mask) == -1) {

/* Mixer 的没有此能力... */

}

SOUND_MIXER_READ_xxxx 中的xxxx代表具体要查询的内容,比如检查可用的mixer通道用SOUND_MIXER_READ_DEVMASK;检查可用的录音设备,用SOUND_MIXER_READ_RECMASK;检查单声道/立体声,用SOUND_MIXER_READ_STEREODEVS;检查mixer的一般能力,用SOUND_MIXER_READ_CAPS等等。所有通道的查询的结果都放在mask中,所以要区分出特定通道的状况,使用mask& (1 << channel_no)。

选择mixer的录音通道

首先可以通过SOUND_MIXER_READ_RECMASK检查可用的录音通道,然后通过SOUND_MIXER_WRITE_RECSRC选择录音通道。可以随时通过SOUND_MIXER_READ_RECSRC查询当前声卡中已经被选择的录音通道。

OSS建议把mixer的用户控制功能单独出来形成一个通用的程序。但前提是,在使用mixer之前,首先通过API的查询功能检查声卡的能力。在linux中,就有一个专门的mixer程序--aumix。

四、结束语

前面讨论的是OSS中一些最基本的内容,实际上OSS中还有很多高级的特性,比如在音频编程时十分重要的实时性问题,画面与声音的同步问题,这里都没有介绍。如果读者对这些特性感兴趣的话,可以进一步参考[1]。另外,在[2]中,还可以下载使用OSS接口的样例程序。

相关主题

Open Sound SystemTM Programmer's Guide, version 1.11, http://www.opensound.com

linux音频设备接口,OSS--跨平台的音频接口简介相关推荐

  1. rca接口_常用的音频接口及焊接方法

    1.TRS 小三芯/大三芯/大二芯等 实物图 TRS有三种尺寸: (1)6.3mm.(2)3.5mm(3)2.5mm 每个端点代表的意义: (1)TIP(尖端)=positive(正极) 热端,信号+ ...

  2. pyaudio usb playback_【雅马哈(YAMAHA) UR22C声卡价格,参数】steinberg UR22C 专业录音外置声卡编曲混音USB音频接口 2019升级版–音平商城...

    UR-C系列音频接口 全新UR-C系列音频接口全部使用USB Type-C接口 可为音乐人提供改进的速度和灵活性,可连接PC/Mac,更可直连iOS设备 主要特性 • 32bit/192kHz USB ...

  3. 音频重采样有什么用_最佳音频接口基本购买指南

    音频接口是计算机实现录音功能的媒介设备,用于将乐器和麦克风发出的声音转换为数字信息,以便计算机可以理解并存储在硬盘上.在播放音频时,接口将数字音频文件重新转换为模拟信号,然后用监听音箱或耳机播放出来. ...

  4. 2021年全球音频接口收入大约145.1百万美元,预计2028年达到171.2百万美元

    本文研究全球市场.主要地区和主要国家音频接口的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,音频接口销量.价格.收入和市场份额等. 针对过去五年(2017-2021)年的历史情况 ...

  5. 常用音频接口:TDM,PDM,I2S,PCM

    折腾: [整理]SoC CPU MEDIATEK MT8516详解 期间,看到T8516介绍中包含 麦克风语音输入控制和连接的音频产品中包含 I2Sx2(4 个频道).TDM(最多 8 个频道)和 P ...

  6. linux音频设备接口,linux音频设备驱动读书笔记

    在linux系统中,先后出现了音频设备的两种框架:OSS和ALSA. 针对不同的数字音频子系统,出现了几种微处理器或DSP与音频器件间用于数字转换的接口. 音频设备的硬件接口 (1)PCM接口. (2 ...

  7. 转载:Linux音频驱动-OSS和ALSA声音系统简介及其比较

    Linux音频驱动-OSS和ALSA声音系统简介及其比较 概述 昨天想在Ubuntu上用一下HTK工具包来绘制语音信号的频谱图和提取MFCC的结果,但由于前段时间把Ubuntu升级到13.04,系统的 ...

  8. Linux音频设备两种框架OSS和ALSA驱动

    在Linux中,先后出现了音频设备的两种框架OSS和ALSA,本节将在介绍数字音频设备及音频设备硬件接口的基础上,展现OSS和ALSA驱动的结构. 17.1-17.2节讲解了音频设备及PCM.IIS和 ...

  9. 音频接口简介(PDM/PCM/IIS/SLIMBUS)

    缩写释义 CAS:随路信令,语音和信令在同一路话路中传送的信令 CCS:共路信令,语音和信令分开传输 ASLA - Advanced Sound Linux Architecture OSS - 以前 ...

  10. 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

    一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...

最新文章

  1. 主题模型、LDA、LSA、LSI、pLSA
  2. ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群
  3. 中北大学计算机二级负责老师,导师信息#中北大学计算机与控制工程学院研究生导师介绍#秦品乐...
  4. SAP License:实施SAP Business One-企业获得了哪些业务价值
  5. mysql的游标处理_MySQL存储过程 游标 错误处理的示例代码
  6. Win10的 IntelliJ idea中log4j2控制台中文乱码的几种处理方法
  7. bean的生命周期——Spring对bean的管理(三)
  8. java8以及常见编程技术Api中文版手册
  9. Boost.Asio使用总结
  10. 常见电商项目的数据库表设计(MySQL版)
  11. linux查询文件夹大小
  12. 使用备份工具mysqldump备份数据库
  13. 在线文档 - 腾讯文档
  14. 一文看懂,互联网这30年!
  15. 【 js 基础 】【 源码学习 】 setTimeout(fn, 0) 的作用
  16. VS2017搭建linux开发环境
  17. 数字逻辑设计基础(何建新)第三章
  18. python中line的意思_关于python代码,line[:-1]的意思
  19. 计算机进制的转换(任意进制)详解
  20. 微信公众号模板消息和图文消息的区别

热门文章

  1. 联想g400从u盘启动计算机,联想g400怎么从u盘启动-联想g400设置u盘启动方法
  2. 腾讯扩容 php环境失效,腾讯云硬盘扩容挂载应该怎么办?
  3. [转载野猪的一篇文章] 设计模式--简单工厂模式在unity3d里面的使用
  4. phpmail通过qq发邮箱失败_PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件
  5. win7 matlab 7.0,win7环境下使用matlab7.0的方法
  6. webview防止跳转到浏览器
  7. jquery colorbox图片弹出效果制作
  8. js使用微信上传图片功能
  9. 让Firefox未载入图片显示边框
  10. java通过十字路口_如何正确通过十字路口 老司机教你怎么走