2016-08-07 5 views
0

Я впервые использую классы MPMusicPlayerController и AVSpeechSynthesizer в приложении. Это запущенное приложение, которое воспроизводит музыку (используя MPMusicPlayerController) и обновляет бегун со статистикой каждые 5 минут (используя AVSpeechSynthesizer). Он отлично работает, но музыка и трансляция находятся на том же громкости, поэтому в зависимости от песни, которую может быть трудно услышать, ее можно услышать, поэтому теперь я хочу, чтобы громкость музыки уменьшалась, когда статистика транслируется. Приведенный ниже код работает только для уменьшения громкости музыки, когда статистика начинает вещание, но она не возобновляет музыку после завершения передачи статистики, что, конечно же, я хочу, чтобы она делала. Я использую это решение из этого сообщения Setting iOS MPMusicPlayerController volume relative to AVAudioPlayer. Мой код ниже:MPMusicPlayerController и AVSpeechSynthesizer пытается реализовать 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]; 
     } 
} 

ответ

0

Используйте это, чтобы сказать другим приложениям, что они могут возобновить воспроизведение аудио:

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

Если аудио вы хотите возобновить приходит из вашего собственного приложения, вы можете сказать это чтобы возобновить воспроизведение с этого метода делегата:

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

}

Смежные вопросы