-1

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、ナホム

4

1 に答える 1

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;
}

実際のコードでデータを処理するときは、次の点を考慮してください:コールバック関数内:

EnterCriticalSection、LeaveCriticalSection、midiOutLongMsg、midiOutShortMsg、OutputDebugString、PostMessage、PostThreadMessage、SetEvent、timeGetSystemTime、timeGetTime、timeKillEvent、および timeSetEvent を除き、 アプリケーションはコールバック関数内からシステム定義関数を呼び出さないでください。他の波動関数を呼び出すと、デッドロックが発生します。

PostMessageバッファを再追加するには、またはを使用して別のスレッドにシグナルを送ることで必要性などを示す必要がありSetEventます。これにより、コールバックの外側のコードがこの指示を受け取り、そこから空のバッファを再追加できるようになります。

于 2012-08-13T14:05:43.660 に答える