Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List available output audio target AVAudioSession

I need to list the audio outputs available to an iOS application. My question is similar to this one: How to list available audio output route on iOS

i tried this code:

NSError *setCategoryError = nil; BOOL success = [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback                                                       error: &setCategoryError];  NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive: YES error: &activationError];  … NSLog(@"session.currentRoute.outputs count %d", [[[[AVAudioSession sharedInstance] currentRoute] outputs ] count]); for (AVAudioSessionPortDescription *portDesc in [[[AVAudioSession sharedInstance] currentRoute] outputs ]) {     NSLog(@"-----");     NSLog(@"portDesc UID %@", portDesc.UID);     NSLog(@"portDesc portName %@", portDesc.portName);     NSLog(@"portDesc portType %@", portDesc.portType);     NSLog(@"portDesc channels %@", portDesc.channels); } 

However I always see just one output port (the count is 1), also if I have two (an Airplay and a Built-in speaker). If I use the Music application I am able to see both ports and switch between them. In my app I only see the one that I have selected.

There is something else that I need to do?

Thank you

EDIT:

i tried this code, too:

CFDictionaryRef asCFType = nil; UInt32 dataSize = sizeof(asCFType); AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &asCFType); NSDictionary *audioRoutesDesc = (__bridge NSDictionary *)asCFType; NSLog(@"audioRoutesDesc %@", audioRoutesDesc); 

but the dictionary list just one output destinations. Moreover the input sources array is empty (I have a iPhone 4s)

EDIT2:

I got something working using MPVolumeView . This component has a button that lets you choose the output audio route, like in the Music App.

If you want you can hide the slider (and have only the button) using:

self.myMPVolumeView.showsVolumeSlider = NO; 
like image 937
lucianoenrico Avatar asked Mar 26 '13 17:03

lucianoenrico


1 Answers

Try something like this, its more than you need but you can pare it down:

    + (NSString *) demonstrateInputSelection {     NSError* theError = nil;     BOOL result = YES;     NSMutableString *info = [[NSMutableString alloc] init];     [info appendString: @"     Device Audio Input Hardware\n"];      NSString *str = nil;     if( iOSMajorVersion < 7 ){         str = @"No input device information available";         NSLog(@"%@",str);         [info appendFormat:@"%@\n",str];          return info;     }      AVAudioSession* myAudioSession = [AVAudioSession sharedInstance];      result = [myAudioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&theError];     if (!result)     {         NSLog(@"setCategory failed");     }      result = [myAudioSession setActive:YES error:&theError];     if (!result)     {         NSLog(@"setActive failed");     }      // Get the set of available inputs. If there are no audio accessories attached, there will be     // only one available input -- the built in microphone.     NSArray* inputs = [myAudioSession availableInputs];     str = [NSString stringWithFormat:@"\n--- Ports available on %@: %d ---", [UIDevice currentDevice].name , [inputs count]];     NSLog(@"%@",str);     [info appendFormat:@"%@\n",str];      // Locate the Port corresponding to the built-in microphone.     AVAudioSessionPortDescription* builtInMicPort = nil;     AVAudioSessionDataSourceDescription* frontDataSource = nil;      for (AVAudioSessionPortDescription* port in inputs)     {         // Print out a description of the data sources for the built-in microphone         str = @"\n**********";         NSLog(@"%@",str);         [info appendFormat:@"%@\n",str];         str = [NSString stringWithFormat:@"Port :\"%@\": UID:%@", port.portName, port.UID ];         NSLog(@"%@",str);         [info appendFormat:@"%@\n",str];         if( [port.dataSources count] ){             str = [NSString stringWithFormat:@"Port has %d data sources",(unsigned)[port.dataSources count] ];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }          str = [NSString stringWithFormat:@">%@", port.dataSources];         NSLog(@"%@",str);    //     [info appendFormat:@"%@\n",str];          if( [port.portType isEqualToString:AVAudioSessionPortLineIn] ){             str = @"Line Input found";             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }         else if( [port.portType isEqualToString:AVAudioSessionPortUSBAudio] ){             str = @"USB Audio found";             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }         else if ([port.portType isEqualToString:AVAudioSessionPortBuiltInMic]){             builtInMicPort = port;             str = @"Built-in Mic found";             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }         else if ([port.portType isEqualToString:AVAudioSessionPortHeadsetMic]){             builtInMicPort = port;             str = @"Headset Mic found";             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }         else{             str = @"Other input source found";             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }          // loop over the built-in mic's data sources and attempt to locate the front microphone         for (AVAudioSessionDataSourceDescription* source in port.dataSources)         {             str = [NSString stringWithFormat:@"\nName:%@ (%d) \nPolar:%@ \nType:%@ \nPatterns:%@", source.dataSourceName, [source.dataSourceID intValue], source.selectedPolarPattern, port.portType, source.supportedPolarPatterns];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];              //           if ([source.orientation isEqual:AVAudioSessionOrientationFront])             //           {             //               frontDataSource = source;             //               break;             //           }         } // end data source iteration      }      str = @"\n----  Current Selected Ports ----\n";     NSLog(@"%@",str);     [info appendFormat:@"%@",str];      NSArray *currentInputs = myAudioSession.currentRoute.inputs; //    str = [NSString stringWithFormat:@"\n%d current input ports", [currentInputs count]]; //    NSLog(@"%@",str); //    [info appendFormat:@"%@\n",str];     for( AVAudioSessionPortDescription *port in currentInputs ){         str = [NSString stringWithFormat:@"\nInput Port :\"%@\":", port.portName ];         NSLog(@"%@",str);         [info appendFormat:@"%@\n",str];         if( [port.dataSources count] ){             str = [NSString stringWithFormat:@"Port has %d data sources",(unsigned)[port.dataSources count] ];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];              str = [NSString stringWithFormat:@"Selected data source:%@",  port.selectedDataSource.dataSourceName];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];              if( [port.selectedDataSource.supportedPolarPatterns count] > 0 ){                 str = [NSString stringWithFormat:@"Selected polar pattern:%@", port.selectedDataSource.selectedPolarPattern];                 NSLog(@"%@",str);                 [info appendFormat:@"%@\n",str];             }         }     }      NSArray *currentOutputs = myAudioSession.currentRoute.outputs; //    str = [NSString stringWithFormat:@"\n%d current output ports", [currentOutputs count]]; //    NSLog(@"%@",str); //    [info appendFormat:@"%@\n",str];     for( AVAudioSessionPortDescription *port in currentOutputs ){         str = [NSString stringWithFormat:@"\nOutput Port :\"%@\":", port.portName ];         NSLog(@"%@",str);         [info appendFormat:@"%@\n",str];         if( [port.dataSources count] ){             str = [NSString stringWithFormat:@"Port has %d data sources",(unsigned)[port.dataSources count] ];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];              str = [NSString stringWithFormat:@"Selected data source:%@",  port.selectedDataSource.dataSourceName];             NSLog(@"%@",str);             [info appendFormat:@"%@\n",str];         }      }  //    str = [NSString stringWithFormat:@"\Current Route: %@ Source:%@\n", myAudioSession.currentRoute.portName, myAudioSession.preferredInput.selectedDataSource.dataSourceName]; //    NSLog(@"%@",str); //    [info appendFormat:@"%@\n",str];       if( myAudioSession.preferredInput.portName ){         str = [NSString stringWithFormat:@"\nPreferred Port: %@ Source:%@\n", myAudioSession.preferredInput.portName, myAudioSession.preferredInput.selectedDataSource.dataSourceName];     } else {         str = @"\nNo Preferred Port set";     }     NSLog(@"%@",str);     [info appendFormat:@"%@\n",str];      return info;      if (frontDataSource)     {         NSLog(@"Currently selected source is \"%@\" for port \"%@\"", builtInMicPort.selectedDataSource.dataSourceName, builtInMicPort.portName);         NSLog(@"Attempting to select source \"%@\" on port \"%@\"", frontDataSource, builtInMicPort.portName);          // Set a preference for the front data source.         theError = nil;         result = [builtInMicPort setPreferredDataSource:frontDataSource error:&theError];         if (!result)         {             // an error occurred. Handle it!             NSLog(@"setPreferredDataSource failed");         }     }      // Make sure the built-in mic is selected for input. This will be a no-op if the built-in mic is     // already the current input Port.     theError = nil;     result = [myAudioSession setPreferredInput:builtInMicPort error:&theError];     if (!result)     {         // an error occurred. Handle it!         NSLog(@"setPreferredInput failed");     }      return info; } 
like image 65
Andrew Smith Avatar answered Sep 18 '22 10:09

Andrew Smith