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;
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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With