2012-08-13 26 views
-2

我正在用waveInProc回调进行音频采样。问题是,当我试图停止采样并关闭音频设备时,我在回调中没有找到味精 - 尝试过waveInStop,waveInClose,waveInReset。waveInClose/Reset/Stop - no msg

请指教。 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

一些代码显示? – 2012-08-13 13:41:47

+0

罗马 - 我编辑了代码 – nmnir 2012-08-13 13:54:20

+0

的问题请注意,您不是supoposed从回调中执行'waveInAddBuffer'。从MSDN:“调用其他波函数[会]会导致死锁”。 – 2012-08-13 15:14:21

回答

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。 调用其他波函数将导致死锁

要重新添加缓冲,则需要通过信令到另一个线程,使用PostMessageSetEvent来表示,如需要,所以回调之外您的代码可以接收该指示,并从重新添加空缓冲区那里。

+0

除了关闭部分,它工作正常,waveInProc被一次又一次地用uMsg调用== WIM_DATA – nmnir 2012-08-13 14:09:08

+0

这意味着你不会停止捕获,但你认为你会这样做(就像你的问题一样)。发布真实的代码。 – 2012-08-13 14:11:24

+0

10xs罗马。 waveInStop(hWaveIn)返回MMSYSERR_NOERROR。之后,我打电话给waveInClose和程序崩溃 - 有很多代码,你想看到什么? – nmnir 2012-08-13 14:28:05

相关问题