MacOS 自定义音频驱动程序不处理我们的硬件音频流

问题描述 投票:0回答:1

我们正在为 USB 麦克风开发自定义音频驱动程序,以便对输入音频流进行简单处理 (EQ)(类似于 Windows 的 APO)。我们的代码基于 Apple 的 SimpleAudioDriver 示例,我们最终设法用我们的代码覆盖了原始驱动程序(再次感谢)。但是 I/O 缓冲区不会从我们的硬件设备流式传输或流式传输到我们的硬件设备。在 SimpleAudioDevice.cpp 文件中,我们尝试调试“input_buffer”(来自默认示例):

auto input_buffer = reinterpret_cast<int16_t*>(ivars->m_input_memory_map->GetAddress() + ivars->m_input_memory_map->GetOffset());

我们的猜测是,由于我们的设备现在已分配给我们的驱动程序,因此该缓冲区应该填充来自我们麦克风的音频数据,但事实并非如此。我们对 output_buffer 有相同的行为,我们用默认的正弦发生器填充它,我们没有在我们的驱动程序分配到的音频设备上输出任何音频。

文档说

AudioDriverKit 将这些流的内存映射到 Core Audio HAL。在实际的硬件驱动程序中,此内存需要与系统用于 DMA 到硬件的 I/O 内存相同。

但随后没有给出更多细节。如何访问这个“I/O 内存”并用它来处理我们的硬件输入/输出流?

如果您有任何提示,请回复我们。

谢谢。

macos audio core-audio iokit driverkit
1个回答
0
投票

我想知道您是否对 AudioDriverKit 的工作方式有一个不正确的心理模型:您的问题不是 100% 清楚,但听起来您希望框架已经在处理(USB 音频类兼容? ) 设备 I/O 适合你?如果是这样,你就在错误的层。 AudioDriverKit 用于实现低级音频驱动程序,并且不假设这是什么类型的设备 - PCI/Thunderbolt、USB、类兼容与否等。这意味着您正在编写 all 设备 I/O 代码,从您的代码发出单独的 USB 数据传输请求。

如果您想继续使用操作系统附带的类兼容驱动程序,但只想对音频样本执行预处理/后处理,则插件可能更合适。这里有很多不同的选项:

IOAudioEngineCoreAudioPlugIn
、Core Audio Units (AU)、
AppleUSBAudioPlugin
kexts 和潜在的音频服务器插件。哪一个是合适的选择,或者毕竟使用 AudioDriverKit 从头开始实现驱动程序是否真的是最好的选择取决于您项目的具体情况。

© www.soinside.com 2019 - 2024. All rights reserved.