WINCE声音驱动模型概述 - 4

来源:互联网 发布:java开发常见难题 编辑:程序博客网 时间:2024/05/21 04:21

混音的处理

       如果要WINDOWS CE的声音驱动模型支持混音,则要考虑如下问题:

1)  声音设备是否支持硬件混音

2)  声音设备需要工作在同一种采样频率下

3)  声音设备要能够同时支持录音和放音操作

 

而声音的驱动要负责完成声音采集的混音和声音放音的混音。其基本原理如下:

1)  将声音设备设定在一个频率下,比如:44.1KHZ,16BIT

2)  驱动允许打开多个音频流,每个音频流可以允许不同的采样率,比如: (A8KHZ,8BIT    B: 44.1KHZ,16BIT)

3)  放音的混音在最后的数据准备阶段(即放入到DMA前),用合成算法将所有的流进行数学运算,得出声音设备采样频率下(44.1KHZ,16BIT)的数据。数据通过DMA发送到CODEC中。

4)  录音的混音操作,都是从声音设备采样频率下(44.1KHZ16BIT)下得到采样的基本数据,然后通过数学运算分配到不同的频率下的音频流上。

5)  要注意的就是合成的时候要注意数据不溢出;分开的时候要注意数据速率的匹配和数据宽度的匹配。

 

中断和DMA驱动模型

声音系统一般都使用DMA作为数据传输的基本手段,因此DMA的操作模型对于

声音子系统的处理有着特别关键的作用。DMA的声音操作一般都是用双BUFFER作为

数据缓冲(录和放)都如此,一个BUFFER在被DMA占用的时候,另一个BUFFER

就可以被CPU占用,从而提高效率。显而易见,声音子系统的硬件操作是一个典型的
生产者消费者模式,因此,对共享资源的控制就特别重要。

DMA的硬件实现,不同的CPU略有不同。有的嵌入式芯片做的简单,不支持DMA地址的链式连接,有的则支持,但不影响具体实现。他们相同的点是:

l         一般一个DMAN个子CHANNEL

l         每一个CHANNEL都可以互不干扰的独立运转或者停机,自有一个状态机

l         DMA使用一个总的DMA 中断通知CPU,然后由软件负责查找具体某个CHANNEL

 

如果一个系统中很多驱动都需要用到DMA,那么就需要一个DMA ENGINE来总

协调DMA的运作,否则就会出现驱动争用DMA的问题。如果只有一个驱动使用DMA系统,则实现起来的障碍会小不少。

双声道系统中的声音驱动,DMA运作都是采用两个通道独立完成录、放的操作,并且每个通道都采用双BUFFER的策略,来保证DMACPU可以近乎同时的工作,互不影响。而且,一个在高层支持多个流的声音驱动也要注意对DMA这个硬件设备的操作要保持互斥。

在实际驱动的实现过程中,这种双通道、双BUFFER的驱动有很多细节要注意,要注意处理好几大类关系:

1)  硬件 DMA和硬件CODEC之间的关系

在整个放音声音数据传输系统中有:

       APP buffer ßà DMA buffer ßà I2S(AC97) FIFO ßà CODEC

APP负责提供数据,DMA负责数据传输,其实就是要把数据搬运到类似I2S或者AC97间的FIFO中,I2S负责成帧传递数据,最后由CODEC还原。录音则反之。

一般来讲,I2SCODEC要在DMA启动前准备好,而启动DMAI2S的顺序,往往会导致一些数据的丢失,这是关注的一点。

 

2)  DMAAPP  buffer之间的关系

还原处理时: APP 往往提供很大的数据包,比如16K,DMA由于设计的需要,一般取到4K,就比较大了。

启动DMA开始工作的条件是:

---填充完毕两个DMA BUFFER

---I2S准备好

 

DMA完成搬运后,会产生DMA的中断,而在中断处理中,要注意一下问题:

---启动第二个BUFFER,继续让DMA工作,如果不能启动就要DMA停机了。

---CPU负责检查是否还有足够的数据给DMA,如果有,够填充几个DMA BUFFER

 

DMA停机的条件是:

---没有更多的BUFFER可供搬运

---强制停机

 

在实践过程中,要拿捏好DMA启动和停机的条件,因为驱动一般都是多线程运转的,一定要注意对DMA操作时的互斥,防止出现异常或者死锁。

 

另外,DMA BUFFER的大小,直接关系到采样的频率,对于一些实时应用很重要。比如:VOIP中需要20ms 的打包周期,就需要限制DMA BUFFER的大小,从而控制中断时间,及时为VOIP提供周期打包数据。

 

3)  DMACHANNEL之间的关系

如果同时启动录音和放音CHANNEL,那么在DMA的中断处理中要注意区分是谁的数据,并且要及时启动各自CHANNEL的第二个BUFFER,防止采集数据丢失或者放音停顿。