2016-08-07 2 views
0

J'utilise les classes MPMusicPlayerController et AVSpeechSynthesizer pour la première fois dans une application. C'est une application en cours d'exécution qui joue de la musique (en utilisant MPMusicPlayerController) et met à jour le coureur avec des statistiques toutes les 5 minutes (en utilisant AVSpeechSynthesizer). Cela fonctionne bien, mais la musique et la diffusion sont au même volume, donc en fonction de la chanson jouée, il peut être difficile d'entendre les statistiques, alors maintenant je veux que le volume de musique diminue pendant que les statistiques sont diffusées. Le code ci-dessous ne fonctionne que pour réduire le volume de musique lorsque les statistiques commencent à diffuser, mais il ne reprend pas la musique après la diffusion des statistiques, ce qui est bien sûr ce que je veux qu'il fasse. J'utilise cette solution à partir de ce poste Setting iOS MPMusicPlayerController volume relative to AVAudioPlayer. Mon code est ci-dessous:MPMusicPlayerController et AVSpeechSynthesizer essayant d'implémenter ducking

- (void)setAudioSessionWithDucking:(BOOL)isDucking 
    { 
    AudioSessionSetActive(NO); 

    UInt32 overrideCategoryDefaultToSpeaker = 1; 
    AudioSessionSetProperty  (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof  (overrideCategoryDefaultToSpeaker), &overrideCategoryDefaultToSpeaker); 

    UInt32 overrideCategoryMixWithOthers = 1; 
    AudioSessionSetProperty  (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof  (overrideCategoryMixWithOthers), &overrideCategoryMixWithOthers); 

    UInt32 value = isDucking; 
    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck,  sizeof(value), &value); 

    AudioSessionSetActive(YES); 
} 

- (void)updateLabels 
{ 

if(fmod(mins,5) == 0){ 
[self setAudioSessionWithDucking:YES]; 

    AVSpeechUtterance *utterance = [AVSpeechUtterance 
            speechUtteranceWithString:newText]; 
    AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init]; 

    utterance.rate = 0.45; 
    utterance.pitchMultiplier = 0.95; 
    utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"]; 
    utterance.volume = 1.0; 

    [synth speakUtterance:utterance]; 

[self setAudioSessionWithDucking:NO]; 
     } 
} 

Répondre

0

Utilisez cette option pour dire d'autres applications qu'ils peuvent reprendre la lecture audio:

-(void)notifyIOSthatOtherAppsCanResumeAudioPlayback{ 
    NSError *err; 
    [indigoAudioSession setActive: NO 
        withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation 
         error: &err]; 
    if(err!=nil){ 
     NSLog(@"audioIsFreeNotificationForIOS ERROR: %@",err.description); 
    } 
} 

Si l'audio que vous voulez reprendre vient de votre propre application, vous pouvez dire qu'il pour reprendre la lecture de cette méthode déléguée:

- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance{ 
    playSomeMusic(); 

}