2014-10-01 7 views
5

Ich habe einen Audio-Player, der eine Option hat, den Audioausgang von Lautsprecher zu Empfänger/Ohrhörer umzuschalten (unabhängig davon, ob das Headset angeschlossen ist), wenn der Näherungssensor 1 meldet. Das Folgende ist mein Code dafür.Umschalten der Audioausgabe zwischen Receiver und Lautsprecher in iOS7 und höher?

- (void) switchAudioOutput:(NSString*)output{ 
    AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 
    BOOL success; 
    NSError* error; 

    if([output isEqualToString:keAudioOutputReciever]){ 
     //Force current audio out through reciever 
     //set the audioSession override 
     success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone 
              error:&error]; 
     if (!success) 
      NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); 

     //activate the audio session 
     success = [audioSession setActive:YES error:&error]; 
     if (!success) 
      NSLog(@"AVAudioSession error activating: %@",error); 
     else 
      NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); 

    }else if([output isEqualToString:keAudioOutputSpeaker]){ 
     //set the audioSession override 
     success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                error:&error]; 
     if (!success) 
      NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); 

     //activate the audio session 
     success = [audioSession setActive:YES error:&error]; 
     if (!success) 
      NSLog(@"AVAudioSession error activating: %@",error); 
     else 
      NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideSpeaker"); 

    } 
} 

Dies wurde Toggle Button route audio to speaker and receiver und enter link description here auf der Antwort basiert. Mir ist aufgefallen, dass dies nur den Audio to Speaker erzwingt, aber nicht dafür sorgt, dass die Route zum Receiver alleine geht. Darüber hinaus, während an den Lautsprecher Verschieben ich die folgende Fehlermeldung erhalten:

AVAudioSession error overrideOutputAudioPort:Error Domain=NSOSStatusErrorDomain Code=-50 "The operation couldn’t be completed. (OSStatus error -50.)"

+1

Vermeidung ich auch genau die gleichen Fehler Geting. Hat es jemand geschafft, das zu lösen? –

Antwort

7

dachte ich die Antwort aus durch Überschreibungen für Empfänger

- (void) setAudioSession:(NSString*)audioOutput{ 

     NSError* error; 
     if([audioOutput isEqualToString:audioOutputSpeaker.lowercaseString]){ 

      //set the audioSession override 
      if(![self setCategory:AVAudioSessionCategoryPlayAndRecord 
           withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth 
            error:&error]) 
       NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); 

      //activate the audio session 
      if (![self setActive:YES error:&error]) 
       NSLog(@"AVAudioSession error activating: %@",error); 
      else 
       NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); 
     }else if ([audioOutput isEqualToString:audioOutputReciever.lowercaseString]){ 
      //Force current audio out through reciever 
      //set the audioSession override 
      if(![self setCategory:AVAudioSessionCategoryPlayAndRecord 
           withOptions:AVAudioSessionCategoryOptionAllowBluetooth 
            error:&error]) 
       NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); 

      if (![self overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]) 
       NSLog(@"AVAudioSession error overrideOutputAudioPort to Reciever:%@",error); 

      //activate the audio session 
      if (![self setActive:YES error:&error]) 
       NSLog(@"AVAudioSession error activating: %@",error); 
      else 
       NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); 
     } 
    }