发新话题
打印

在VC中如何播放大型WAV文件

在VC中如何播放大型WAV文件

  在多媒体软件的设计中经常要处理声音文件,用Windows提供的API函数sndPlaySound可

  以实现小型WAV文件的播放。但是当WAV文件大于可用内存时,sndPlaySound函数就不能

  进行播放,那么如何利用MCI播放大型音频文件呢?本文将介绍一种方法。

  Windows支持两种RIFF(resource interchange file format,“资源交互文件格式”)音

  频文件:MIDI的RMID文件和波形音频文件格式WAV文件,本文将介绍如何用MCI命令播放

  大型WAV文件。

  用sndPlaySound播放音频文件只需要一行代码。比如实现异步播放的方法为

  sndPlaySound("c:\windows\ding.wav",SND_ASYNC);

  由此可以看到,sndPlaySound的使用是很简单的。但是用sndPlaySound播放音频文件有

  一个限制,即整个音频文件必须全部调入可用的物理内存。因此应用sndPlaySound播放

  的音频文件相对较小,最大约100K。要播放大一些的音频文件(在多媒体设计中是经常要

  遇到的情况)需要使用MCI的功能。

  本文创建了一个Cwave类,可以处理播放音频的MCI命令,因为该类能够执行很多的MCI命

  令和建立了数据结构,所以只需要简单的成员函数(如OpenDevice, CloseDevice, Play

  和Stop)。在CWave类中抽象了特定的MCI命令和数据结构,只含几个简单的成员函数Ope

  nDevice, CloseDevice, Play和Stop。波形音频设备是一个复合设备,如果打开波形设

  备,然后打开并关闭每个波形元素,最后关闭波形设备,这样可以使得播放性能更好。

  调用Cwave::OpenDevice就可以打开波形设备,OpenDevice将MCI_OPEN命令传递给mciSe

  ndCommand函数,如果调用成功,就用数据结构MCI_OPEN_PARMS的wDeviceID成员返回波

  形设备的标识符,该标识符保存在一个供以后使用的私有数据成员中。

  一旦打开了Cwace对象,通过Cwace::Play播放WAV文件就就绪了,WAV文件名和一个窗口

  指针被传递给Play方法以便将MCI通知消息发送到制定的窗口。

  WAV文件的播放分为两步。首先要通过分配一个MCI_OPEN_PARMS结构并给所要播放的WAV

  文件设置lpstrElementName成员打开WAV文件。将该结构和MCI_OPEN传递给mciSendComm

  and,打开WAV文件并用MCI_OPEN_PARMS结构的wDeviceID成员返回元素标识符。

  第二步是命令波形音频设备播放WAV文件。分配了MCI_PLAY_PARMS结构并将dwCallback成

  员设置为窗口句柄。如果要同步播放音频波形文件,就增加MCI_WAIT标志并跳过窗口句

  柄。这样做会使应用程序在mciSendCommand函数返回之前等待WAV文件播放完毕。最可能

  的情况是异步播放大型WAV文件,可以象下面那样指定MCI_NOTIFY标志并设置dwCallbac

  k成员做到这一点。

  MCI_PLAY_PARMS mciPlayParms;

  MciPlayParms.dwCallback=(DWORD)pWnd->m_hWnd;

  DwResult=mciSendCommand(m_nDevice,MCI_PLAY,MCI_NOTIFY,

  (DWORD)(LPVOID)

TOP

发新话题