2013-07-25 59 views
6

我試着通過使用此代碼來獲取一個iPhone上可用的音頻輸入設備列表:kAudioSessionProperty_InputSources實際上適合什麼?

CFArrayRef arrayRef; 
UInt32 size = sizeof(arrayRef); 
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_InputSources, &size, &arrayRef); 
assert(status == noErr); 
NSArray *array = (__bridge NSArray *)arrayRef; 

通話作品並返回沒有錯誤,但結果陣列始終是空的,不管是什麼硬件我已經連接到它。我已經嘗試了兩種手機耳機,一種是Apple的原裝耳機,一種是三星的耳機,兩種USB麥克風(iXY from RodeiM2X from Tascam),但陣列一直保持空白。所以我想知道這個屬性實際上會列出哪些輸入源?它可以使用嗎?

通過在音頻路由上使用偵聽器回調,我可以驗證是否正確檢測到所有4個設備。我也能夠用每個設備錄製音頻,所以它們都能正常工作。我在iOS 6.1.3(10B329)上使用iPhone 4S。

回答

2

我對iPhone上的音頻編程非常陌生,所以我沒有回答這個特殊屬性的好處,但是如果您想要音頻輸入列表,我認爲這將起作用:

NSArray * ais = [[AVAudioSession sharedInstance] availableInputs]; 

這提供了一個AVAudioSessionPortDescription對象的數組。

for (id object in ais) { 
    AVAudioSessionPortDescription * pd = (AVAudioSessionPortDescription*)object; 
    NSLog(@"%@",pd.portName); 
} 
2

你指的是該屬性是僅適用於通過iPad的相機連接套件附着USB音頻附件音頻輸入源,如在AudioSessionServices類引用提及。

要獲得一個非零的陣列,您需要測試一個USB音頻工作站,並將其插入iPad相機連接套件

這是一個鏈接,列出了一些使用iPad相機連接套件的硬件。

Connecting USB audio interfaces using the Apple iPad Camera Connection Kit.

而且從類別參考

如果沒有可用從所附附件沒有音頻輸入源,該屬性的值是空數組。

所以從上面的鏈接(向下滾動到一些兼容設備副標題的列表)中發現的列表,設備,你有興趣,也產生!無所獲,將一些設備報價音頻輸入,如Alesis iO4,iO2iO2 express

編輯:在Shawn Hershey提供的答案中,有一些優點是關於使用非棄用的objective-c選項。但是,您最感興趣的是AVAudioSessionPortDescription類的portType屬性。 (可從iOS 6獲得。0) 兩個感興趣的常量是 - AVAudioSessionPortLineInAVAudioSessionPortUSBAudio。第一個提到的是通過基座連接器進行音頻輸入,這是您測試麥克風連接的方式。

在iOS 7.0或更高版本可以查詢availableInputs的AVAudioSession財產。在iOS 6中,您只能查詢currentRoute屬性。

我發現這個技術問答&一個非常有用的 - AVAudioSession - microphone selection

+1

看起來你是對的。 「'kAudioSessionProperty_InputSources'」僅適用於基於USB的音頻輸入。這是不幸的,因爲沒有一種不被棄用的方式通過Core Foundation/C函數(不是Objective-C特定的)獲得***全部***音頻輸入。 –

+0

@MichaelDautermann謝謝你,我同意這是不幸的,因爲更高級別的選擇會帶來更多的開銷。 – Bamsworld

+0

@MichaelDautermann和其他人,你能告訴我哪些Objective-C替代品可以獲得非相機連接套件輸入設備嗎?這是Shawn Hershey在回答這個問題時提到的嗎? –

相關問題