WaveInOpen函数
waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。
函数介绍
编辑waveInOpen之原形为︰
MMRESULT waveInOpen( LPHWAVEIN phwi, UINT_PTR uDeviceID, LPWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwCallbackInstance, DWORD fdwOpen );
解述︰
- LPHWAVEIN phwi 为一指针,以指示返回输入设备。
- UINT_PTR uDeviceID 乃所用波形输入设备之ID。若此为 WAVE_MAPPER,系统则会自动寻找合适设备。
- LPWAVEFORMATEX pwfx ,指向波形声音格式数据类型(WAVEFORMAT)之指针。
- DWORD_PTR dwCallback 为指向回调函数的指针或窗口句柄,用于处理波形声音输入过程中产生的消息。
- DWORD_PTR dwCallbackInstance为传递给回调函数的数据,以回调函数的参数方式传递。注意:若回调方式为窗口方式,该项不适用。
- DWORD fdwOpen用于打开一些该函数中定义的选项,通常为0。
函数返回值:
- 若函数正常调用,返回值为0,其中可能的错误及返回值为︰
- MMSYSERR_BADDEVICEID = 2; {设备ID超界};
- MMSYSERR_ALLOCATED = 4; {指定的资源已被分配};
- MMSYSERR_NODRIVER = 6; {没有安装驱动程序};
- MMSYSERR_NOMEM = 7; {不能分配或锁定内存};
- WAVERR_BADFORMAT = 32; {设备不支持请求的波形格式}
以上内容来自WINAPI。
相关函数
编辑waveInPrepareHeader、waveInAddBuffer、waveInStart、waveInReset及waveInClose。
函数用法
编辑在一个标准的通过波形声音输入设备记录声音的程序中,函数应该按照以下顺序调用:获取波形声音输入设备,设置波形声音格式;waveInOpen,打开波形声音输入设备;waveInPrepareHeader,为波形声音输入设备准备一个缓冲区;waveInAddBuffer 向波形声音输入设备添加缓冲区;waveInStart 开始录音。
在使用waveInOpen这个函数之前,应该设置一个类型为HWAVEIN的变量,传递给该函数来记录输入设备的句柄,并在之后的函数中使用,同时应通过uDeviceID和pwfx指定设备和声音格式,其中WINAPI中给予声音格式。 *WAVEFORMATEX之原形为︰
typedef struct { WORD wFormatTag;{指定格式类型; 默认 WAVE_FORMAT_PCM = 1;} WORD nChannels;{指出波形数据的声道数; 单声道为 1, 立体声为 2} DWORD nSamplesPerSec;{指定采样频率(每秒的样本数)} DWORD nAvgBytesPerSec;{指定数据传输的传输速率(每秒的字节数)} WORD nBlockAlign;{指定块对齐块对齐是数据的最小单位} WORD wBitsPerSample;{采样大小} WORD cbSize;{附加信息的字节大小} } WAVEFORMATEX; fdwOpen中记录了可以打开的选项,其可选值为 WAVE_FORMAT_QUERY = $0001; {判断设备是否支持给定的格式, 并不打开} WAVE_ALLOWSYNC = $0002; {当是同步设备时必须指定} CALLBACK_WINDOW = $00010000; {当 dwCallback 是窗口句柄时指定} CALLBACK_FUNCTION = $00030000; {当 dwCallback 是函数指针时指定}
通常用于指定函数回调方式(以窗口方式或回调函数方式)
回调函数
编辑当指定函数回调方式为回调函数时,需定义回调函数,其原形为:
void CALLBACK waveInProc( HWAVEIN hwi, //声音输入设备句柄 UINT uMsg, //产生的消息,由系统给出 DWORD dwInstance,//在waveinopen中给出要传递给该函数的数据 DWORD dwParam1, //附加数据1 DWORD dwParam2 //附加数据2 );
注意事项:
- 该函数不能为动态生成的函数,所以一般情况下不能作为类的成员函数,但可以作为静态函数,此时可通过dwInstance传递类的地址。
- 可以处理的消息有:
- WIM_OPEN 录音设备打开
- WIM_CLOSE 录音设备关闭
- WIM_DATA 数据缓存区被写满
当消息类型为WIM_DATA时,dwParam1中为指向被写满的header的首地址,此时可以读取写入的数据。