Macos CoreAudio:当连接到10.6的基础上时,设备计数中断

Macos CoreAudio:当连接到10.6的基础上时,设备计数中断,macos,core-audio,Macos,Core Audio,我有一个C++/Objective-C混合项目,它使用AudioObjectGetPropertyDataSize获取插入的音频设备(如USB耳机)的数量。此API在某些情况下似乎不起作用。例如,在10.5上它可以工作,但在10.6上它无法检测新的USB耳机何时插入 我已经把这个问题简化为一小段代码来重现这个问题(它在循环中调用AudioObjectGetPropertyDataSize)。该代码将工作在10.6(即,它将检测当设备插入/拔出)时,它只链接到CopeAudio,但一旦你与基础链接

我有一个C++/Objective-C混合项目,它使用AudioObjectGetPropertyDataSize获取插入的音频设备(如USB耳机)的数量。此API在某些情况下似乎不起作用。例如,在10.5上它可以工作,但在10.6上它无法检测新的USB耳机何时插入

我已经把这个问题简化为一小段代码来重现这个问题(它在循环中调用AudioObjectGetPropertyDataSize)。该代码将工作在10.6(即,它将检测当设备插入/拔出)时,它只链接到CopeAudio,但一旦你与基础链接,它将停止工作。< /P> 我不明白链接到一个框架怎么会破坏原本可以工作的代码

以下是代码(coreaudio test.cpp):


对这种奇怪的行为有什么想法吗?(顺便说一句,我也把这个问题贴在了。)

相关行为,就像9年前有人报告: 核心音频列表。我们需要告诉CoreAudio分配自己的事件调度线程:

CFRunLoopRef theRunLoop =  NULL;
AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
AudioObjectSetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop);
我怀疑发生的事情是,当程序链接到基础时,CORIODION假定主线程充当事件调度器循环(非常常见,因为Objto-C通常用于GUI程序)。当不链接到基础时,我猜它需要分配它自己的事件线程。< /P>
LFLAGS= -framework CoreAudio

all: coreaudio-test coreaudio-test.broken

# create a test that works
coreaudio-test: coreaudio-test.cpp
    g++ -o $@ $^ $(LFLAGS)

# linking to foundation will break the test
coreaudio-test.broken: coreaudio-test.cpp
    g++ -o $@ $^ $(LFLAGS) -framework Foundation
CFRunLoopRef theRunLoop =  NULL;
AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
AudioObjectSetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop);