<1> :WAVEHDR结构的介绍
根据MSDN说明文档
typedef struct { LPSTR lpData; //波形缓冲数据(传入首地址) DWORD dwBufferLength; //缓冲区长度 DWORD dwBytesRecorded; //指明录音时缓冲区容量 DWORD dwUser; //用户数据 DWORD dwFlags; //提供缓冲区标示 DWORD dwLoops; //循环次数 struct wavehdr_tag * lpNext; //预留,NULL DWORD reserved; //预留,0} WAVEHDR;
比如:
WAVEHDR waveHdr ={
0, 128, 0, 0, 0, 1, NULL, 0 }; //音频数据信息头其中lpData参数的数据获得方式:
char mute[128];
FillMemory(mute, 128, (BYTE)0x0E);//红色的数据即为将要填充播放缓冲区的数据,这里给出了一个音符.
常用来赋值的函数还有CopyMemory(*)等.
<2> : waveOutPrepareHeader函数:
这个函数在使用时,需要上传入上面的结构体,并且在使用前lpData, dwBufferLength, 和dwFlags三个参数必须在使用函数前设置好.
The lpData, dwBufferLength, and dwFlags members of the WAVEHDR structure must be set before calling this function (dwFlags must be zero).
MMRESULT waveOutPrepareHeader( HWAVEOUT hwo, //输出设备的句柄,这个句柄在设备打开函数waveOutOpen函数的第一个参数(传址)返回 LPWAVEHDR pwh, //即<1> 所说的结构体 UINT cbwh //<1>结构体的大小,一般为sizeof(WAVEHDR));
<3> : 将<1>,<2>设置好的数据发送到波形输出设备,即播放.
MMRESULT waveOutWrite( HWAVEOUT hwo, //输出设备句柄 LPWAVEHDR pwh, //<1>点所说数据 UINT cbwh //sizeof(WAVEHDR));返回值有四种:
Value | Description | |
---|---|---|
MMSYSERR_INVALHANDLE | Specified device handle is invalid. | |
MMSYSERR_NODRIVER | No device driver is present. | |
MMSYSERR_NOMEM | Unable to allocate or lock memory. | |
WAVERR_UNPREPARED | The data block pointed to by the pwh parameter hasn't been prepared. |
<4> : 综合上面和以前介绍的Audio部分,给出第一个播放音符的Demo :记住添加相关lib文件
#include <windows.h>
#include <stdio.h>#include<mmsystem.h>#define MUTE_LENGTH 128#define SAMPLE_RATE 11025void main(){ HANDLE hEvent = CreateEvent(NULL , false , false , TEXT("PCM WRITE")); HWAVEOUT hWaveOut; //波形音频输出句柄 char mute[MUTE_LENGTH]; //静音符号串 WAVEFORMATEX waveformat ={ WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 1, 8, 0 }; //设定波形音频的格式 WAVEHDR waveHdr ={ 0, MUTE_LENGTH, 0, 0, 0, 1, NULL, 0 }; //音频数据信息头 FillMemory(mute, MUTE_LENGTH, (BYTE)0x0E); //0x0E将会提到BEEP声,用静音符号填充0x80将为无声 waveHdr.lpData = mute; //初始化信息头指针 //打开音频设备 waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformat, (DWORD)hEvent, 0, CALLBACK_EVENT); //准备信息头 waveOutPrepareHeader(hWaveOut, &waveHdr, sizeof (WAVEHDR)); while(1) { //播放静音符号 waveOutWrite (hWaveOut, &waveHdr, sizeof (WAVEHDR)); printf("."); WaitForSingleObject(hEvent,INFINITE); }}