WAVEHDR结构和waveOutPrepareHeader及waveOutWrite函数介绍

 

<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)
);
返回值有四种:

ValueDescription
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);
 }
}

posted @ 2013-05-29 11:12  MMLoveMeMM  阅读(2272)  评论(0编辑  收藏  举报