函数原型:
WINMMAPI MMRESULT WINAPI waveInOpen(
LPHWAVEIN phwi,
UINT uDeviceID,
LPCWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwInstance,
DWORD fdwOpen
);
用法示例:waveInOpen(&hwi,WAVE_MAPPER,&waveformat,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW);//打开录音设备
其中的 waveformat如下已经提前定义并填充相应的值:static WAVEFORMATEX waveformat;
memset(&waveformat,0,sizeof(WAVEFORMATEX));
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels= 1;
waveformat.wBitsPerSample= 8;
waveformat.nSamplesPerSec= 11025L;
waveformat.nBlockAlign= 1;
waveformat.nAvgBytesPerSec= 11025L;
waveformat.cbSize=0;
waveInOpen解述︰
- 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。
详细的参考维基百科
WaveInOpen函数
问答:
Q:使用waveInOpen打开音频输入,接收MIC输入的数据。如果在别的程序里已经调用了waveInOpen打开音频输入,那么再调用waveInOpen就会出错。
有没有函数可以判断该音频输入已经被使用?或者有没有其他方法判断是否在别的程序里已经调用了waveInOpen?
A:
再次调用的话返回:MMSYSERR_ALLOCATED Specified resource is already allocated.
说明资源已经分配。那你就不用再重新打开,直接用。
A:查看waveInOpen返回值, MMSYSERR_ALLOCATED 即已经分配。。