我正在尝试使用CoreAudio在MacOS硬件上获得预期的缓冲区大小。我目前的策略基于this technical note。
代码实现如下:
AudioObjectID DeviceAudioObjectID;
AudioObjectPropertyAddress DevicePropertyAddress;
UInt32 AudioDeviceQuerySize;
OSStatus Status;
int32 BufferSize = 0;
//Get Audio Device ID
DevicePropertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
DevicePropertyAddress.mScope = kAudioObjectPropertyScopeGlobal;
DevicePropertyAddress.mElement = 0;
AudioDeviceQuerySize = sizeof(AudioDeviceID);
Status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &DevicePropertyAddress, 0, nullptr, &AudioDeviceQuerySize, &DeviceAudioObjectID);
DevicePropertyAddress.mSelector = kAudioDevicePropertyBufferFrameSizeRange;
DevicePropertyAddress.mScope = kAudioObjectPropertyScopeGlobal;
DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster;
AudioValueRange BufferSizeRange = { 0, 0 };
AudioDeviceQuerySize = sizeof(AudioValueRange);
Status = AudioObjectGetPropertyData(DeviceAudioObjectID, &DevicePropertyAddress, 0, nullptr, &AudioDeviceQuerySize, &BufferSizeRange);
在我当前的Mac(运行Sierra的Mac Pro)上,最后调用AudioObjectGetPropertyData
会导致BufferSizeRange
显式设置为{ 0, 0 }
。呼叫以0
返回,表示成功。
如何正确查询硬件支持的可能缓冲区大小范围?
答案 0 :(得分:0)
我不明白你的问题在哪里。我已经在我的MacBook上使用OS X Sierra尝试了你的代码并且效果很好。当我检查存储在BufferSizeRange中的结果时,我得到mMinimum = 14和mMaximum = 4096.
我刚刚更改了BufferSize的错误初始化(你编写的int32并不作为变量存在),我用null替换nullptr并设置了DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster当你&#39 ;要求知道谁是默认输出设备。
但是,我建议您使用AudioObjectGetPropertyDataSize直接向CoreAudio询问您想要知道的属性的大小,并检查if语句函数的返回值。