Date

Windows Core Audio,初期化の続き

初期化ができたので実際に録音する。録音を 開始するにはIAudioClient::Start停止するにはIAudioClient::Stopを呼ぶ。

開始したら、次の順で処理を進める。

  1. IAudioCaptureClient::GetNextPacketSizeで、次のパケットサイズを受け取る。
  2. パケットサイズが 0 でなければ、IAudioCaptureClient::GetBufferでバッファを取得する。
  3. 取得したバッファをもとに保存処理などを実施。
  4. バッファを IAudioCaptureClient::ReleaseBufferで解放する。

気をつけなければならないのは、これらを遅滞なく実行する必要があること。録音スレッドを別スレッドに分けている場合は、スレッドの優先順位を上げる、(他のスレッドにおいても)余計な処理をしないといった工夫が必要である。

c++ キャプチャ HRESULT Capture() { HRESULT hr; DWORD start_time=timeGetTime(); DWORD total=0, loop_count=0; hr=pAudClient->Start(); while(timeGetTime()-start_time < 5000) { // 5 sec Sleep(0); UINT32 packet_length=0; hr=pCapClient->GetNextPacketSize(&packet_length); if(FAILED(hr)){ DebugMsg(_T("GetNextPacketSize %X"), hr); continue; } while(packet_length!=0) { LPBYTE pData=0; FormatHR(hr); UINT32 num_frame=0; DWORD flags=0; pCapClient->GetBuffer(&pData, &num_frame, &flags, NULL, NULL); // // なんらかの処理 ... // total += num_frame; pCapClient->ReleaseBuffer(num_frame); pCapClient->GetNextPacketSize(&packet_length); loop_count++; } } DebugMsg(_T("total_size=%d loop_count=%d"), total, loop_count); hr=pAudClient->Stop(); return hr; }

https://github.com/mahorigahama/WinCoreCap

WinCoreCap.cpp の 67 行目でエンドポイントを選択しているので、自分の環境にあわせて書き換えること。


Comments

comments powered by Disqus