2014-11-21 160 views
1

我一直在爲我正在研究的項目進行一些研究,並試圖確定是否可以通過編程重定向音頻輸出。假設我有一個音頻混音器盒通過USB連接到iPhone。該USB支持音頻輸入和輸出路由。我知道如何「檢測」外部USB配件是否連接到iPhone,並且我知道如何檢測AVAudioSession的輸入和輸出。讓我發佈一些示例代碼,以我目前瞭解的內容。覆蓋iOS音頻輸出

AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute]; 

//Check the route inputs 
for(AVAudioSessionPortDescription *inputDescription in route.inputs) 
{ 
    NSLog(@"Port Name: %@", inputDescription.portName); 
    NSLog(@"Port Description: %@", inputDescription.portType); 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Input Ports" message:[NSString stringWithFormat:@"INPUT PORT NAME NAME: %@ INPUT PORT DESCRIPTION: %@ INPUT ROUTE COUNT: %lu",inputDescription.portName, inputDescription.portType, (unsigned long)[route.outputs count]] delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil]; 
    [alert show]; 

    [self setInput:inputDescription]; 
} 

if(route.inputs.count == 0) 
{ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Input Ports" message:@"Did not detect any input connections" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil]; 

    [alert show]; 
} 

//Check the route outputs 
for(AVAudioSessionPortDescription *portDescription in route.outputs) 
{ 
    NSLog(@"Port Name: %@", portDescription.portName); 
    NSLog(@"Port Description: %@", portDescription.portType); 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Output Ports" message:[NSString stringWithFormat:@"OUTPUT PORT NAME NAME: %@ OUTPUT PORT DESCRIPTION: %@ OUTPUT ROUTE COUNT: %lu",portDescription.portName, portDescription.portType, (unsigned long)[route.outputs count]] delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil]; 
    [alert show]; 
} 

我也知道如何「覆蓋」iOS輸出,以至於內置揚聲器而不是耳機。

NSError *error; 

AVAudioSession *session = [AVAudioSession sharedInstance]; 

BOOL overrideSuccess = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 

if(overrideSuccess) 
{ 
    NSLog(@"Override succeeded"); 
} 

我非常希望能夠做這樣的事情:

  1. 檢測到任何輸出,它們顯示給用戶。 (我可以這樣做)
  2. 允許用戶「選擇」他們希望使用的輸出
  3. 覆蓋當前輸出路徑以將輸出重定向到用戶希望使用的設備。

這最後一步我不確定我能做些什麼。

這個想法是讓用戶錄製,而不限於iOS設備的外接麥克風。希望任何提示或建議,如果我想實現是可能的。另外,我已經通過Apple文檔深入瞭解了這一點,並且無法斷定這是否是100%可能。

回答

0

如果您使用AVAudioSession,使用「overrideOutputAudioPort:error:」方法,您可以做到這一點。以下是AVAudioSession類參考的鏈接:https://developer.apple.com/library/IOs/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html

+0

啊我已經這樣做了。這些選項是有限的,因爲覆蓋選項是AVAudioSessionOverrideSpeaker和AVAudioSessionOverrideNone。從蘋果文檔OverrideNone「使用此選項將音頻路由到當前類別和模式的系統默認輸出」。 – zic10 2014-11-21 18:04:22