使えるぞ!「Mix_ChannelFinished()」!
この前書こうとしていた代物をば。
※…の前に諸注意というか…、
この記事のプログラミングは間違っております。
なので、よいコ(?)は真似は非推奨で。
…というわけで、「Mix_ChannelFinised()」の使い方のお話。
「自作音源をSDL_mixerに移植すんべ〜」ということで
最低限「マルチスレッド + シグナル管理」か「コールバック」が使えないとな…。
と考えて、安直に「Mix_ChannelFinished()」とやらを見つけてみたので使ってみましたよと。
で、打ってみたのが以下のコード。
…と、大体こんな感じ(アバウト過ぎてわかりづらい…(汗))で、
// (昔組んだ)サウンド再生用クラス
CPlaySound mix;… 中略 …
// 再生が終わったので、バッファの継ぎ足しをする
void SetNextBuffer( int ch )
{
// 再生
// playSound( int sound_num, int ch_num, int loop_times );
// 引数:sound_num / 鳴らす波形番号
// ch_num / 鳴らすチャンネル番号
// loop_times/ 鳴らす際のループ数
// 注:sound_numの「5」には波形が設定済み
mix.playSound( 5, ch, 1 );
}… 中略 …
Mix_ChannelFinished( SetNextBuffer );
関数ポインタの如く代入してやれば、
waveOutProc()の如くコールバック出来てしまうという優れもの!
しかも、上記の使い方なら
waveOutProc()よりも反応が素早い*1ので、
ちょっとした波形でも音飛び無しで再生可能!!
…と、いいこと尽くめかと思いきや意外な(?)盲点が…。
というわけで、長くなったので次回に続く。
*1:おそらく、ウィンドウのメッセージ関連を無視しているから?