やっぱり微妙だぞ!「Mix_FinishedChannel()」

 忘れないうちにこの前の続きを。



 前回のコードの何が悪いかというと、

「(おそらく)デッドロックを引き起こしかねないコードである」

ということでしょうか。



 少し考えればわかりそうなものだったんですがね。

普通に考えて「再生の終了を通知する」ような代物なわけですから、

割り込み処理であることはほぼ確定でしょう。



 そして割り込み処理といえば…、

使用可能な(ライブラリ)関数の制限ですから…。

気付いた後でSDL_mixerのドキュメントを見直してみたら、

ちゃんと、


・コールバック関数内では、
 SDL_LockAudio()やSDL_mixerの関数は使わないで下さい。  (訳:R-無印)
…と書いてありましたし(汗)



 今後は記憶が曖昧な場合とかは

もっとよく確認してから組むことにしましょうかね…(汗)





 ちなみに、前回のコードを改良してみたところ*1

……音、飛びまくりですよ(涙)

これじゃぁ、waveOutProc()と何ら変わらないんですが…。



……大人しく、シグナル処理っぽいのでも使おうかな…。

……あぁ〜、でも確かSDLのタイマってGetTickCount()*2とか使っているんじゃなかったけか。

アレは確か互換性は信頼できるけど、

そもそも精度(…というより分解能?)があんまり信用ならない代物*3だったはず…。

…ん〜、唸っていても仕方ないのでとりあえず暇を見て組んでみますか…。




*1:結構大幅な改良だったのでコードの記載は割愛させてもらいます…(汗)

*2:無論、win上限定ですが

*3:僕が検証したわけではないですが、「timeGetTime」とか「QueryPerformanceCounter」、「rdtsc」あたりと組み合わせて検索すれば、それっぽいページが出てくるはず。