kAudioDevicePropertyNominalSampleRate 的 AudioObjectAddPropertyListener

AudioObjectAddPropertyListener for kAudioDevicePropertyNominalSampleRate

我正在使用启用输入的 AUHAL 音频单元接收来自我的内置 imac 麦克风的输入。这行得通(在我的回调中,我将样本写入文件并产生了完美的录音)。

现在,因为输入 AUHAL 的采样率可能与其连接的设备不同,我希望我的音频单元对设备上的采样率变化做出反应.为了测试这一点,我在 Audio Midi Setup 中更改了麦克风的采样率(实际上,AUHAL 崩溃了)。

我已经使用 AudioObjectAddPropertyListenerkAudioDevicePropertyNominalSampleRate 注册了一个回调,但它从未被调用过。我的断点不会中断,并且 "callback" 永远不会出现在我的控制台上。有人可以指出我做错了什么吗?我用错范围了吗?选择器错误?

将选择器更改为 kAudioDevicePropertyVolumeScalar 会触发回调(当然是在更改音量时),所以我假设设置回调本身工作正常。

static OSStatus deviceSampleRateChanged(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress* inAddresses, void* __nullable inClientData)
{
    cout << "callback" << endl;
    return noErr;
}

AudioObjectPropertyAddress address;
address.mSelector = kAudioDevicePropertyNominalSampleRate;
address.mScope = kAudioObjectPropertyScopeInput;
address.mElement = kAudioObjectPropertyElementMaster;

AudioObjectAddPropertyListener(unit, &address, &deviceSampleRateChanged, this);

kAudioDevicePropertyNominalSampleRatekAudioObjectPropertyScopeGlobal 的组合将使回调正常工作。不过,这个选择器 (CoreAudio/AudioHardware.h) 的文档没有告诉我要使用什么范围。如果有人为此找到 proof/reason 的来源,请随时编辑。

情况也令人困惑,因为用 kAudioDevicePropertyNominalSampleRate 调用 AudioObjectSetPropertyData() 并且 kAudioObjectPropertyScopeInputkAudioObjectPropertyScopeOutput 导致成功的采样率切换(有人可能会认为这是错误行为)。