2013-12-05 1 views
1

У меня проблема, когда я хотел бы, чтобы iPod играл музыку в фоновом режиме, и в моем приложении я бы хотел, чтобы AVSpeechUtterance уменьшил громкость iPod, воспроизвел строку текста, а затем я бы чтобы возобновить воспроизведение iPod. Я пробовал несколько вещей, но никогда не имел AVAudioSession и AVSpeechUtterance хорошо работал вместе. Я могу заставить iPod остановиться, немного приостановиться, а затем снова начать играть. Я вижу, что моя строка передается в AVSpeechUtterance, но не играет особой роли над динамиком. Вот мой код:AVAudioSession смешивание с AVSpeechUtterance

Посмотреть сделал нагрузка:

- (void)viewDidLoad 
    { 
      //set the audio session for my app to play from the TTS library 
      NSError *error; 
      audioSession = [AVAudioSession sharedInstance]; 
      [audioSession setCategory:AVAudioSessionCategoryAmbient withOptions:1 error:&error]; 
      [audioSession setActive:YES error:&error]; 
      if(error){ 
       NSLog(@"Audio Error %@", error); 
      } 

      syn = [[AVSpeechSynthesizer alloc] init]; 
      syn.delegate = self; 

      iPodMusicPlayer = [[MPMusicPlayerController alloc] init]; 

    } 

Вот моя речь функция:

-(void)speech:(NSString *)string 
    { 
      if(audioSession.isOtherAudioPlaying){ 
       wasPlaying = YES; 
       NSLog(@"Other audio is playing"); 
       [iPodMusicPlayer pause]; 
      } 

      AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:string]; 
      utterance.rate = 0.3f; 
      utterance.volume = 1.0; 
      [syn speakUtterance:utterance]; 

    } 

AVSpeechSynthesizer метод делегата, который вызывается после того, как речь закончена

- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance 
    { 
     if(wasPlaying){ 
      NSLog(@"Start Playing"); 
      [iPodMusicPlayer play]; 
      wasPlaying = NO; 
     } 
    } 

Я рассмотрел документы Apple по адресу AVAudioSessionhere, и похоже, что все выполнено правильно. Кто-нибудь знает, где я ошибся?

ответ

3

Я просто хотел, чтобы все знали, что после некоторого устранения неполадок, именно так я смог решить мою проблему. Я не уверен, что мне нравится решение, и я работаю над его улучшением.

Просмотр ли Load

- (void)viewDidLoad 
    { 
      syn = [[AVSpeechSynthesizer alloc] init]; 
      syn.delegate = self; 

      iPodMusicPlayer = [[MPMusicPlayerController alloc] init]; 
    } 

речи Функция

-(void)speak:(NSString *)string 
    { 

      audioSession = [AVAudioSession sharedInstance]; 

      NSError *setCategoryError = nil; 
      NSError *activationError = nil; 
      BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback 
       withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&setCategoryError]; 

      [audioSession setActive:YES error:&activationError]; 

      if(audioSession.isOtherAudioPlaying){ 
       wasPlaying = YES; 
       NSLog(@"Other audio is playing"); 
       [iPodMusicPlayer pause]; 
      } 

      NSLog(@"Success %hhd", success); 

      AVSpeechUtterance *utterance = [AVSpeechUtterance   speechUtteranceWithString:string]; 
      utterance.rate = 0.3f; 
      utterance.volume = 1.0; 
      [syn speakUtterance:utterance]; 
    } 
метод

AVSpeechSynthesizer делегат, который вызывается после того, как речь закончена

 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance 
    { 
      if(wasPlaying){ 
       NSLog(@"Start Playing"); 
       [iPodMusicPlayer play]; 
       wasPlaying = NO; 
      } 
    } 
+0

Дело в том, что вы не обрабатываете другие приложения, такие как подкасты, например, поскольку вы явно приостанавливаете и возобновляете PodMusicPlayer. –

+0

Разве это не останавливает музыку, пока речь идет? Я думал, ты хочешь, чтобы речь шла о музыке? – Fraggle

+1

Вы также можете использовать AVAudioSessionCategoryOptionDuckOthers для смягчения музыки во время синтезатора. Не нужно останавливаться. –

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

  • Нет связанных вопросов^_^