AudioObjectAddPropertyListener for kAudioDevicePropertyNomin

AudioObjectAddPropertyListener for kAudioDevicePropertyNominalSampleRate

本文关键字:kAudioDevicePropertyNomin for AudioObjectAddPropertyListener      更新时间:2023-10-16

我使用支持输入的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)没有告诉我使用什么作用域。如果有人找到证据来源或原因,请随时编辑。

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

相关文章:
  • 没有找到相关文章