蓝牙设备制造商的 OSX CoreAudio 查询返回 NULL - 我有啥办法可以参考此设备的 AudioComponentFindNext?

Posted

技术标签:

【中文标题】蓝牙设备制造商的 OSX CoreAudio 查询返回 NULL - 我有啥办法可以参考此设备的 AudioComponentFindNext?【英文标题】:OSX CoreAudio query for bluetooth device manufacturer returns NULL - is there any way for me to then reference this device for AudioComponentFindNext?蓝牙设备制造商的 OSX CoreAudio 查询返回 NULL - 我有什么办法可以参考此设备的 AudioComponentFindNext? 【发布时间】:2017-08-16 18:42:44 【问题描述】:

我正在查询 osx 中的所有活动输入设备,然后尝试使用 AudioUnit 通过蓝牙设备(如果已连接)播放音频。

我有一个蓝牙设备,它返回 UID 和设备名称,但无法返回设备制造商 (kAudioObjectPropertyManufacturer)。

在阅读 Apple 文档时,我看到了 The unique vendor identifier, registered with Apple, for the audio component,所以我必须假设供应商没有费心在 Apple 注册。

如果没有制造商,我不确定如何选择设备。我继承的代码启用了这样的音频:

AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO; // 'vpio'
desc.componentManufacturer = manufacturerName;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

AudioComponent comp = AudioComponentFindNext(NULL, &desc);
OSStatus error = AudioComponentInstanceNew(comp, &myAudioUnit);

有没有办法在没有设备制造商的情况下创建AudioUnit?或者更好的是,有没有办法使用当前输入/输出音频设备设置的任何内容来创建AudioUnit

【问题讨论】:

【参考方案1】:

如果您有设备的 UID,您可以将其转换为设备 ID:

// deviceUID is a CFStringRef

AudioDeviceID deviceID = kAudioDeviceUnknown;

AudioObjectPropertyAddress propertyAddress = 
    .mSelector  = kAudioHardwarePropertyDeviceForUID,
    .mScope     = kAudioObjectPropertyScopeGlobal,
    .mElement   = kAudioObjectPropertyElementMaster
;

AudioValueTranslation translation = 
    &deviceUID, sizeof(deviceUID),
    &deviceID, sizeof(deviceID)
;

UInt32 specifierSize = sizeof(translation);

auto result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, nullptr, &specifierSize, &translation);
if(kAudioHardwareNoError != result) 
    // Handle error


if(kAudioDeviceUnknown == deviceID)
    // The device isn't connected or doesn't exist

您可以从那里将 AU 的 kAudioOutputUnitProperty_CurrentDevice 设置为 deviceID

【讨论】:

以上是关于蓝牙设备制造商的 OSX CoreAudio 查询返回 NULL - 我有啥办法可以参考此设备的 AudioComponentFindNext?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CoreAudio 以编程方式在 Swift 中创建聚合音频设备

OSX:用于设置 IO 缓冲区长度的 CoreAudio API?

OSX CoreAudio 麦克风输入静音与将音量设置为 0.0f

蓝牙终端设备能否限制可以连接的应用程序?

iPhone to iPhone Ready 蓝牙设备

关于BLE需要知道的