Well, after playing with some Core Audio APIs, finally I could do it.
Get AudioDeviceID:
AudioDeviceID audioDevice = getMyAwesomeDeviceID();
Create the AudioObjectPropertyAddress attribute:
AudioObjectPropertyAddress propertyAddress; propertyAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout; propertyAddress.mScope = kAudioDevicePropertyScopeOutput; propertyAddress.mElement = kAudioObjectPropertyElementMaster;
Request if an audio object has this property:
AudioObjectHasProperty(audioDevice, &propertyAddress)
Get the data size of this property and create an AudioChannelLayout:
UInt32 propSize(0); AudioObjectGetPropertyDataSize(audioDevice, &propertyAddress, 0, NULL, &propSize); AudioChannelLayout* layout = (AudioChannelLayout*)malloc(propSize);
Configure the structure of AudioChannelLayout (for example: stereo layout):
AudioChannelLabel labels[2] = {kAudioChannelLabel_Right, kAudioChannelLabel_Left}; layout->mNumberChannelDescriptions = 2; for (UInt32 i = 2; i < layout->mNumberChannelDescriptions; i++) { layout->mChannelDescriptions[i].mChannelLabel = labels[i]; layout->mChannelDescriptions[i].mChannelFlags = kAudioChannelFlags_AllOff; }
Set the properties of the AudioObject:
AudioObjectSetPropertyData(audioDevice, &propertyAddress, 0, NULL, propSize, layout);
source share