macos - CoreAudio AudioQueue |如何从网络流式传输到macOS上的特定Audio Server插件设备?

标签 macos audio core-audio hal audioqueue

我对macOS编程比较陌生,但对一般编程却不是。我宁愿使用(Objective)C / C++而不是Swift。我需要打开一个特定的音频设备进行输出,并将音频数据的实时流从网络传输到输出设备。该设备具有自定义的音频服务器插件驱动程序,我们已为其提供源。尝试从Apple文档中找出执行这些操作需要调用的内容,我感到非常愚蠢。任何人都可以帮助回答以下问题:

1)有哪些合适的API可以用来做到这一点?我以为我需要CoreAudio和AudioQueue,但我对此一无所知。对类似示例应用的任何引用将不胜感激。推荐书也将不胜感激。

2)如何打开特定的自定义驱动程序进行输出?它是否与我在驱动程序代码中看到的UUID有关,还是通过其他方式识别了驱动程序?我需要我的程序来查找自定义驱动程序,而无需任何人工帮助,例如从选择列表中进行选择。

3)一个愚蠢的问题,因为我在所查看的应用程序示例中尚未看到清晰的示例:我下载了CAPlayThrough应用程序(https://developer.apple.com/library/archive/samplecode/CAPlayThrough/Introduction/Intro.html)并对其有所了解,但我并不特别了解。如何将我的“推送”内存数据从网络写入输出设备?我是否需要使用某种类型的回调,该回调从写入网络实时流的环形缓冲区读取?

附录:

2020年3月24日基于进一步的研究,我已经回答了我的主要问题,但是仍然存在我认为超出范围的问题。我将在下面给出我的答案,并提出一个新问题。

最佳答案

1) What are some of the appropriate APIs to use to do this?



核心音频API会很好。请参阅AudioDeviceCreateIOProcID中的AudioDeviceStartCoreAudio/AudioHardware.h。由于某些原因,Apple文档站点没有适用于他们的文档,因此您必须在头文件中找到它。

或者,您可以使用 AVAudioEngine 。 (但不是AVAudioPlayer。)

根据您的其他要求,使用现有程序(例如GStreamer或VLC)可能会更容易。

Any references to similar example applications would be appreciated.


CAPlayThrough可能是一个不错的起点,但它使用了AUGraph,但已弃用。我不确定您是否需要它用来调节采样率差异的变速音频单元,但是至少可以在没有它的情况下开始使用。

看起来它在不使用AUGraph的情况下做了类似的事情:https://github.com/pje/WavTap/blob/master/App/AudioTee.cpp

How do I open my specific, custom driver for output?



驱动程序将发布音频输出设备,并且该设备将具有一个名为kAudioDevicePropertyModelUID的属性(请参见AudioHardwareBase.h),并且应具有一个恒定值。您可以通过双击HALLab中的设备进行检查。

您的程序可以使用AudioObjectGetPropertyData来获取“音频系统对象”(kAudioHardwarePropertyDevices)的kAudioObjectSystemObject属性,然后获取每个设备的kAudioDevicePropertyModelUID属性。

如果您使用的是C++,则可能需要使用Public Utility classes来帮助实现这一点。

Does it have something to do with the UUID I see in the driver code, or is the driver identified some other way?



该驱动程序由其 bundle 软件ID标识。您可以将kAudioHardwarePropertyPlugInForBundleID属性用于表示驱动程序(即插件)的音频对象的AudioObjectID。您也可以通过插件对象找到设备。

How do I write my "pushed" in-memory data from the network to the output device? Do I need to use some kind of callback that reads from a ring buffer that the network live stream is written to?



传递给AudioDeviceCreateIOProcID的函数将在每个IO周期被调用,并为该周期的样本提供一个缓冲区。

关于macos - CoreAudio AudioQueue |如何从网络流式传输到macOS上的特定Audio Server插件设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780591/

相关文章:

java - 背景音乐线程在游戏中死亡而不是暂停

javascript - MIDI.js 音符持续时间不会改变

ios - ExtAudioFileRead 有时会在读取时抛出异常

ios - 音频 CMSampleBuffer 格式

ios - 麦克风输入到 iOS 中的扬声器输出?

python - 使用 Python 共享内存的段错误

objective-c - NSTextField:integerValue 行为不一致

c# - 使用Windows.Media.Audio在UWP之上播放更多声音文件

macos - 如何 cd 到 Mac OSX 终端中的别名目录

python - 从命令行运行已安装的 python 包