2016-08-07 15 views
0

Ich verwende die MPMusicPlayerController und AVSpeechSynthesizer Klassen zum ersten Mal in einer App. Es ist eine laufende App, die Musik spielt (mit MPMusicPlayerController) und den Runner alle 5 Minuten mit Statistiken aktualisiert (mit AVSpeechSynthesizer). Es funktioniert gut, aber die Musik und die Übertragung sind auf der gleichen Lautstärke, so dass es je nach Song-Wiedergabe schwierig sein kann, die Statistiken zu hören, so dass ich jetzt möchte, dass die Musiklautstärke sinkt, während die Statistiken übertragen werden. Der folgende Code funktioniert nur, um die Musiklautstärke zu reduzieren, wenn die Statistik beginnt, zu senden, aber die Musik wird nicht fortgesetzt, nachdem die Statistikübertragung abgeschlossen ist, was natürlich das ist, was ich tun möchte. Ich verwende diese Lösung von diesem Beitrag Setting iOS MPMusicPlayerController volume relative to AVAudioPlayer. Mein Code unten:MPMusicPlayerController und AVSpeechSynthesizer versuchen Ducking zu implementieren

- (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]; 
     } 
} 

Antwort

0

verwenden andere Anwendungen zu sagen, dass sie Audio-Wiedergabe wird fortgesetzt:

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

Wenn das Audio Sie von Ihrer eigenen App kommt wieder aufnehmen möchten, können Sie es sagen zum fortsetzen der Wiedergabe von diesem Delegatmethode:

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

}

Verwandte Themen