默认音频输出 - 获取设备更改通知? (CoreAudio,Mac OS X,AudioHardwareAddPropertyListener)
问题描述:
我正在尝试使用CoreAudio API为默认音频输出更改(例如:耳机插孔插入)编写监听器。我发现示例代码,虽然有点旧,并使用不推荐使用的函数(http://developer.apple.com/mac/library/samplecode/AudioDeviceNotify/Introduction/Intro.html,但它没有工作。重新编写代码以正确的方式使用AudioHardwareAddPropertyListener方法,但它似乎并不奏效。当我插入耳机时,我注册的函数没有被触发。我在这里有点损失...我怀疑问题可能打下一些别的地方,但我想不通的地方......默认音频输出 - 获取设备更改通知? (CoreAudio,Mac OS X,AudioHardwareAddPropertyListener)
监听器注册代码:
OSStatus err = noErr;
AudioObjectPropertyAddress audioDevicesAddress = { kAudioHardwarePropertyDefaultOutputDevice, KAudioObjectPropertyScopeGlobal, KAudioObjectPropertyElementMaster };
err = AudioObjectAddPropertyListener (KAudioObjectAudioSystemObject, &AudioDevicesAddress, coreaudio_property_listener, NULL);
if (err) trace ("error on AudioObjectAddPropertyListener");
答
对于所使用的CoreAudio的API项目在SourceForge上搜索后,我找到了rtaudio项目,更重要的是这些行:
// This is a largely undocumented but absolutely necessary
// requirement starting with OS-X 10.6. If not called, queries and
// updates to various audio device properties are not handled
// correctly.
CFRunLoopRef theRunLoop = NULL;
AudioObjectPropertyAddress property = { kAudioHardwarePropertyRunLoop,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster };
OSStatus result = AudioObjectSetPropertyData(kAudioObjectSystemObject, &property, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop);
if (result != noErr) {
errorText_ = "RtApiCore::RtApiCore: error setting run loop property!";
error(RtError::WARNING);
}
添加此代码后,我甚至不需要自己注册监听器。
答
尝试CFRunLoopRun()
- 它具有相同的效果。即确保正在调用监听器的事件循环正在运行。