2013年9月12日木曜日

cocos2d-xでCocosDenshion::SimpleAudioEngineのplayEffect()がresume時(background to foreground)に鳴らない問題対応

BGMは問題ないのだが、効果音(playEffect)が一度backgroundに移行後、再度foregroundに移行した時に鳴らない場合がある。
target os: iOS6.1
audio format: .caf
cocos2dx ver.: 2.1rc0-x-2.1.4

SimpleAudioEngine::playEffectを追ってみたら[CocosDenshion playSound:sourceGroupId:pitch:pan:gain:loop:]でも特にエラーが起きておらず、正常にOpenALのalSourcePlay()が呼び出されているようだ。loadも問題ないし原因不明。

ググったら公式フォーラムでちらほら報告があるだけ。
Sound FX not playing after a while.
http://www.cocos2d-x.org/boards/6/topics/3153
http://www.cocos2d-x.org/issues/2512

とりあえずの対処としてBackgroundに移行する時にend()して、Foregroundにresumeする時にアプリ起動時にpreloadすることで音を鳴らす事ができる(ただしpause~resumeではないので、途中から鳴らす事はできない。)
bool AppDelegate::applicationDidFinishLaunching()
{
    // some code ...

    CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("press_button.caf");
}
void AppDelegate::applicationDidEnterBackground()
{
    CCDirector::sharedDirector()->pause();
    CCDirector::sharedDirector()->stopAnimation();

    // end
    SimpleAudioEngine::sharedEngine()->end();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
    CCDirector::sharedDirector()->resume();
    CCDirector::sharedDirector()->startAnimation();

    // preloadEffect
    CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("press_button.caf");
}

ゲーム系で音が鳴らなくなるって結構致命的な気がするんだけど、v2.1.4stableとか、v3.xでは直ってるのかな。不明。