HALOutput в AUGraph выбрать и настроить конкретное устройство вывода
Мне удалось построить комплексный AUGraph, который я могу перенастроить на лету, и все работает хорошо.
Сейчас я стою перед стеной с тем, что кажется очень простой задачей: выбрать отдельное устройство вывода.
Я могу получить deviceUID и ID благодаря этому сообщению: AudioObjectGetPropertyData, чтобы получить список устройств ввода (которые я изменил, чтобы получить устройства вывода) и код ниже (я не могу вспомнить, где я нашел это, к сожалению)
- (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;
}
Я получаю AudioDeviceID от этого метода, который я храню в NSDictionary. Я могу NSLog это и когда я преобразовываю это в шестнадцатеричное, это дает мне правильный идентификатор, найденный в 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 уже настроен со всеми модулями, узлы подключены, и он открыт. Что я делаю неправильно?
Я был бы очень признателен за любую подсказку, чтобы решить эту проблему.