博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WAVEHDR结构和waveOutPrepareHeader及waveOutWrite函数介绍
阅读量:6359 次
发布时间:2019-06-23

本文共 2159 字,大约阅读时间需要 7 分钟。

 

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

转载地址:http://xfbma.baihongyu.com/

你可能感兴趣的文章
AS开发JNI步骤
查看>>
二分查找,php
查看>>
python面试题-django相关
查看>>
Python——eventlet.greenthread
查看>>
记大众点评之面试经历
查看>>
第三章:基本概念
查看>>
Jersey+mybatis实现web项目第一篇
查看>>
C++形参中const char * 与 char * 的区别
查看>>
espresso 2.0.4 Apple Xcode 4.4.1 coteditor 价格
查看>>
Object-C中emoji与json的问题
查看>>
linux 命令
查看>>
灾后重建
查看>>
Nothing 和 Is
查看>>
第一个sprint冲刺第三天
查看>>
周末web前端练习
查看>>
hdu 5754 Life Winner Bo 博弈论
查看>>
Overlay network 覆盖网络
查看>>
Linux之编译需要的文件变化时刻
查看>>
IntelliJ IDEA中怎么查看方法说明?
查看>>
mvn常用命令
查看>>