やっぱり微妙だぞ!「Mix_FinishedChannel()」
忘れないうちにこの前の続きを。
前回のコードの何が悪いかというと、
「(おそらく)デッドロックを引き起こしかねないコードである」
ということでしょうか。
少し考えればわかりそうなものだったんですがね。
普通に考えて「再生の終了を通知する」ような代物なわけですから、
割り込み処理であることはほぼ確定でしょう。
そして割り込み処理といえば…、
使用可能な(ライブラリ)関数の制限ですから…。
気付いた後でSDL_mixerのドキュメントを見直してみたら、
ちゃんと、
…と書いてありましたし(汗)
・コールバック関数内では、
SDL_LockAudio()やSDL_mixerの関数は使わないで下さい。 (訳:R-無印)
今後は記憶が曖昧な場合とかは
もっとよく確認してから組むことにしましょうかね…(汗)
ちなみに、前回のコードを改良してみたところ*1
……音、飛びまくりですよ(涙)
これじゃぁ、waveOutProc()と何ら変わらないんですが…。
……大人しく、シグナル処理っぽいのでも使おうかな…。
……あぁ〜、でも確かSDLのタイマってGetTickCount()*2とか使っているんじゃなかったけか。
アレは確か互換性は信頼できるけど、
そもそも精度(…というより分解能?)があんまり信用ならない代物*3だったはず…。
…ん〜、唸っていても仕方ないのでとりあえず暇を見て組んでみますか…。