我有與微軟的waveout的API一個問題:waveOutWrite緩衝區永遠不會返回給應用程序
EDIT1:添加鏈接到樣本項目: EDIT2:去掉鏈接,它不能代表問題
玩一些後音頻,當我想結束一個給定的播放流,我調用該函數:
waveOutClose(hWaveOut_);
然而,waveOutClose()被調用後,也有時庫仍可以訪問以前waveOutW傳遞給它的內存rite(),導致無效的內存訪問。
我再努力確保標記在所有緩衝區爲釋放緩衝區之前完成:
PcmPlayback::~PcmPlayback()
{
if(hWaveOut_ == nullptr)
return;
waveOutReset(hWaveOut_); // infinite-loops, never returns
for(auto it = buffers_.begin(); it != buffers_.end(); ++it)
waveOutUnprepareHeader(hWaveOut_, &it->wavehdr_, sizeof(WAVEHDR));
while(buffers_.empty() == false) // infinite loops
removeCompletedBuffers();
waveOutClose(hWaveOut_);
//Unhandled exception at 0x75629E80 (msvcrt.dll) in app.exe:
// 0xC0000005: Access violation reading location 0xFEEEFEEE.
}
void PcmPlayback::removeCompletedBuffers()
{
for(auto it = buffers_.begin(); it != buffers_.end();)
{
if(it->wavehdr_.dwFlags & WHDR_DONE)
{
waveOutUnprepareHeader(hWaveOut_, &it->wavehdr_, sizeof(WAVEHDR));
it = buffers_.erase(it);
}
else
++it;
}
}
然而,這種情況從未發生過 - 緩衝區永遠不會變空。將有4-5塊剩餘的wavehdr_.dwFlags == 18(我相信這意味着塊仍被標記爲在回放中)
如何解決此問題?
@馬丁Schlott(「你能提供你寫緩衝區waveOutWrite循環?」) 它不太一個循環,而不是我有一個每當我收到的音頻數據包在網絡上調用的函數:
void PcmPlayback::addData(const std::vector<short> &rhs)
{
removeCompletedBuffers();
if(rhs.empty())
return;
// add new data
buffers_.push_back(Buffer());
Buffer & buffer = buffers_.back();
buffer.data_ = rhs;
ZeroMemory(&buffers_.back().wavehdr_, sizeof(WAVEHDR));
buffer.wavehdr_.dwBufferLength = buffer.data_.size() * sizeof(short);
buffer.wavehdr_.lpData = (char *)(buffer.data_.data());
waveOutPrepareHeader(hWaveOut_, &buffer.wavehdr_, sizeof(WAVEHDR)); // prepare block for playback
waveOutWrite(hWaveOut_, &buffer.wavehdr_, sizeof(WAVEHDR));
}
您能否提供將緩衝區寫入waveOutWrite的循環? –
我添加了一個鏈接到一個小項目來演示這個問題,它會運行3秒鐘並崩潰 – aCuria