目录
IIS是飞利浦公司开发的一种用于数字音频设备之间进行数据传输的总线,IIS只负责音频数据的传输,对音频的控制需要另外的芯片来控制,一般声卡都会有IIS接口和控制接口,两者共同协作来完成声音数据的传输和控制。如图 11所示:
图 11 声音传输示意图
主要介绍数字声音的几个指标:
采样频率fs就是录音时每秒对声音信号的采样次数,播放时最好也以采样频率播放,否则声音听起来会变音。常见的采样频率有22.050kHz、44.100kHz、48.000kHz等。
量化位数指对声音采样结果用几位数据保存,这和声卡中的ADC的位数相关,常见的有8位、16位等。
分为单声道和双声道,双声道就是左右两个声道,又称为立体声,另外更高级的有5声道和7声道。
单声道声音采样如图 21所示,横轴表示时间,纵轴表示采样结果,蓝色线条表示声音的原始波形。
图 21 声音采样示意图
如图 31所示,WAV音频文件由3部分组成:头部区域、格式描述区域和数据区域。其中格式区域记录了音频的声道数、采样频率、和量化位数等信息,数据区域记录了声音的数据,这些数据是原始数据,没有经过压缩的。像mp3等格式的音频文件中的数据都是经过压缩的数据。
图 31 WAV文件格式
如图 32所示,为4种情况下WAV文件中音频数据的组织方式。
图 32 WAV声音数据组织方式
如图 41所示,在mini2440中,声卡的型号为UDA1341TS,和IIS接口相关的有5根线,还有另外3条线用于音频控制。
图 41 声卡连接图
CDCLK:声卡工作时钟,一般为采样频率的256、384、512倍,即256fs、384fs、512fs
I2SSCLK:数据串行时钟,数值为量化位数*声道数*采样频率。如果量化位数为16,声道数为2,则I2SSCLK=32fs
I2SLRCLK:左右声道切换频率,该数值应等于采样频率
I2SSDI:音频数据输入,即由声卡传输数据给2440,录音状态
I2SSDO:音频数据输出,即由2440传输数据给声卡,播放状态
控制接口:根据声卡的不同,接口也不同,比如有的是I2C接口,有的是L3接口,具体看声卡手册。控制接口主要控制声音的音量,是否静音,增益等。
播放和录音时,三个时钟频率要设置正确,否则没有声音或者声音失真。
SylixOS下的OSS音频驱动接口可以在SylixOS\system\device\sound\soundcard.h中查看,主要有几点需要注意:
播放和录音是通过读写/dev/dsp设备来实现的
音量、增益等控制是通过读写/dev/mixer设备来实现的
应用程序通过ioctl来进行参数设置、控制等操作,并且具体操作对应ioctl中的命令都在soundcard.h定义好了,比如:
设置量化位数是用"SNDCTL_DSP_SETFMT",设置采样频率是"SNDCTL_DSP_SPEED",设置音量是用"SOUND_MIXER_WRITE_VOLUME"等等。
1. CPU从上层拷贝音频数据到缓冲区,拷贝完成一个缓冲区后发送一个DMA传输请求,这时DMA开始传送刚刚拷贝好的缓冲区数据,同时CPU继续从上层拷贝音频数据到下一个缓冲区,如图 61所示。
图 61 CPU拷贝,DMA传输
2. CPU拷贝数据的速度是比DMA传送数据速度快的,所以当发生CPU要拷贝到的缓冲区和DMA当前正在处理的缓冲区重叠时,需要阻塞线程,这是通过信号量实现的,如图 62所示。
图 62 阻塞线程
3. 当DMA传送完成后产生中断,在中断处理程序中唤醒刚才阻塞的线程,CPU就可以继续拷贝数据到刚才DMA处理的缓冲区里了,如图 63所示。
图 63 唤醒线程
录音的流程和播放流程大体相似,只是先由DMA传送数据到缓冲区,然后由CPU拷贝缓冲区内容给上层应用程序。当CPU处理的缓冲区和DMA当前处理的缓冲区重合时,同样阻塞线程,直到DMA处理完后在中断中唤醒。
原文地址:http://11080845.blog.51cto.com/11070845/1926011