- 締切済み
音声ファイル再生時のフリーズ
今、地図や音声で案内板を作ろうとしているのですが、 タイトルにもあるとおり音声ファイルを再生するとフリーズしてしまいます。 音声の再生にはmciSendString、sndPlaySoundを使用したのですが、両方フリーズします。 具体的に言うと・・・ 実行して音声を再生すると案内板が応答しなくなります。ただその際音は流れます。TRACEを入れてdebugしてたところ、どうやらmciSendStringを組み込んだ関数内の処理は終えてました(その関数内から呼び出した関数の処理も終えてました)。 その関数の処理を終えると次の処理に移らずに画面もフリーズしてしまいます。 使用した音声ファイルの大きさは2kBです。 開発環境はVistaでVC++.net 2003を使っています。 なにか気になる点でもいいので宜しくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8745/19849)
フリーズの殆どの原因は「割り込み処理中の不正な処理」です。 割り込み処理中は、自分より優先度の低い他の割り込みを禁止するので、優先度が高い割り込み処理が不正な処理を行って停止してしまうと、殆どの割り込みが入らなくなります。 殆どの割り込みが入らなければ、マウスカーソルも動かないし、画面も描画されなくなります。つまり「フリーズする」のです。 さて、質問者さんのプログラムで「割り込みが起きる」としたら「再生終了後」です。 音声再生をしていると、再生の終了は、非同期に突然に発生します。 つまり「再生終了割り込みが発生して、再生終了通知のコールバックが行われる」と言う事です。 ここで、質問者さんのプログラムが「コールバックを正しく処理していない」とすると、再生終了割り込みが発生した瞬間、プログラムが動作不安定になり、最悪、PCがフリーズします。 なので「mciSendString、sndPlaySoundを呼んだ関数をいくら追跡しても、何も判らない」でしょう。 コールバックルーチンが正しい処理をしているか、または、mciSendString、sndPlaySoundのコールバック指定の引数に適切な値を指定しているか、確認してみましょう。
お礼
お礼が遅れ、そのうえ質問表現が不適切であり申し訳ありません。 正しくは「フリーズ」ではなく例えばウィンドウをドラッグできないなどメインスレッド?が応答しなくなります。 ただ別スレッドに記述したプログラムは引き続き処理できていました。 コールバックは最初は指定していない(NULL)だったのですが、ダイアログに返すように設定しても変わらなく AfxBeginThreadを使って音声再生を別スレッドに記述したのですが、それでも変わらず、色々調べていくうちにデッドロックが起こっているかもしれないと思って改善中な段階です。 何か思い当たる点はありませんでしょうか?