AUGraph中的HALOutput选择并配置特定的输出设备

时间:2014-05-23 19:21:01

标签: macos core-audio

我成功地设法构建了一个复杂的AUGraph,我能够在运行中重新配置,而且一切运行良好。

我现在面对的是一个看似非常简单的任务:选择一个特殊的输出设备。

我可以通过以下帖子获取deviceUID和ID:AudioObjectGetPropertyData to get a list of input devices(我已修改以获取输出设备)和下面的代码(我不能这样做)记得遗憾的是我在哪里发现了它

- (AudioDeviceID) deviceIDWithUID:(NSString *)uid
{
AudioDeviceID myDevice;
AudioValueTranslation trans;

CFStringRef *myKnownUID = (__bridge CFStringRef *)uid;
trans.mInputData = &myKnownUID;

trans.mInputDataSize = sizeof (CFStringRef);
trans.mOutputData = &myDevice;
trans.mOutputDataSize = sizeof(AudioDeviceID);

UInt32 size = sizeof (AudioValueTranslation);
AudioHardwareGetProperty (kAudioHardwarePropertyDeviceForUID,
                          &size,
                          &trans);

return myDevice;

}

我从这个存储在NSDictionary中的方法获取AudioDeviceID。我可以NSLog它,当我用十六进制转换它时,它给了我正确的ID,在HALLab中找到。

但是当我配置我的设备时(请参阅下面的代码),图表仅在默认设备上播放(在“声音偏好设置”中选择的设备)。

    AudioComponent comp = AudioComponentFindNext(NULL, &_componentDescription);

    if (comp == NULL) {
        printf ("Can't get output unit");
        exit (-1);
    }

    CheckError(AudioComponentInstanceNew(comp, &_auUnit),
               "Couldn't open component for output Unit");

    UInt32 disableFlag = 0;
    UInt32 enableFlag = 1;
    AudioUnitScope outputBus = 0;
    AudioUnitScope inputBus = 1;

    CheckError (AudioUnitSetProperty(_auUnit,
                                     kAudioOutputUnitProperty_EnableIO,
                                     kAudioUnitScope_Output,
                                     outputBus,
                                     &enableFlag,
                                     sizeof(enableFlag)), "AudioUnitSetProperty[kAudioOutputUnitProperty_EnableIO] failed - enable Output");

    CheckError (AudioUnitSetProperty(_auUnit,
                                     kAudioOutputUnitProperty_EnableIO,
                                     kAudioUnitScope_Input,
                                     inputBus,
                                     &disableFlag,
                                     sizeof(disableFlag)), "AudioUnitSetProperty[kAudioOutputUnitProperty_EnableIO] failed - disable Input");

    AudioDeviceID devID = (AudioDeviceID)[[[_devices objectAtIndex:0] objectForKey:@"deviceID"] unsignedIntValue];

    CheckError(AudioUnitSetProperty(_auUnit,
                                    kAudioOutputUnitProperty_CurrentDevice,
                                    kAudioUnitScope_Output,
                                    0,
                                    &devID,
                                    sizeof(AudioDeviceID)), "AudioUnitSetProperty[kAudioOutputUnitProperty_CurrentDevice] failed");

AUGraph已经配置了所有单元,节点已连接,并且已打开。我究竟做错了什么 ?

我将非常感谢解决这个问题的任何线索。

0 个答案:

没有答案