- 締切済み
WindowsマルチメディアのwaveOutに関する質問です。
WindowsマルチメディアのwaveOutに関する質問です。 複数のWaveOutデバイスにそれぞれ別の音を出すためにwinmm.libを使ってプログラムを組みました。 waveOutGetNumDevs:デバイス数取得 waveOutGetDevCaps:デバイス列挙 waveOutOpen:デバイスのオープン(CALLBACK_FUNCTIONでコールバック使用) ※バッファを10KB×3用意 waveOutPrepareHeader:送信準備 waveOutWrite:送信 コールバック関数: WOM_DONE→ データがあれば終了バッファに新しいデータを充当 waveOutPrepareHeader:送信準備 waveOutWrite:送信 データが無ければデバイスを閉じる と、これで目的の音を鳴らす事は出来たのですが、再生終了後にデバイスを閉じようとすると処理が戻ってきません。 waveOutReset:リセット(これが戻ってこない) waveOutUnprepareHeader:ブロックの解放 waveOutClose:クローズ(リセットをコメントにした場合、これも戻ってこない) そこで質問です。 1.コールバック内からクローズする事に問題はあるのでしょうか。 2.途中で再生を止めようと思い、再生途中でwaveOutResetを行おうとしても同様の現象が起きるのですが、どうやって止めるのが妥当なのでしょうか。 3.参考になるサイトやコード等があれば教えて頂きたいです。 よろしくお願いします。 VisualStudio2008 VC++9 Windows 7 Pro
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
コールバック関数の処理ですが switch(msg){ case WOM_OPEN : break; case WOM_DONE : if(ほにゃらら) { waveOutClose(ハンドル); break; } break; case WOM_CLOSE: waveOutUnprepareHeader(引数); break; } こんな感じになると思います
補足
ご指摘の位置にwaveOutCloseを持ってきてみましたが、やはりそこで止まってしまいますねぇ。 コールバック内の処理なのでメインの処理は動いてますが…。 waveOutCloseが実行されていないからだと思いますが、WOM_CLOSEには来ないですしね。