そこでwaveOutWriteを呼び出すことになります。これを利用することで再生の終了を検出することができます。CALLBACK_WINDOW);第6引数にCALLBACK_WINDOWを指定します。下記に示すメッセージがウインドウプロシージャに送られることになります。waveOutOpenの呼び出しが成功した場合に、内部でポストされる。wParamはWAVEデバイスのハンドル。WAVEの再生が終了した場合や、waveOutResetが呼ばれた場合にポストされる。wParamはWAVEデバイスのハンドル。lParamはwaveOutWriteに指定したWAVEHDR構造体のアドレス。waveOutCloseの呼び出しが成功した場合に、内部でポストされる。wParamはWAVEデバイスのハンドル。上記の表から分かるように、再生が終了した場合はMM_WOM_DONEが送られます。よって、このときにwaveOutWriteを呼び出すことになります。続いて、再生されているWAVEを一時停止させる方法について見ていきます。これは、waveOutPauseを呼び出すことで実現できます。);hwoは、WAVEデバイスのハンドルを指定します。一時停止されたWAVEの再生は、waveOutRestartで再開することができます。);hwoは、WAVEデバイスのハンドルを指定します。今回のプログラムは、コールバック機能を利用してWAVEをループ再生します。マウスの左ボタンが押された場合は、一時停止または再開を行います。TEXT("WAVEデバイスのオープンに失敗しました。TEXT("ファイルのオープンに失敗しました。TEXT("WAVEファイルではありません。TEXT("PCMデータではありません。TRUE;}MM_WOM_DONEが送られた時にwaveOutWriteを呼び出すことで、ループ再生を実現しています。それぞれキャストして使用することができます。ポーズ状態でなくなる場合はwaveOutRestartを呼び出すようにしています。waveOutResetの呼び出しで、MM_WOM_DONEが送られるという点に注意してください。MM_WOM_DONEの処理も変更することになります。0;このコードでは、マウスの右ボタンを押した場合にwaveOutResetを呼び出すようにしています。この場合はwaveOutWriteを実行してはいけません。waveOutWriteで実行する必要はありません。bResetという静的変数を利用するようにしています。MM_WOM_DONEが実行されることはありません。MM_WOM_DONEが取得されることはありません。これは、waveOutCloseがポストするMM_WOM_CLOSEについても同じことです。場合によっては一瞬の音切れを感じることがあるかもしれません。解決策がないわけではありません。そのキューにバッファ(WAVEデータ)が書き込まれている場合は、それを再生します。バッファを書き込むのは、既に紹介しているwaveOutWriteです。キューにバッファが書き込まれているかを確認します。音切れが生じることはなくなります。次に、コード例を示します。TEXT("WAVEデバイスのオープンに失敗しました。TEXT("ファイルのオープンに失敗しました。TEXT("WAVEファイルではありません。TEXT("PCMデータではありません。TRUE;}WAVEHDR構造体を2つ用意し、waveOutWriteを2回実行します。1回目の呼び出しでは、キューにバッファが書き込まれて、それは直ちに再生することになります。終了して時点で直ちに再生されます。した手法は、マルチバッファリングと呼ばれたりもします。これがバッファの数だけ送られてきて時点でリセットフラグをFALSEにするようにしています。実をいうと、MM_WOM_DONEはループ再生のタイミングを知らせるためのメッセージではありません。その返されたバッファをlParamより参照できることになっているのです。この関数によってMM_WOM_DONEがポストされるのは当然の事であるといえます。次のようにWAVEHDR.dwFlagsを確認してみるとよいでしょう。dwFlagsにWHDR_PREPAREDを加える。dwFlagsにWHDR_INQUEUEを加える。dwFlagsからWHDR_INQUEUEを取り除き、WHDR_DONEを加える。dwFlagsからWHDR_PREPAREDを取り除く。waveOutWriteを呼び出した場合、WAVEHDR.dwFlagsにWHDR_INQUEUEが指定されます。これは、現在バッファがキューに格納されていることを意味しています。このときのWAVEHDR.dwFlagsにはWHDR_INQUEUEが指定されていません。waveOutWriteの前にwaveOutPrepareHeaderを実行しておく必要はありません。