AUHAL带USB音频设备

时间:2015-08-19 12:27:30

标签: objective-c macos audio

我有一个USB音频设备(PreSonus audiobox),希望能够在USB设备和默认输出设备(内置扬声器)之间切换程序的音频输出。苹果文档告诉我必须使用AUHAL:

  

如果您需要连接[..]默认输出设备以外的硬件设备,则需要使用AUHAL。

Source

通常情况下,我会进行设备描述,然后查看是否存在。我写了一个函数来测试它:

-(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]找到它,所以我可以将它设置为输入,但不能作为输出..

1 个答案:

答案 0 :(得分:1)

componentManufacture可以设置为零,将其视为通配符(可以componentTypecomponentSubType)。

//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);
    ...
}