WINCE的混音器

来源:互联网 发布:cp1308写频软件 编辑:程序博客网 时间:2024/05/04 06:59

在CE音频设备中,混音器是有不同类型的,下面介绍一下:

1、软件混音器

Waveapi模块有软件混音器,有时也称为内核混音器。它能混合多个不同采样率的PCM,在CE 4.2中被加入。

软件混音器在启动时,为音频设备创建一个线程。这个线程负责接受应用的音频buffer,把它们放到混合的buffer中,再传给音频设备。这个过程中,软件混音器的工作有:

1、  把所有数据转换成16位的双声道格式

音频驱动需要支持16位的双声道驱动。如果硬件只支持单声道,而又想使用软件混音器。那么就要把双声道数据转换成单声道。应用把单声道数据放到堆中,软件混音器会把它复制成2个通道的音频数据,在驱动中再合并成一个声道输出。这不太合理,但是性能影响不大。

软件混音器只支持8、16位或者单、双声道的PCM格式数据。软件混音器不能处理压缩的数据,不能处理多通道PCM数据。如要用软件混音器播放这些数据,必须转换成它能够识别的格式。这通常在DShow或者ACM层已经做好。如果软件混音器发现数据不能识别,它会退出流程,通过waveOutOpen直接传递给设备驱动。这时,就要依赖驱动决定怎样处理。

2、  采样率转换,把所有数据和采样率,转换成它要的格式

采样率转换现在是5点FIR,质量和效率都不大好。软件混音器要进行采样率转换前,必须要知道音频设备的需求。

3、  提供每个流的gain控制

当应用程序调用waveOutSetVolume,传入一个句柄。软件混音器会处理这个调用,因此驱动是不关心这部分的。

4、  支持waveOutSetRate功能

2、WaveDev2的混音器

WaveDev2有自己的混音器来混合PCM流。这个混音器提供和软件混音器一样的基本功能,那为何还要提供一个新的混音器呢:

1、  WaveDev2开发时候,还没有waveapi的软件混音器

2、  WaveDev2混音器提供部分手机的特殊调用

3、  WaveDev2混音器有更好的算法,在驱动IST线程中运行,而不是独立的线程。这些能提高性能、电池寿命和响应速度。

WaveDev2的样例驱动也提供输入混音功能,但不是真正的混音。它让一个硬件输入流,转换采样率,再分离成多个输入流。

WaveDev2和内核混音器另一个区别是,内核混音器是私有代码,不能被OEM修改。WaveDev2的是OEM驱动一部分,可以被修改。

3、 Mixer函数

当2个混音器通过wave函数接收PCM音频流,这里调用mixer函数有些不一样。

Mixer函数属于上层函数,和Wave、ACM、TAPI等相似。作用是把底层的、音频相关的控制,暴露给应用层。Mixer函数包括mixerOpen、mixerClose等,MSDN描述:

http://msdn2.microsoft.com/en-us/library/ms705739.aspx,

所有mixer函数通过IOCTL_MIX_MESSAGE来控制的,音频驱动可以在此IoControl加入相应的代码,来实现mixer函数。

http://blogs.msdn.com/medmedia/archive/2007/01/12/what-do-you-mean-by-mixer.aspx

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lweiqi/archive/2009/05/01/4139652.aspx