我正在尝试在新的 M1 mac 上编写类似于 PhantomAudioDriver
或(基于它的 SoundFlower
)的音频内核扩展。
我构建了它,加载了它,我还可以将它设置为默认设备。
在初始化期间,我检查了每个部分,一切都初始化并创建,没有任何错误,但是当我在将虚拟设备设置为默认值的情况下播放某些内容时,它只是冻结。使用 QuickTime 播放器时,它什么也不做,但是当我尝试使用 vlc 播放视频时,它会冻结几秒钟,但它确实播放视频,没有音频。
在内核日志中我看到它确实启动了音频引擎:
kernel: (IOAudioFamily) engine started
因为 IOAudioFamily's
代码是开源的,所以我能够根据内核日志检查和分析我的代码,并且它按应有的方式工作并且不返回任何错误。
但几秒钟后,在内核日志中,我看到调用了引擎停止命令。 我能够确定它在此日志后开始关闭:
coreaudiod: (CoreAudio) HALS_IOContext::IOWorkLoop: could not establish a timeline after waiting 10000000 microseconds for context 214 <private>
你见过吗?不幸的是,HALS_IOContext's
代码不是开源的,我不明白为什么会这样。
在代码中:
wl = getWorkLoop();
if (!wl) {
goto Done;
}
timerEventSource = IOTimerEventSource::timerEventSource(this, timerFired);
if (!timerEventSource) {
goto Done;
}
所以它肯定不会失败得到工作循环。
之后,调用日志 IOAudioFamily's
停止命令并停止引擎并关闭客户端。
我看到 CoreAudio
错误:
coreaudiod: (CoreAudio) HALS_IOContext::StartIOThread: the IO thread failed to start, Error: 1852797029 (<private>)
QuickTime 播放器得到这个:
QuickTime Player: (CoreAudio) HALC_ProxyIOContext::IOWorkLoop: the server failed to start, Error: 0x6E6F7065
我还检查了启动和关闭客户端日志之间的日志(我认为那里没有任何有用和可理解的内容),也许我应该查看一些特定的进程日志?
此外,也许还有其他方法可以查看 HALS
源代码。
我非常感谢您的专业知识和帮助。