私の iOS アプリでは、「ダッキング」を実装しようとしています。アプリが短い「コマンドのような」サウンドを再生している間、バックグラウンド ミュージックの音量を下げる必要があります。サウンドの再生が終了すると、音楽の音量は元の値に戻ります。
実装されているように、ダッキングは基本的に期待どおりに機能します。ただし、ダッキングを終了するために audioPlayerDidFinishPlaying: で AudioSessionSetActive(NO) を呼び出すと、この時点で発生するすべての UI 更新で少し一時停止します。これには、ex だけでなくカスタム描画も含まれます。テキストの自動スクロールなど。
さて、ここで質問です:
これは iOS6 の既知の問題ですか? iPod / iOS5 で同じコードを実行していますが、この動作は見られません。または、コードから何かが欠けていますか? たぶん、あなたの 1 人はすでに同じ問題に遭遇し、実行可能な解決策を見つけました。
平素は格別のお引き立てを賜り、誠にありがとうございます。
ゲッツ
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//...
NSError *err = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&err];
//...
}
- (void) playSound {
// Enable ducking of music playing in the background (code taken from the Breadcrumb iOS Sample)
UInt32 value = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(value), &value);
// Required if using kAudioSessionCategory_MediaPlayback
value = YES;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);
UInt32 isOtherAudioPlaying = 0;
UInt32 size = sizeof(isOtherAudioPlaying);
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &isOtherAudioPlaying);
if (isOtherAudioPlaying) {
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(value), &value);
}
AudioSessionSetActive(YES);
// Initialization of the AVAudioPlayer
NSString *soundFileName = [[NSBundle mainBundle] pathForResource:@"Beep" ofType:@"caf"];
NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath:soundFileURL];
self.soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
[self.soundPlayer setDelegate:self];
[self.soundPlayer setVolume:[80.0/100.0];
[self.soundPlayer play];
}
- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
// Callback coming from the AVAudioPlayer
// This will block the main thread; however, it is necessary to disable ducking again
AudioSessionSetActive(NO);
}