我正在使用waveInProc回调进行音频采样。问题是,当我试图停止采样并关闭音频设备时,我在回调中没有得到任何消息 - 尝试了waveInStop,waveInClose,waveInReset。
请咨询。 10xs, 内厄姆
HWAVEIN hWaveIn
waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0, CALLBACK_FUNCTION);
waveInStart(hWaveIn);
waveInStop(hWaveIn); //OR
waveInClose(hWaveIn); //OR
waveInReset(hWaveIn); //OR
更新:这是代码:
开始:
waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0, CALLBACK_FUNCTION);
waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInStart(hWaveIn);
void CALLBACK waveInProc( HWAVEIN hwi, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2 )
{
if (uMsg == WIM_OPEN)
{
return;
}
if (uMsg == WIM_DATA)
{
//process data
waveInAddBuffer(hWaveIn,(PWAVEHDR)dwParam1,sizeof(WAVEHDR));
return;
}
if (uMsg == WIM_CLOSE) //NOT GETTING THIS MSG
{
printf("*****************got WIM_CLOSE\n");
}
}
那么如何停止采样并关闭音频设备?
这是代码: 起始:
waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0, CALLBACK_FUNCTION);
waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInStart(hWaveIn);
void CALLBACK waveInProc( HWAVEIN hwi, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2 )
{
if (uMsg == WIM_OPEN)
{
return;
}
if (uMsg == WIM_DATA)
{
//process data
waveInAddBuffer(hWaveIn,(PWAVEHDR)dwParam1,sizeof(WAVEHDR));
return;
}
if (uMsg == WIM_CLOSE) //NOT GETTING THIS MSG
{
printf("*****************got WIM_CLOSE\n");
}
}
那么如何停止采样并关闭音频设备?
10xs, 内厄姆
答案 0 :(得分:1)
您是否在查看waveInOpen
结果?
因为它按预期工作:
hWaveIn 0x005B7768, nMessage 0x03BE, nInstance 0, nParameter1 0, nParameter2 0
nWaveInOpenResult 0, hWaveIn 0x005B7768
hWaveIn 0x005B7768, nMessage 0x03BF (WIM_CLOSE), nInstance 0, nParameter1 0, nParameter2 0
代码:
#include "stdafx.h"
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
VOID CALLBACK waveInProc(HWAVEIN hWaveIn, UINT nMessage, DWORD_PTR nInstance, DWORD_PTR nParameter1, DWORD_PTR nParameter2)
{
_tprintf(_T("hWaveIn 0x%p, nMessage 0x%04X, nInstance %d, nParameter1 %d, nParameter2 %d\n"), hWaveIn, nMessage, nInstance, nParameter1, nParameter2);
}
int _tmain(int argc, _TCHAR* argv[])
{
WAVEFORMATEX Format = { WAVE_FORMAT_PCM, 1, 8000, 16000, 2, 16, 0 };
HWAVEIN hWaveIn = NULL;
const MMRESULT nWaveInOpenResult = waveInOpen(&hWaveIn, WAVE_MAPPER, &Format, (DWORD_PTR) &waveInProc, 0, CALLBACK_FUNCTION);
_tprintf(_T("nWaveInOpenResult %d, hWaveIn 0x%p\n"), nWaveInOpenResult, hWaveIn);
waveInStart(hWaveIn);
waveInStop(hWaveIn);
waveInClose(hWaveIn);
return 0;
}
在实际代码中处理数据时,请务必考虑到这一点:within the callback function:
应用程序不应从内部调用任何系统定义的函数 一个回调函数,除了EnterCriticalSection, LeaveCriticalSection,midiOutLongMsg,midiOutShortMsg, OutputDebugString,PostMessage,PostThreadMessage,SetEvent, timeGetSystemTime,timeGetTime,timeKillEvent和timeSetEvent。 调用其他wave函数会导致死锁。
要重新添加缓冲区,您需要通过使用PostMessage
或SetEvent
向另一个线程发信号来指示需要,以便回调之外的代码可以接收此指示并重新从那里添加空缓冲区。