OSS(Open Sound System)是 unix 平台上一个统一的音频接口, 即只要音频处理应用程式按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。

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 <ioctl.h>

            #include <unistd.h>

            #include <fcntl.h>

            #include <sys/soundcard.h>

            /*

            * 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,这是知道何时停止录音的唯一方法。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!