你知道Linux 音频设备驱动架构及应用编程?.doc
《你知道Linux 音频设备驱动架构及应用编程?.doc》由会员分享,可在线阅读,更多相关《你知道Linux 音频设备驱动架构及应用编程?.doc(11页珍藏版)》请在三一文库上搜索。
1、你知道Linux 音频设备驱动架构及应用编程?最早出现在Linux上的音频编程接口是OSS(Open Sound System),它由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口。OSS出现的历史相对较长,这些内核模块中的一部分(OSS/Free)是与Linux内核源码共同免费发布的,另外一些则以二进制的形式由4Front Technologies公司提供。由于得到了商业公司的鼎力支持,OSS已经成为在Linux下进行音频编程的事实标准,支持OSS的应用程序能够在绝大多数声卡上工作良好。虽然OSS已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,ALSA(Adv
2、anced Linux Sound Architecture)恰好弥补了这一空白,它是在Linux下进行音频编程时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一组内核驱动程序模块之外,还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些。ALSA的主要特点有:1)支持多种声卡设备2)模块化的内核驱动程序3)支持SMP和多线程4)提供应用开发函数库5)兼容OSS应用程序ALSA和OSS最大的不同之处在于ALSA是由志愿者维护的自由项目,而OSS则是由公司提供的商业产品,因此在对硬件的适应程度上OSS要优
3、于ALSA,它能够支持的声卡种类更多。ALSA虽然不及OSS运用得广泛,但却具有更加友好的编程接口,并且完全兼容于OSS,对应用程序员来讲无疑是一个更佳的选择。两种音频编程接口驱动的组成如下:1) Linux OSS 音频设备驱动的组成、mixer 接口、dsp 接口及用户空间编程方法。2) Linux ALSA 音频设备驱动的组成、card 和组件管理、PCM 设备、control 接口、AC97 API及用户空间编程方法。1. 数字音频设备目前,手机、PDA、MP3 等许多嵌入式设备中包含了数字音频设备,一个典型的数字音频系统的电路组成为:嵌入式微控制器/DSP 中集成了PCM、IIS 或
4、AC97 音频接口,通过这些接口连接外部的音频编解码器即可实现声音的AD 和DA 转换,功放完成模拟信号的放大功能。音频编解码器是数字音频系统的核心,衡量它的指标主要有: 采样频率 采样的过程就是将通常的模拟音频信号的电信号转换成二进制码0 和1 的过程,这些0 和1 便构成了数字音频文件。如图17.2 中的正弦曲线代表原始音频曲线,方格代表采样后得到的结果,二者越吻合说明采样结果越好。采样频率是每秒钟的采样次数,我们常说的 44.1kHz 采样频率就是每秒钟采样44100 次。理论上采样频率越高,转换精度越高,目前主流的采样频率是48kHz。 量化精度 量化精度是指对采样数据分析的精度,比如
5、24bit 量化精度就是是将标准电平信号按照2 的24 次方进行分析,也就是说将图17.2 中的纵坐标等分为224 等分。量化精度越高,声音就越逼真。2. 音频设备硬件接口2.1 PCM 接口 针对不同的数字音频子系统,出现了几种微处理器或DSP 与音频器件间用于数字转换的接口。最简单的音频接口是PCM(脉冲编码调制)接口,该接口由时钟脉冲(BCLK)、帧同步信号(FS)及接收数据(DR)和发送数据(DX)组成。在FS 信号的上升沿,数据传输从MSB(Most Significant Bit)字开始,FS 频率等于采样率。FS 信号之后开始数据字的传输,单个的数据位按顺序进行传输,1 个时钟周
6、期传输1 个数据字。发送MSB 时,信号的等级首先降到最低,以避免在不同终端的接口使用不同的数据方案时造成MSB 的丢失。PCM 接口很容易实现,原则上能够支持任何数据方案和任何采样率,但需要每个音频通道获得一个独立的数据队列。2.2 IIS 接口 IIS 接口(Inter-IC Sound)在20 世纪80 年代首先被飞利浦用于消费音频,并在一个称为LRCLK(Left/RightCLOCK)的信号机制中经过多路转换,将两路音频信号变成单一的数据队列。当LRCLK 为高时,左声道数据被传输;LRCLK 为低时,右声道数据被传输。与PCM 相比,IIS 更适合于立体声系统。对于多通道系统,在同
7、样的BCLK 和LRCLK 条件下,并行执行几个数据队列也是可能的。2.3 AC97 接口 AC97(Audio Codec 1997)是以Intel 为首的五个PC 厂商Intel、Creative Labs、NS、Analog Device与Yamaha 共同提出的规格标准。与PCM 和IIS 不同,AC97 不只是一种数据格式,用于音频编码的内部架构规格,它还具有控制功能。AC97 采用AC-Link 与外部的编解码器相连,AC-Link 接口包括位时钟(BITCLK)、同步信号校正(SYNC)和从编码到处理器及从处理器中解码(SDATDIN 与SDATAOUT)的数据队列。AC97数据
8、帧以SYNC 脉冲开始,包括12 个20 位时间段(时间段为标准中定义的不同的目的服务)及16 位“tag”段,共计256 个数据序列。例如,时间段“1”和“2”用于访问编码的控制寄存器,而时间段“3”和“4”分别负载左、右两个音频通道。“tag”段表示其他段中哪一个包含有效数据。把帧分成时间段使传输控制信号和音频数据仅通过4 根线到达9 个音频通道或转换成其他数据流成为可能。与具有分离控制接口的IIS方案相比,AC97 明显减少了整体管脚数。PCM、IIS 和AC97 各有其优点和应用范围,例如在CD、MD、MP3 随身听多采用IIS 接口,移动电话会采用PCM 接口,具有音频功能的PDA
9、则多使用和PC 一样的AC97 编码格式。3. Linux OSS 音频设备驱动及应用编程3.1 OSS 驱动的组成 OSS 标准中有2 个最基本的音频设备:mixer(混音器)和DSP(数字信号处理器)。在声卡的硬件电路中,mixer 是一个很重要的组成部分,它的作用是将多个信号组合或者叠加在一起,对于不同的声卡来说,其混音器的作用可能各不相同。OSS 驱动中,/dev/mixer 设备文件是应用程序对mixer进行操作的软件接口。混音器电路通常由两个部分组成:输入混音器(input mixer)和输出混音器(output mixer)。输入混音器负责从多个不同的信号源接收模拟信号,这些信号
10、源有时也被称为混音通道或者混音设备。模拟信号通过增益控制器和由软件控制的音量调节器后,在不同的混音通道中进行级别(level)调制,然后被送到输入混音器中进行声音的合成。混音器上的电子开关可以控制哪些通道中有信号与混音器相连,有些声卡只允许连接一个混音通道作为录音的音源,而有些声卡则允许对混音通道做任意的连接。经过输入混音器处理后的信号仍然为模拟信号,它们将被送到A/D 转换器进行数字化处理。输出混音器的工作原理与输入混音器类似,同样也有多个信号源与混音器相连,并且事先都经过了增益调节。当输出混音器对所有的模拟信号进行了混合之后,通常还会有一个总控增益调节器来控制输出声音的大小,此外还有一些音
11、调控制器来调节输出声音的音调。经过输出混音器处理后的信号也是模拟信号,它们最终会被送给喇叭或者其它的模拟输出设备。对混音器的编程包括如何设置增益控制器的级别,以及怎样在不同的音源间进行切换,这些操作通常来讲是不连续的,而且不会像录音或者放音那样需要占用大量的计算机资源。由于混音器的操作不符合典型的读/写操作模式,因此除了open()和close()两个系统调用之外,大部分的操作都是通过ioctl()系统调用来完成的。与/dev/dsp 不同,/dev/mixer 允许多个应用程序同时访问,并且混音器的设置值会一直保持到对应的设备文件被关闭为止。DSP 也称为编解码器,实现录音(录音)和放音(播
12、放),其对应的设备文件是/dev/dsp 或/dev/sound/dsp。OSS 声卡驱动程序提供的/dev/dsp 是用于数字采样和数字录音的设备文件,向该设备写数据即意味着激活声卡上的D/A 转换器进行放音,而向该设备读数据则意味着激活声卡上的A/D 转换器进行录音。在从DSP 设备读取数据时,从声卡输入的模拟信号经过A/D 转换器变成数字采样后的样本,保存在声卡驱动程序的内核缓冲区中,当应用程序通过 read()系统调用从声卡读取数据时,保存在内核缓冲区中的数字采样结果将被复制到应用程序所指定的用户缓冲区中。需要指出的是,声卡采样频率是由内核中的驱动程序所决定的,而不取决于应用程序从声卡
13、读取数据的速度。如果应用程序读取数据的速度过慢,以致低于声卡的采样频率,那么多余的数据将会被丢弃(即overflow);如果读取数据的速度过快,以致高于声卡的采样频率,那么声卡驱动程序将会阻塞那些请求数据的应用程序,直到新的数据到来为止。在向DSP 设备写入数据时,数字信号会经过D/A 转换器变成模拟信号,然后产生出声音。应用程序写入数据的速度应该至少等于声卡的采样频率,过慢会产生声音暂停或者停顿的现象(即underflow)。如果用户写入过快的话,它会被内核中的声卡驱动程序阻塞,直到硬件有能力处理新的数据为止。与其它设备有所不同,声卡通常不需要支持非阻塞(non-blocking)的I/O
14、操作。即便内核OSS 驱动提供了非阻塞的I/O 支持,用户空间也不宜采用。无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),如无符号8 位、单声道、8KHz 采样率,如果默认值无法达到要求,可以通过ioctl()系统调用来改变它们。通常说来,在应用程序中打开设备文件/dev/dsp 之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。3.2 mixer 接口 int register_sound_mixer(struct file_operaTIons *fops, int dev); 上述函数用于注册1 个混音器,第1 个参数fops 即是文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 你知道Linux 音频设备驱动架构及应用编程? 知道 Linux 音频设备 驱动 架构 应用 编程
链接地址:https://www.31doc.com/p-3381739.html