今回、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
というページが・・・。つまり終え方が悪いってことですか。勉強しなおさないと駄目かなあ。
というわけで、音楽関係のプログラムはしばらく放置します。
にしても、コード無しでプログラムの話をするのは難しいですね。