nella mia app iOS, sto cercando di implementare "ducking": mentre la mia app riproduce un breve suono "simile a un comando", qualsiasi musica di sottofondo dovrebbe essere ridotta di volume. Al termine della riproduzione del suono, il volume della musica dovrebbe tornare al suo valore originale.iOS AudioSessionSetActive() blocco thread principale?
Come implementato, il ducking funziona come previsto. Tuttavia, quando chiamo AudioSessionSetActive (NO) in audioPlayerDidFinishPlaying: per terminare il ducking, c'è una piccola pausa in tutti gli aggiornamenti dell'interfaccia utente che si verificano in questo momento. Ciò comporta il disegno personalizzato, così come per l'ex. scorrimento automatico del testo e così via.
Ora, ecco la domanda:
È questo un problema noto in iOS6? Sto eseguendo lo stesso codice su un iPod/iOS5, in cui non vedo questo comportamento. O mi manca qualcosa dal codice? Forse uno di voi ha già riscontrato lo stesso problema e trovato una soluzione praticabile.
Grazie mille per il vostro gentile supporto,
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);
}
Hai mai trovato una soluzione a questo problema? Sto avendo lo stesso identico problema. –
Se non chiamo AudioSessionSetActive (NO), l'interfaccia utente rimane reattiva e non rilascia frame. Quando eseguo la chiamata al metodo, sono necessari circa 0,5 secondi durante la riproduzione dell'audio. Ma, come hai detto tu, se non lo chiami, l'audio rimane nascosto. –