电脑处理的是离散的信息,而声音却是模拟信息。如果要让电脑能够处理声音信息,必须将声音离散化。将模拟信息换成数字音频信息,这一过程被称为采样。采样就是将连续的模拟音频电信号转换成离散的比特信息。采样的频率被称为采样率。
在Linux系统中,主要存在如下的音频设备文件。
l /dev/console:扬声器相关的设备文件。
l /dev/dsp:与声卡设备上的数字信号处理器(DSP)相关的设备文件,提供了数字采样和数字录音功能。声卡设备通过DSP实现模拟信号和数字信号的转换。向该设备写入数据将激活声卡上的数模转换器(D/A)播放声音。而向该设备读取数据,则会激活声卡上的模数转换器(A/D)进行录音操作。
由于声卡驱动的原因,在Linux系统中,应用程序只能以只读或只写方式打开/dev/dsp设备。某些声卡驱动可能支持以读写方式打开/dev/dsp设备文件,此时可以同时进行声音的播放和录音。
l /dev/audio:类似于/dev/dsp设备文件,兼容于Sun工作站上的音频设备。使用的编码方式是mu-law。如果声卡驱动程序提供了对/dev/audio的支持(可以查看/dev目录下是否存在audio这个设备文件),就可以使用cat命令来播放mu-law格式的音频文件。注:提供对/dev/audio的支持更多的是基于对兼容性的考虑。因此,在开发中尽量不要使用该设备文件,而应使用/dev/dsp。实际上/dev/dsp和/dev/audio是同一硬件的不同软件接口,不能同时使用这两个设备文件。
l /dev/mixer:/dev/mixer设备文件是声卡中混音器的软件接口。混音器的作用就是将多个声音信号组合或进行叠加,其包括两部分:输入混音器和输出混音器。对混音器的编程包括如何设置增益,以及如何在不同的音源之间进行切换。这些操作是非连续的,因此混音器的编程不符合一般设备操作中的读/写模式。大部分的操作是通过ioctl函数来完成的。/dev/mixer允许多个程序同时对其进行访问。注:如果程序中已经调用open函数打开了/dev/dsp设备文件,不必再通过调用open函数来打开/dev/mixer设备文件,可以直接使用打开/dev/dsp时获得的文件描述符对混音器进行操作。
l /dev/sequencer:用于提供对声卡中的波表合成器的支持,该设备主要用于计算机音乐软件中,在日常编程中很少用到。
在Linux中,可以通过对设备文件/dedv/console控制让扬声器发声,其实现主要是通过调用ioctl函数。具体形式为:
ioctl(fd, KIOCSOUND, (int) tone);
fd为打开扬声器后获得的文件描述符。而KIOCSOUND表示对扬声器音频进行控制(使用该宏需包含<linux/kd.h>头文件)。参数tone表示要输出的扬声器音频值,该数值是由主板上的时钟频率(1.19MHz)通过一定的转换得到的,其转换关系为:
要设置的音频值(tone) = 1 190 000/期望获得的音频值
控制扬声器发声的时间长短是通过usleep函数实现,此函数使程序休眠usec毫秒:
void usleep(unsigned long usec);