asynchronous sound 再生 CarbonLib のバグ
/**************************** MyCallback ****************************************/
pascal void MyCallback( SndChannelPtr channel, SndCommand * theCmd )
{
if( theCmd->param1 == kSoundComplete )
*( (Boolean *)(theCmd->param2) ) = true; // set a global flag
// same as gCallbackPerformed = true;
}
CarbonLib 1.6 では if( theCmd->param1 == kSoundComplete ) が決して true になることがありません。
MacsBug を使い MyCallback のアセンブラーレベルでの追跡を行ってみました。
引数の theCmd の値、さらには channel の値も正しく代入されていません。
このため if 文以降が全く無意味になっているのです。
これは Mac OS X では生じていない現象なので、Mac OS 9 CarbonLib のバグだと思われます。
回避方法として、とりあえず
if( gSndChan->cmdInProgress.param1 == kSoundComplete )
gCallbackPerformed = true;
に変更することで、動作することは確認しました。
もちろんこれは 68K CPU では使えない方法ですし、あまり推奨できるやり方ではありません。
戻る