PlaySound
Win32 SDKの関数を使用してウェーブ サウンド ファイルを再生しています。現在、次のコード行があります。
PlaySound(szFile,NULL,SND_FILENAME );
しかし、今知りたいのは、Wave ファイルの再生が終了した時間をどのように検出できるかということです。ウェーブの再生が停止したときにボタンのテキストを変更したい。
PlaySound でできることは非常に限られています。私が取り組んでいる製品では、制限を克服するために、DirectSound の上にメディア再生ライブラリを構築しました。多くのことの中で、WAV ファイル パーサーの作成と、PCM サンプルのストリームを DirectSound バッファーに保持するためのコードのスレッド化が含まれていました。気弱な人向けではありません。
あなたはこの道を行くことができますが、ここにいくつかのより簡単な提案があります.
再生している WAV ファイルの長さがわかっている場合は、SND_ASYNC フラグを指定して PlaySound を呼び出すことができます。サウンドの再生が終了すると予想される時間に起動するようにタイマーをスケジュールします。WAV ファイルの長さが分からない場合は、パーサーを記述してファイルのヘッダーを読み取ることができます。「fmt」チャンクのサンプリング レートとフォーマットをデータ チャンクのバイト数と比較して、ファイルの時間の長さを計算します。
または.... PlaySound 呼び出しを発行するための専用スレッドを作成します (SND_ASYNC フラグなし)。同期 PlaySound 関数が戻ったら、UI スレッドに PostMessage を実行してボタンを更新します。PlaySound への呼び出しが重複している場合は、マルチスレッド同期を実行する必要がある可能性がありますが、難しくはないはずです。
SND_ASYNC
フラグを指定しない限り、PlaySound
関数は同期です。つまり、フラグを呼び出した後、サウンドファイルの再生が終了するまでプログラムに制御が戻りません。
したがって、関数が値を返すと(TRUE
成功した場合、またはFALSE
そうでない場合)、サウンドの再生が終了したことがわかります。
関数を呼び出した直後に、コードの次の行でボタンコントロールのテキストを更新するだけですPlaySound
。変更を反映するためにボタンがすぐに更新されるようにしたい場合は、UpdateWindow
関数も呼び出す必要があります。