使えるぞ!「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:おそらく、ウィンドウのメッセージ関連を無視しているから?