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 では使えない方法ですし、あまり推奨できるやり方ではありません。


戻る