2013-07-25 11 views
6

Ich habe versucht, mithilfe dieser Code die Liste der verfügbaren Audio-Eingabegeräte auf einem iPhone zu holen:Für was ist kAudioSessionProperty_InputSources eigentlich gut?

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

Der Aufruf funktioniert und kehrt ohne Fehler, aber die Ergebnisse Array ist immer leer, egal welche Hardware Ich habe mich damit verbunden. Ich habe zwei übliche Headsets für Handys ausprobiert, ein Original von Apple und eines von Samsung und zwei Arten von USB-Mikrofonen (ein iXY from Rode und ein iM2X from Tascam), aber das Array bleibt immer leer. Ich frage mich also, welche Arten von Eingabequellen tatsächlich von dieser Eigenschaft aufgelistet werden? Ist es überhaupt nutzbar?

Mithilfe eines Listener-Rückrufs auf den Audio-Routen konnte ich überprüfen, dass alle 4 Geräte korrekt erkannt werden. Ich konnte auch Audio mit jedem der Geräte aufnehmen, so dass sie alle richtig funktionieren. Ich benutze ein iPhone 4S mit iOS 6.1.3 (10B329).

Antwort

2

Ich bin neu auf Audio-Programmierung auf iPhones, so habe ich keine Antwort auf die Frage, wofür diese bestimmte Eigenschaft gut ist, aber wenn Sie die Liste der Audio-Eingänge wollen, denke ich, dass dies funktioniert:

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

Dies bietet eine Reihe von AVAudioSessionPortDescription Objekten.

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

Die Eigenschaft, die Sie sich beziehen ist nur für Audio-Eingangsquellen in einem Zubehörteil USB-Audio befestigt durch die iPad Camera Connection Kit, wie in der AudioSessionServices Klasse Referenz erwähnt.

Um ein Array zu erhalten, das nicht nil ist, müssen Sie mit einer USB Audio Workstation testen, die in das iPad Kamera Verbindungskit gesteckt wird.

Hier ist ein Link, der einige Hardware auflistet, die das iPad-Kamera-Verbindungskit verwendet.

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

Auch aus der Klasse Referenz

Wenn es keine Audioeingangsquelle zur Verfügung aus dem angeschlossenen Zubehör, den Wert dieses Objekts ist ein leeres Array.

So aus der Liste in den obigen Link (nach unten scrollen, um Liste von einigen kompatiblen Geräten Unter Überschrift) gefunden, Geräte würden Sie interessiert sein, daß sich eine Ausbeute! Nil Ergebnis würde einige Gerät, das Angebot sein Audioeingang wie der Alesis iO4, iO2 oder iO2 Express.

EDIT: Es gibt einen Verdienst in der Antwort von Shawn Hershey, in Bezug auf die Verwendung einer nicht veralteten Ziel-c-Alternative. Am meisten interessiert Sie jedoch die portType Eigenschaft der AVAudioSessionPortDescription Klasse. (verfügbar von iOS 6.0) Zwei interessante Konstanten sind - AVAudioSessionPortLineIn und AVAudioSessionPortUSBAudio. Der erste, der hier erwähnt wird, ist für die Audioeingabe über den Dock-Anschluss, so wie Ihre Testmikrofone erwähnt haben.

In iOS 7.0 und höher können Sie den availableInputs Eigenschaft der AVAudioSession Klasse abfragen. In iOS 6 können Sie nur die currentRoute Eigenschaft abfragen.

fand ich dieses Technische Q & Eine sehr hilfreich - AVAudioSession - microphone selection

+1

Sieht aus wie Sie richtig sind. "' kAudioSessionProperty_InputSources' "ist nur für USB-basierte Audio-Eingänge. Das ist bedauerlich, da es keine nicht veraltete Möglichkeit gibt, *** alle *** Audio-Eingänge über Core Foundation/C-Funktionen (die nicht Objective-C-spezifisch sind) zu erhalten. –

+0

@MichaelDautermann Vielen Dank, ich stimme zu, dass es bedauerlich ist, wenn man bedenkt, dass die Alternativen auf höherer Ebene mehr Overhead haben. – Bamsworld

+0

@MichaelDautermann und andere, können Sie mir sagen, welche Objective-C-Alternativen gibt es, um die Nicht-Kamera-Verbindung-Kit-Eingabegeräte zu erhalten? Ist es der von Shawn Hershey in seiner Antwort auf diese Frage erwähnte? –