2012-08-13 25 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

相關問題