2014年5月11日日曜日

Cocos2d-xでiOS向けアプリをSuspend/Resumeした時に音声再生されなくなる問題の解決方法

iOSでのみ、サスペンドしたあとにレジュームする事でアプリ復帰後、たまに音声再生されなくなる不具合が発生します。4, 5回に1回くらいの割合なので、何度か試してみてください。
なお、Cococs2d-x 3.0.0 final にて確認しましたが、フォーラムを読む限りだと問題自体は以前から発生していたようですね。


解決方法

フォーラムに解決方法を投稿してmasterに修正内容をpushしている方が居ましたので、そちらの内容を参考に AppDelegate.cpp に以下のif/else文を追加します。
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation();

    // 以下のようにする
    #if (CC_TARGET_PLATFORM != CC_PLATFORM_IOS)
        SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
        SimpleAudioEngine::getInstance()->pauseAllEffects();
    #endif
}

void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();
    
    // 以下のようにする
    #if (CC_TARGET_PLATFORM != CC_PLATFORM_IOS)
        SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
        SimpleAudioEngine::getInstance()->resumeAllEffects();
    #endif
}
問題のコードですが、Androidですとsuspend時に音声再生を停止しなければバックグラウンド再生されてしまう為、追加する必要があるコードとなります。ですが、iOSで実行してしまうとresume後に音声再生されない現象がたまに発生してしまいます。なので、iOSでは実行しないようにすれば解決します。

古いCocos2dxのバージョンだとそれ以前の対応が必要かも

先ほどの説明はこの内容がmasterにmergeされた前提での内容です。もしmerge前のフレームワークを使っている場合、まずはリンク先の内容を自身が使っているローカルにあるフレームワークにmergeしてから実施してください。

0 件のコメント:

コメントを投稿