Как вы выбираете устройство ввода звука в ядре аудио? - PullRequest
4 голосов
/ 08 июля 2010

Я пишу программу, которая должна работать с несколькими аудиовходами.

В настоящее время я использую AudioQueues для получения ввода, но это только с устройства ввода по умолчанию.

Есть ли способ либо:

  • Выберите, какое устройство ввода используют AudioQueues.
  • Изменить устройство ввода по умолчанию.

Я знаю, что могу использовать kAudioHardwarePropertyDevices в Core-Audio, чтобы получить список устройств вывода, есть ли аналогичное устройство, которое можно использовать для устройств ввода?

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

kAudioHardwarePropertyDevices используется как для устройств вывода, так и для устройств ввода. Устройства могут иметь как входные, так и выходные каналы, или могут иметь только входные или выходные каналы.

Большинство функций AudioDevice ... принимают логический параметр isInput, чтобы можно было запрашивать входную сторону устройства.

1 голос
/ 03 декабря 2011

Я немного ударился головой, как это сделать, и наконец понял:

BOOL isMic = NO;
BOOL isSpeaker = NO;

AudioDeviceID device        = audioDevices[i];

// Determine direction of the device by asking for the number of input or 
// output streams.
propertyAddress.mSelector   = kAudioDevicePropertyStreams;
propertyAddress.mScope      = kAudioDevicePropertyScopeInput;

UInt32 dataSize             = 0;
OSStatus status             = AudioObjectGetPropertyDataSize(device, 
                                                             &propertyAddress, 
                                                             0, 
                                                             NULL, 
                                                             &dataSize);        
UInt32 streamCount          = dataSize / sizeof(AudioStreamID);

if (streamCount > 0) 
{
    isMic = YES;
}

propertyAddress.mScope  = kAudioDevicePropertyScopeOutput;      
dataSize                = 0;
status                  = AudioObjectGetPropertyDataSize(device, 
                                                         &propertyAddress, 
                                                         0, 
                                                         NULL,  
                                                         &dataSize);        
streamCount             = dataSize / sizeof(AudioStreamID);

if (streamCount > 0) 
{
    isSpeaker = YES;
}

Как видите, ключевой момент заключается в использовании значений параметров ScopeInput / ScopeOutput.

...