- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります、、)
PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります
このQ&Aのポイント
- 特定のフォルダにある音楽(.wav)ファイルを順々に再生する音楽再生プレイヤーを作成中です。
- しかし、PlaySound関数でSND_SYNCを使うと、途中で音楽が止まり、次の曲が再生されます。
- 一時的にASYNCを使い、_getch()関数で待機しているが、解決策は見つかっていないようです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
PlaySound、sndPlaySoundをSND_SYNCで鳴らすと「最後のデータをユーザーバッファにセットし終わった瞬間」に制御が戻って来ます。 DirectSoundがインストールされている環境では、オーディオ再生は 複数のユーザーバッファ ↓ ソフトウェアオーディオミキサー ↓ マスターバッファ ↓ サウンド再生ハードウェア ↓ スピーカーからの音声 と言う構造になっています。 なので、「最後のデータをユーザーバッファにセットし終わった瞬間」には、そのデータは再生が終わっていません。 正確な「再生が終了した瞬間」を知るには「ユーザーバッファに再生すべきデータが無くなって、バッファが空っぽになった瞬間」を知る必要があります。 なお、SND_ASYNCは「呼び出したら、音を鳴らしっぱなしにしたまま、すぐに戻ってくる」ので、1曲目を鳴らした瞬間に2曲目を鳴らし、2曲目を鳴らした瞬間に3曲目を鳴らし、と、瞬時に全曲を再生してしまい、結果的に「一番最後の曲のみ再生」して終わりになってしまいます。 「本当に曲が鳴り終わったのを知る」には「サウンドバッファの監視」が必要です。 そして、バッファの監視を行うには、PlaySound、sndPlaySoundは使えないので、自分でバッファを用意し、バッファへのデータ転送、データ転送が終わったバッファの再生開始などを自分で行う必要があります。 オーディオプレーヤーは「そんなに簡単に作れるような代物ではない」ので、覚悟して作りましょう。
お礼
返事が遅くなりました。 SND_SYNCはそういう定義が含まれていたのですね。 対処方法に関しても、とても参考になりました。 有難う御座いました。