我有一个 7.1 声道音频输出设备和一个自定义 kext 来驱动它。我的自定义应用程序需要向设备发送 7.1 后声道音频数据,但设备仅接收 2 声道音频数据。我检查了“音频 MIDI 设置”应用程序中的“配置扬声器”选项,它设置为立体声。当我将其设置为“7.1 后环绕”时,一切正常。在我的最终产品中,我不希望用户必须手动完成所有这些操作。所以,问题是 - 是否有任何核心音频 API 或任何其他以编程方式执行此操作的方法?
问问题
1818 次
1 回答
5
好的,在玩了一些 Core Audio API 之后,我终于可以完成了。
获取 AudioDeviceID:
AudioDeviceID audioDevice = getMyAwesomeDeviceID();
创建一个 AudioObjectPropertyAddress:
AudioObjectPropertyAddress propertyAddress; propertyAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout; propertyAddress.mScope = kAudioDevicePropertyScopeOutput; propertyAddress.mElement = kAudioObjectPropertyElementMaster;
查询音频对象是否有这个属性:
AudioObjectHasProperty(audioDevice, &propertyAddress)
获取此属性的数据大小并创建 AudioChannelLayout:
UInt32 propSize(0); AudioObjectGetPropertyDataSize(audioDevice, &propertyAddress, 0, NULL, &propSize); AudioChannelLayout* layout = (AudioChannelLayout*)malloc(propSize);
配置您的 AudioChannelLayout 结构(例如:立体声布局):
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; }
设置 AudioObject 属性数据:
AudioObjectSetPropertyData(audioDevice, &propertyAddress, 0, NULL, propSize, layout);
于 2013-05-28T06:59:44.197 回答