我正在使用支持输入的 AUHAL 音频单元从我的内部 imac 麦克风接收输入。这有效(在我的回调中,我将样本写入文件并产生了完美的录音)。
现在, 因为输入 AUHAL 的采样率可能与它连接到 的设备没有不同,我希望我的音频单元对设备上的采样率变化使用react。为了测试这一点,我在 Audio Midi Setup 中更改了麦克风的采样率(实际上,AUHAL 崩溃了)。
我已经使用 AudioObjectAddPropertyListener
和 kAudioDevicePropertyNominalSampleRate
注册了一个回调,但它从未被调用。我的断点没有中断,并且 "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);
最佳答案
kAudioDevicePropertyNominalSampleRate
和 kAudioObjectPropertyScopeGlobal
的组合将使回调正常工作。不过,这个选择器 (CoreAudio/AudioHardware.h) 的文档并没有告诉我使用什么范围。如果有人为此找到证据/原因的来源,请随时进行编辑。
这种情况也令人困惑,因为使用 AudioObjectSetPropertyData()
和 kAudioDevicePropertyNominalSampleRate
或 kAudioObjectPropertyScopeInput
调用 kAudioObjectPropertyScopeOutput
将 和 导致成功的采样率切换(有人可能认为这是错误的行为)。
关于c++ - 用于 kAudioDevicePropertyNominalSampleRate 的 AudioObjectAddPropertyListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40046557/