Macos 如何在Mac OS X上使用核心音频API以编程方式设置扬声器配置?
我有一个7.1声道音频输出设备和一个定制的kext来驱动它。我的自定义应用程序需要向设备发送7.1后声道音频数据,但设备仅接收2声道音频数据。我选中了“音频MIDI设置”应用程序中的“配置扬声器”选项,它被设置为立体声。当我将其设置为“7.1后环绕”时,一切正常。在我的最终产品中,我不希望用户必须手动完成所有这些操作。所以,问题是-是否有任何核心音频API或任何其他编程方式Macos 如何在Mac OS X上使用核心音频API以编程方式设置扬声器配置?,macos,core-audio,iokit,kernel-extension,Macos,Core Audio,Iokit,Kernel Extension,我有一个7.1声道音频输出设备和一个定制的kext来驱动它。我的自定义应用程序需要向设备发送7.1后声道音频数据,但设备仅接收2声道音频数据。我选中了“音频MIDI设置”应用程序中的“配置扬声器”选项,它被设置为立体声。当我将其设置为“7.1后环绕”时,一切正常。在我的最终产品中,我不希望用户必须手动完成所有这些操作。所以,问题是-是否有任何核心音频API或任何其他编程方式 好的,在玩了一些核心音频API之后,我终于可以完成这项工作了 获取AudioDeviceID: AudioDeviceID
好的,在玩了一些核心音频API之后,我终于可以完成这项工作了
AudioDeviceID audioDevice = getMyAwesomeDeviceID();
AudioObjectPropertyAddress propertyAddress;
propertyAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout;
propertyAddress.mScope = kAudioDevicePropertyScopeOutput;
propertyAddress.mElement = kAudioObjectPropertyElementMaster;
AudioObjectHasProperty(audioDevice, &propertyAddress)
UInt32 propSize(0);
AudioObjectGetPropertyDataSize(audioDevice, &propertyAddress, 0, NULL, &propSize);
AudioChannelLayout* layout = (AudioChannelLayout*)malloc(propSize);
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;
}
AudioObjectSetPropertyData(audioDevice, &propertyAddress, 0, NULL, propSize, layout);