AudioObjectAddPropertyListener

AudioObjectAddPropertyListener

我正在使用支持输入的 AUHAL 音频单元从我的内部 imac 麦克风接收输入。这有效(在我的回调中,我将样本写入文件并产生了完美的录音)。

现在, 因为输入 AUHAL 的采样率可能与它连接到 的设备没有不同,我希望我的音频单元对设备上的采样率变化使用react。为了测试这一点,我在 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) 的文档并没有告诉我使用什么范围。如果有人为此找到证据/原因的来源,请随时进行编辑。

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

关于c++ - 用于 kAudioDevicePropertyNominalSampleRate 的 AudioObjectAddPropertyListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40046557/

10-14 11:15