In meiner iOS-App versuche ich "Ducking" zu implementieren: Während meine App einen kurzen "Befehls-ähnlichen" Ton abspielt, sollte jegliche Hintergrundmusik in der Lautstärke verringert werden. Wenn Sie mit dem Abspielen des Sounds fertig sind, sollte die Musiklautstärke auf den ursprünglichen Wert zurückgehen.iOS AudioSessionSetActive() blockiert Haupt-Thread?
Als implementiert funktioniert Ducking im Grunde wie erwartet. Wenn ich jedoch AudioSessionSetActive (NO) in audioPlayerDidFinishPlaying anrufe: Um das Ducking zu beenden, gibt es eine kleine Pause bei allen zu diesem Zeitpunkt stattfindenden UI-Aktualisierungen. Dies beinhaltet benutzerdefinierte Zeichnung, sowie für ex. automatisches Scrollen von Text und so weiter.
Nun, hier ist die Frage:
Ist das ein bekanntes Problem in iOS6? Ich verwende den gleichen Code auf einem iPod/iOS5, wo ich dieses Verhalten nicht sehe. Oder fehlt mir etwas aus dem Code? Vielleicht ist einer von Ihnen schon auf dasselbe Problem gestoßen und hat eine praktikable Lösung gefunden.
Vielen Dank für Ihre freundliche Unterstützung,
Goetz
- (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);
}
Haben Sie jemals eine Lösung für dieses Problem gefunden? Ich habe genau das gleiche Problem. –
Wenn ich AudioSessionSetActive (NO) nicht anrufe, bleibt meine Benutzeroberfläche reaktionsfähig und Frames werden nicht gelöscht. Wenn ich diesen Methodenaufruf zeitgebe, dauert es etwa 0,5 Sekunden, wenn der Ton abgespielt wird. Aber wie du gesagt hast, wenn du es nicht nennst, bleibt das Audio geduckt. –