やりたいこと
- アプリ起動時にiTunes等で音楽再生状態であれば音楽を優先して再生し続ける
- アプリ起動時には音楽再生をしていないが、タスク切り替えで音楽再生後にアプリがアクティブになったときにも音楽を再生し続ける
音楽を聞きながらゲームアプリで遊びたいといった要件です。
やること
- AudioSessionのCategoryを「AVAudioSessionCategoryAmbient」にする
- otherAudioPlayingプロパティで判別する
- ボリュームを0にする
ボリュームを0にすることに関しては、iTunesなどの音楽が止まったあとにBGMをリジューム再生したかったため、stop/playではなくボリュームを制御することで無音再生で対応するためです。
ポイント
- AppController.mmのdidFinishLaunchingWithOptionsでは設定せず、AppDelegate.cppのdidFinishLaunchingWithOptionsで設定する
AppController.mmで実装してしまうと、アプリ起動時に他で曲が再生されていない場合Ambientにカテゴリ設定してもSoloAmbientになってしまうようでした。
曲の再生中にアプリを起動した場合にはAmbientに設定されるのですが、設定する場所が適切では無いんでしょうね(didFinishLaunchingWithOptionsで設定します的なことは書かれてないから)。
このところよくわかってません。
実装概要
- Objective-CとC++のブリッジとなる(例)GameUtil.h, GameUtil.mm(Objective-C++)を作成する
- GameUtilに以下の(例)メソッドを作成する
- Ambientカテゴリを設定するsetCategoryAmbientメソッド
- otherAudioPlayingプロパティを取得するisOtherAudioPlayingメソッド
- AppDelegate.cppのdidFinishLaunchingWithOptionsでsetCategoryAmbient()を実行する
- Foregroundデリゲートや各SceneなどでisOtherAudioPlaying()により判別しBGM制御を適宜実装する
実装サンプル
GameUtil.h
class GameUtil
{
public:
static bool setCategoryAmbient();
static bool isOtherAudioPlaying();
};
GameUtil.mm
#import <AVFoundation/AVFoundation.h>
bool GameUtil::setCategoryAmbient()
{
NSError* error = nil;
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryAmbient error:&error];
if (error) {
return false;
} else {
return true;
}
}
bool GameUtil::isOtherAudioPlaying()
{
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
return [audioSession isOtherAudioPlaying];
}