2013-03-26 48 views
21

iOSアプリケーションで使用できるオーディオ出力をリストする必要があります。私の質問は、に似て、この1:私はいつもただ一つの出力ポート(カウントである1)、私が持っている場合にも2(エアプレイと参照しかし利用可能な出力オーディオターゲットのリストAVAudioSession

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); 
} 

:私はこのコードを試してみました

How to list available audio output route on iOS内蔵スピーカー)。 Musicアプリケーションを使用すると、両方のポートを見て、それらの間を切り替えることができます。 私のアプリでは、私が選択したものだけが表示されます。

私は何か他に何かする必要がありますか?

私も、このコードを試してみました:

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

が、辞書のリストだけで一つの出力先

EDITありがとうございます。また、入力ソース配列が空である(私はiPhone 4Sを持っている)

EDIT2:

私はMPVolumeViewを使用して作業何かを得ました。このコンポーネントには、ミュージックアプリケーションのように出力オーディオルートを選択できるボタンがあります。使用して、あなたはスライダーを隠すことができますしたい(とボタンのみを持っている)場合は

self.myMPVolumeView.showsVolumeSlider = NO; 

答えて

2

はこのような何かを試してみて、そのより多くのあなたが必要とするが、あなたはそれを削り取っことができるより:

+ (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; 
} 
+0

多少役立つが、これは_available_出力を表示する方法の疑問に答えていないアクセスであなたにもっと自由を与えるMultipleRouteカテゴリを使用することです。現在使用可能な出力のリストを表示する唯一の方法は、提供された 'MPVolumeView'のルートボタンを使用することです。 – Stuart

+0

入力ソースを選択して出力ソースを選択する可能性はありますか?私はこれをすることができないようです。 –

1
AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; 
    for (AVAudioSessionPortDescription *output in currentRoute.outputs) { 

    } 
1

あなたのAVAudioSessionカテゴリによって異なります。

あなたは少なくとも、入力としてマイク、出力としてスピーカーを持っているとiPhoneで仮定できます。あなたは、Bluetooth/AirPlayの出力のリストを取得しようとしている場合は、最初にあなたのセッションカテゴリはあなたにそれらを報告していることを確認する必要があるだろう:

do 
{ 
    try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: .AllowBluetooth) 
    try audioSession.setActive(true) 
} 
catch let e 
{ 
    debugPrint("failed to initialize audio session: \(e)") 
} 

次に利用できる出力を得るために非直感的な方法でありますAVAudioSession.availableInputsをチェックするには、通常、Bluetooth HFPデバイスにもマイクが搭載されているはずです。私は現在多くのことを想定しているかもしれませんが、それは一貫してavailableOutputsを取得する唯一の方法です。

良い方法は、それが唯一の_current_出力を示して、AVAudioSessionPort

関連する問題