kAudioDevicePropertyBufferFrameSizeRange返回{0,0}

时间:2017-06-08 19:27:46

标签: macos audio core-audio hal

我正在尝试使用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返回,表示成功。

如何正确查询硬件支持的可能缓冲区大小范围?

1 个答案:

答案 0 :(得分:0)

我不明白你的问题在哪里。我已经在我的MacBook上使用OS X Sierra尝试了你的代码并且效果很好。当我检查存储在BufferSizeRange中的结果时,我得到mMinimum = 14和mMaximum = 4096.

我刚刚更改了BufferSize的错误初始化(你编写的int32并不作为变量存在),我用null替换nullptr并设置了DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster当你&#39 ;要求知道谁是默认输出设备。

但是,我建议您使用AudioObjectGetPropertyDataSize直接向CoreAudio询问您想要知道的属性的大小,并检查if语句函数的返回值。