2007年06月17日

DirectSound で悪戦苦闘

今日は、ISO9660ファイルシステムの話を休憩して、この前の音楽再生プログラミングの状況を書きます。

今回、DirectSound を試してみました。
昔、古本屋で買った本を元に、普通に一曲だけ再生する所までは上手くいきました。

問題は、曲の終了通知からでした。ストリーミング再生する場合もそうなのですが、イベントを用意し関連付けてシグナル状態を検知、という仕組みのため、別スレッドを用意して WaitForMultipleObjects を使ったのですが・・・、
突然ソースが汚くなりました。
曲が最後まで終わった時と外から Stop したときとで同じイベントが立つのが一つ目の理由で、もう一つはスレッドを曲が変わるたびに用意するのではなく使い回してみようと欲張ったのがいけなかったのでしょう。スレッドの停止と再開には SuspendThread と ResumeThread を使ってみたり、フラグを用意しすぎてぐちゃぐちゃになってしまいました。プログラム終了時にスレッドを終了するタイミングがちょっと狂うとエラーになるためえらく手間取りました。何とか整理したのですが、やっぱり元の設計をシンプルにしないと駄目ですね。

でも、ストリーミング再生で Pause する仕組みを作る場合はどうするのでしょう。

あと、曲の経過時間を表示したかったのですが、再生中は WM_TIMER が全く処理されません。
マルチメディアタイマーが必須かと思ったのですが、別スレッドで Sleep しつつ計るタイマーでごまかしました。
なお、いろんなタイマーの比較は、次のページが面白いです。
http://homepage1.nifty.com/bee/tk/timer.html

そんなこんなで、出来たプログラムのプロセッサの使用率を調べたのですが、何故か結構いい具合でした。ところが終了後に急に重たくなるという現象が・・・。調べてみると、DDHelp.exe というのが終わらずに動いていました。検索してみると、間接的ですが
http://msdn.microsoft.com/library/ja/directx9_c/directx/intro/tools/killhelp.asp?frame=true
というページが・・・。つまり終え方が悪いってことですか。勉強しなおさないと駄目かなあ。

というわけで、音楽関係のプログラムはしばらく放置します。
にしても、コード無しでプログラムの話をするのは難しいですね。
posted by 七癖 at 10:44| Comment(0) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。