1

Windows 8.1 ストアの Windows オーディオ セッション (WASAPI) サンプルのオーディオ キャプチャ部分を使用しています。最終更新日は 2015 年 3 月 24 日です。間違っている、または過度に複雑に見えるコードの例を見ることができるので、私は書いています。これは、私が WASAPI インターフェイスと Windows ランタイムのワーク キューを完全に理解していないためだと思います。スタック オーバーフロー コミュニティが、これがバグではない理由を教えてくれることを願っています。

それらはすべて WASAPICapture.cpp にあります。ここでは、最も単純な (そして最も深刻な) 例で水域をテストします: 解放されたバッファーへのポインターの使用。

以下は、問題の特定の行を強調するための疑似コードです。行番号は、さらに下にあるより完全なコードの抜粋に関連しています。

追伸 - 私のインターネットへのアクセスは散発的であり、私は初心者です - そのため、私の回答はしばらくお待ちください。

Line 1:  hr = m_AudioCaptureClient->GetBuffer( &Data, &FramesAvailable, ...  
         ... returns in Data a pointer to the audio buffer  

Line 21: auto dataByte = ref new Platform::Array<BYTE, 1>( Data, cbBytesToCapture );  
         ... copies from the buffer into a new Platform Array for the GUI's 'scope.  

Line 24: m_AudioCaptureClient->ReleaseBuffer( FramesAvailable );  
         ... releases the buffer  

Line 27: ProcessScopeData( Data, cbBytesToCapture );  
         ... uses the pointer after the underlying buffer has been released!?  

...そして、より完全なコードの抜粋は次のとおりです。

hr = m_AudioCaptureClient->GetBuffer( &Data, &FramesAvailable, &dwCaptureFlags, &u64DevicePosition, &u64QPCPosition );
if (FAILED( hr ))
{
    goto exit;
}

if (dwCaptureFlags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY)
{
    // Pass down a discontinuity flag in case the app is interested and reset back to capturing
    m_DeviceStateChanged->SetState( DeviceState::DeviceStateDiscontinuity, S_OK, true );
    m_DeviceStateChanged->SetState( DeviceState::DeviceStateCapturing, S_OK, false );
}

// Zero out sample if silence
if ( (dwCaptureFlags & AUDCLNT_BUFFERFLAGS_SILENT) || IsSilence )
{
    memset( Data, 0, FramesAvailable * m_MixFormat->nBlockAlign );
}

// Store data in array
auto dataByte = ref new Platform::Array<BYTE, 1>( Data, cbBytesToCapture );

// Release buffer back
m_AudioCaptureClient->ReleaseBuffer( FramesAvailable );

// Update plotter data
ProcessScopeData( Data, cbBytesToCapture );

// Write File and async store
m_WAVDataWriter->WriteBytes( dataByte );
4

1 に答える 1