2. 使用低级音频函数WaveX
下面将进入文章的主题。
2.1 概述
低层音频服务及重要的数据结构低级音频服务控制着不同的音频设备,这些设备包括WAVE、MIDI和辅助音频设备[2]。低级音频服务包括如下内容:(1)查询音频设备;(2)打开和关闭设备驱动程序;(3)分配和准备音频数据块;(4)管理音频数据块;(5)应用MMTIME结构;(6)处理错误。
2.2 重要消息及数据结构
使用低级音频函数之所以能够对各个声音数据块操作,要归功于Windows的消息映射,Windows在采集、播放完一个数据块之后就会发送有关的消息。播放声音涉及到的重要消息及触发条件如下:
MM_WOM_CLOSE:在一个波形声音输出设备关闭时发出,之后该设备句柄不再有效 MM_WOM_DONE:当给定的输出缓存播放完毕返回给应用程序,或者直接调用waveOutReset函数停止播放并重置管理器 MM_WOM_OPEN:当给定的波形声音输出设备被打开时
MOM_CLOSE:当MIDI输出设备关闭时 WOM_DONE:当留缓冲播放完毕并正被返回程序时发到MIDI输出回调函数 WOM_OPEN:当MIDI输出设备打开时
重要的数据结构:
波形数据格式 WAVEFORMAT/WAVEFORMATEX 波形数据缓冲区格式 WAVEHDR 音频输出设备性能 WAVEOUTCAPS
这些内容都定义在mmsystem.h头文件中,更为具体的信息请参阅MSDN。
2.3 wavex播放声音波形文件方法的大致流程
常用mmio函数:
mmioOpen( ) 打开一个RIFF文件 mmioDescend ( ) 进入块 mmioRead( ); 该取RIFF文件 mmioAscend ( ); 跳出块 mmioClose( ); 关闭PIFF文件
对于块来说,进入块和跳出块是配对的。
读取WAV文件的读取过程:
mmioOpen( ) 打开文件 ↓ mmioDescend ("WAVE") 进入"fmt"块 ↓ mmioRead( ) 读取WAVE文件格式信息 ↓ mmioAscend ( ) 跳出"fmt"块 ↓ mmioDescend ("data") 进入"data"块 ↓ mmioRead( ) 读取WAVE数据信息 ↓ mmioClose( ) 关闭文件。
输出WAV文件的过程:
WaveOutOpen () 打开一个输出设备 ↓ WaveOutPrepareHeader() 准备WAVE数据头。 ↓ WaveOutWrite() 将数据写入设备并开始播放 ↓ WaveOutReset() 停止播放并重置管理器 ↓ WaveOutClose() 并闭播放设备 ↓ WaveOutUnpareHeader() 清理用WaveOutPrepareHeader准备的Wave
|