1

次のコードを実行します。

void SoundOut()
{
    HWAVEOUT wo;
    WAVEHDR whdr;
    whdr.dwBufferLength = std::vector<SampleType>::size() * m_format.nBlockAlign;
    whdr.lpData = reinterpret_cast<LPSTR>(&(std::vector<SampleType>::front()));
    whdr.dwFlags = 0;
    cout << "waveOpen result " << waveOutOpen(&wo, WAVE_MAPPER, &m_format, 0, 0, CALLBACK_NULL) << endl;;
    cout << "waveOutPrepareHeader" << waveOutPrepareHeader(wo, &whdr, sizeof(WAVEHDR)) << endl;;
    cout << "waveOutWrite" << waveOutWrite(wo, &whdr, sizeof(WAVEHDR)) << endl;;
    cout << "waveOutUnprepareHeader" << waveOutUnprepareHeader(wo, &whdr, sizeof(WAVEHDR)) << endl;;
    cout << "waveOutClose" << waveOutClose(wo) << endl;;
};

stdout は次のようになります。

waveOpen result 0
waveOutPrepareHeader 0
waveOutWrite 0
waveOutUnprepareHeader 33
waveOutClose 33

SOUNDWIN.H ファイルによると、コード 33 は WAVERR_STILLPLAYING を意味します。しかし、サウンドはまったく聞こえず、waveOutWrite はすぐに戻ります (サウンド カードに 88000 サンプルを書き込みます)。この即時リターンはコード 33 を暗示していると思われますが、なぜ waveOutWrite がすぐにリターンし、何も聞こえないのでしょうか?
そして一般的に、waveOutWrite が正常に終了し、何も聞こえないのはなぜですか?
どこを見る?

4

3 に答える 3

1

バッファーを一度準備し、再生が完了したら準備を解除することになっています。バッファはその間に再利用できますが、一般に、再生とともにバッファを準備/準備解除することはお勧めできません。

問題は、データを書き込むとすぐに再生のためにキューに入れられる (そして、waveOut API はエミュレーション/互換レイヤーのみであることを思い出してください) という事実から生じますが、バッファーは遅延コールバックで後で返されます。これに関するWOM_DONE メッセージを参照してください。バッファが API によって使用されなくなった場合にのみ、準備を解除することができます。

于 2012-10-19T10:23:01.497 に答える
0

バッファの再生を開始し、すぐに解放しようとします... すべてを消去する (waveOutUnprepareHeader、waveOutClose) 前に、サウンドを停止する (waveOutStop または waveOutReset を呼び出す) 必要があります。とにかく、何かを聞きたい場合は、後で別の関数でサウンドを停止する必要があります (または、少なくともサウンドを停止する前に Sleep を挿入します)。

于 2015-08-06T09:36:47.403 に答える
0

サウンドの再生と遅延をポーリングして問題を解決しました。

WAVEHDR header = { buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 };
waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR));
/*
* wait a while for the block to play then start trying
* to unprepare the header. this will fail until the block has
* played.
*/
while (waveOutUnprepareHeader(hWaveOut,&header,sizeof(WAVEHDR)) == WAVERR_STILLPLAYING) 
Sleep(100);
waveOutClose(hWaveOut);

waveOut インターフェイスを使用して Windows でオーディオを再生する

于 2016-03-18T10:59:26.550 に答える