<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 11025
void 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);
}
}