核心音频中如何选择音频输入设备?

发布于 2024-09-08 10:07:11 字数 241 浏览 5 评论 0原文

我正在编写一个需要处理多个音频输入的程序。

我目前正在使用 AudioQueues 来获取输入,但这仅来自默认输入设备。

有没有办法:

  • 选择 AudioQueues 使用的输入设备。
  • 更改默认输入设备。

我知道我可以在 Core-Audio 中使用 kAudioHardwarePropertyDevices 来获取输出设备列表,是否有类似的可以用于输入设备?

I am writing a program that needs to deal with multiple audio inputs.

I am currently using AudioQueues to get the input, but this is only from the default input device.

Is there any way to either:

  • Select which input device the AudioQueues use.
  • Change the default input device.

I know that I can use kAudioHardwarePropertyDevices in Core-Audio to get a list of output devices, is there a similar one I can use for input devices?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乖乖 2024-09-15 10:07:11

我绞尽脑汁思考如何做到这一点,最后终于弄清楚了:

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 参数值。

I banged my head against how to do this for a while, and finally figured it out:

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;
}

As you can see, the key part is to use the ScopeInput/ScopeOutput parameter values.

风向决定发型 2024-09-15 10:07:11

kAudioHardwarePropertyDevices 用于输出和输入设备。设备可以同时具有输入和输出通道,或者可以仅具有输入或输出通道。

大多数 AudioDevice... 函数都采用布尔 isInput 参数,以便您可以查询设备的输入端。

kAudioHardwarePropertyDevices is used for both output and input devices. Devices can have both input and output channels, or can have only input or output channels.

Most of the AudioDevice... functions take a Boolean isInput parameter so that you ca query the input side of the device.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文