我有一个USB音频设备(PreSonus audiobox),希望能够在USB设备和默认输出设备(内置扬声器)之间切换程序的音频输出。苹果文档告诉我必须使用AUHAL:
如果您需要连接[..]默认输出设备以外的硬件设备,则需要使用AUHAL。
通常情况下,我会进行设备描述,然后查看是否存在。我写了一个函数来测试它:
-(OSStatus) showAUHALDevices
{
//Show all available AUHAL devices
// Create description
AudioComponentDescription test_desc;
test_desc.componentType = kAudioUnitType_Output;
test_desc.componentSubType = kAudioUnitSubType_HALOutput;
test_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
test_desc.componentFlags = 0;
test_desc.componentFlagsMask = 0;
// Determine number of available components
UInt32 count = AudioComponentCount(&test_desc);
// Print result
OSStatus err = noErr;
CFStringRef compName;
AudioComponent test_comp;
for (UInt32 i = 0; i < count; i++)
{
test_comp = AudioComponentFindNext(nil, &test_desc);
err = AudioComponentCopyName(test_comp, &compName);
NSLog(@"Audio component number %u/%u: %@", (i+1), count, compName);
}
return err;
}
这里的问题是我无法将test_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
设置为除Apple之外的其他制造商,因此USB设备显然不会显示在日志中打印的列表中。
我错过了什么?据我所知,这不是驱动程序问题。
提前致谢。
修改
我已将所有属性设置为零,但USB设备仍未显示在98个不同的组件之间。我可以用[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]
找到它,所以我可以将它设置为输入,但不能作为输出..
答案 0 :(得分:1)
componentManufacture
可以设置为零,将其视为通配符(可以componentType
和componentSubType
)。
//Show all available AUHAL devices
// Create description
AudioComponentDescription test_desc;
test_desc.componentType = kAudioUnitType_Output;
test_desc.componentSubType = kAudioUnitSubType_HALOutput;
test_desc.componentManufacturer = 0;
test_desc.componentFlags = 0;
test_desc.componentFlagsMask = 0;
此外,对于第一个参数始终传递AudioComponentFindNext
的方式,nil
的使用是错误的。第一个参数应该是您希望开始搜索的组件。您将在第一次传递nil,然后第二次传递第一次的结果,依此类推。
AudioComponent test_comp = nullptr;
for (UInt32 i = 0; i < count; i++)
{
test_comp = AudioComponentFindNext(test_comp, &test_desc);
...
}