• 締切済み

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

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

コールバック関数の処理ですが switch(msg){ case WOM_OPEN : break; case WOM_DONE : if(ほにゃらら) { waveOutClose(ハンドル); break; } break; case WOM_CLOSE: waveOutUnprepareHeader(引数); break; } こんな感じになると思います

yamaj_biz
質問者

補足

ご指摘の位置にwaveOutCloseを持ってきてみましたが、やはりそこで止まってしまいますねぇ。 コールバック内の処理なのでメインの処理は動いてますが…。 waveOutCloseが実行されていないからだと思いますが、WOM_CLOSEには来ないですしね。

関連するQ&A