2013-03-26 2 views
21

iOS 응용 프로그램에서 사용할 수있는 오디오 출력을 나열해야합니다. 내 질문은 다음과 유사이 하나 난 항상 하나 개의 출력 포트 (계수 1), 내가 가지고 또한 경우 두 (AN 에어 플레이와 볼 그러나사용 가능한 출력 오디오 대상 나열 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 내장형 스피커). 음악 응용 프로그램을 사용하는 경우 두 포트를 모두보고 전환 할 수 있습니다. 내 앱에는 내가 선택한 앱만 표시됩니다.

내가해야 할 다른 것이 있습니까?

내가 너무,이 코드를 시도 :

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

하지만 사전의 목록을 하나의 출력 목적지를

편집 주셔서 감사합니다. 또한 입력 소스 배열 (나는 아이폰 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이라고 가정 할 수 있습니다. 가능한 출력입니다 얻을

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

비 직관적 인 방법을 : 당신이 블루투스/AirPlay를 출력의 목록을하려는 경우, 먼저이 세션 범주가 당신을보고 확인해야 할 것 AVAudioSession.availableInputs을 확인하는 것은 보통 블루투스 HFP 장치가 마이크를 가지고 있기 때문입니다. 저는 지금 당장은 많이 추측하고 있을지 모르지만, 그것은 지속적으로 availableOutputs를 얻는 유일한 방법입니다.

더 좋은 방법은 단지 _current_ 출력을 보여줍니다으로, AVAudioSessionPort