Liste des produits disponibles audio target AVAudioSession
je dois énumérer les sorties audio disponibles pour une application iOS. Ma question est similaire à celle-ci: comment lister la route de sortie audio disponible sur iOS
j'ai essayé ce 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);
}
cependant je ne vois toujours qu'un port de sortie (le compte est 1), même si j'en ai deux (un Airplay et un haut-parleur intégré). Si j'utilise L'application Music, je peux voir les deux ports et basculer entre eux. Dans mon application seulement voir celui que j'ai choisi.
Il y a autre chose que je dois faire?
Merci
EDIT:
j'ai essayé ce code, aussi:
CFDictionaryRef asCFType = nil;
UInt32 dataSize = sizeof(asCFType);
AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &asCFType);
NSDictionary *audioRoutesDesc = (__bridge NSDictionary *)asCFType;
NSLog(@"audioRoutesDesc %@", audioRoutesDesc);
mais le dictionnaire ne Liste qu'une destination de sortie. De plus, le tableau des sources d'entrée est vide (j'ai un iPhone 4s)
Edit 2:
j'ai quelque chose qui fonctionne avec MPVolumeView . Ce composant a un bouton qui vous permet de choisir la route audio de sortie, comme dans L'application de musique.
si vous voulez, vous pouvez cacher le curseur (et n'avoir que le bouton) en utilisant:
self.myMPVolumeView.showsVolumeSlider = NO;
3 réponses
Essayez quelque chose comme ça, c'est plus que ce dont vous avez besoin mais vous pouvez le réduire:
+ (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;
}
AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute];
for (AVAudioSessionPortDescription *output in currentRoute.outputs) {
}
cela dépendra de votre catégorie AVAudioSession.
Vous pouvez supposer que sur un iPhone que vous avez au moins un microphone et un haut-parleur de sortie. Si vous essayez d'obtenir une liste des sorties Bluetooth/AirPlay, vous devez d'abord vous assurer que votre catégorie de session vous les rapporte:
do
{
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: .AllowBluetooth)
try audioSession.setActive(true)
}
catch let e
{
debugPrint("failed to initialize audio session: \(e)")
}
alors une façon non intuitive d'obtenir des sorties disponibles est de vérifier AVAudioSession.availableInputs
comme d'habitude un appareil bluetooth HFP aurait un mic trop.. J'ai peut-être supposer beaucoup maintenant.. mais c'est la seule façon d'obtenir régulièrement vos sorties disponibles.
une meilleure façon est D'utiliser la catégorie MultipleRoute qui vous donnera plus de liberté à l'accès AVAudioSessionPort