相关疑难解决方法(0)

Mac OS X虚拟音频驱动程序

我想创建一个虚拟音频设备,从默认输出(输出IOAudioStream)获取音频数据,并将其转换为输入IOAudioStream.

我查看了我能找到的大多数示例,但是它们只实现了一个功能,可以将输出IOAudioStream最多复制到输入端.这意味着如果选择音频设备作为输出,它仅将音频转换为输入流.

这应该是可能的,因为ScreenFlow允许通过安装创建虚拟驱动程序的kext来记录计算机音频.

如何从默认输出访问音频数据并将其发送到我的虚拟驱动程序?

audio macos kernel driver

26
推荐指数
2
解决办法
3万
查看次数

如何从聚合 CoreAudio 设备中排除输入或输出通道?

我有一个基于 CoreAudio 的 MacOS/X 程序,允许用户选择输入音频设备和输出音频设备,并且(如果用户没有为输入和输出选择相同的设备)我的程序创建一个私有聚合音频设备,并使用它来接收音频、处理它,然后将其发送出去进行播放。

这一切都很好,但有一个小问题 - 如果所选输入设备也有一些与其硬件关联的输出,这些输出将显示为聚合设备输出通道的一部分,这不是我想要的行为。同样,如果选定的输出设备也有一些与其硬件关联的输入,这些输入将在聚合设备的输入中显示为输入通道,这也是我不希望的。

我的问题是,有没有办法告诉 CoreAudio 不要在我正在构建的聚合设备中包含子设备的输入或输出?(我的后备解决方案是修改我的音频渲染回调以忽略不需要的音频通道,但这似乎不太优雅,所以我很好奇是否有更好的方法来处理它)

我创建聚合设备的函数如下(如果相关的话):

// This code was adapted from the example code at :  https://web.archive.org/web/20140716012404/http://daveaddey.com/?p=51
ConstCoreAudioDeviceRef CoreAudioDevice :: CreateAggregateDevice(const ConstCoreAudioDeviceInfoRef & inputCadi, const ConstCoreAudioDeviceInfoRef & outputCadi, bool require96kHz, int32 optRequiredBufferSizeFrames)
{
   OSStatus osErr = noErr;
   UInt32 outSize;
   Boolean outWritable;

   //-----------------------
   // Start to create a new aggregate by getting the base audio hardware plugin
   //-----------------------

   osErr = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyPlugInForBundleID, &outSize, &outWritable);
   if (osErr != noErr) return ConstCoreAudioDeviceRef();

   AudioValueTranslation pluginAVT;

   CFStringRef inBundleRef = …
Run Code Online (Sandbox Code Playgroud)

macos core-audio

5
推荐指数
1
解决办法
2154
查看次数

将低延迟音频从一个 CoreAudio 设备路由到另一台

首先,一些背景信息:我正在编写一个 MacOS/X 应用程序,它使用 CoreAudio 从 CoreAudio 设备的输入流接收音频信号,对音频进行一些实时处理,然后将其发送回该 CoreAudio 设备的输出流供用户收听。

此应用程序使用较低级别的 CoreAudio API(即AudioDeviceAddIOProcAudioDeviceStart等,而不是 AudioUnit)来获取对用户指定的 CoreAudio 设备的独占访问权限,将其设置为所需的采样率 (96kHz),然后执行其操作。它运行得很好,我对其性能非常满意。

然而,我的程序目前有一个限制——它一次只能使用一个 CoreAudio 设备。我想要做的是扩展我的应用程序,以便用户可以彼此独立地选择他的“输入 CoreAudio 设备”和“输出 CoreAudio 设备”,而不是仅限于使用一个同时提供两个功能的 CoreAudio 设备。输入音频源和输出音频接收器。

我的问题是,推荐的技术是什么?我可以要求两个 CoreAudio 设备设置为相同的采样率,但即使我这样做了,我想我也必须处理各种问题,例如:

  • 集成AudioDeviceStart()来自两个设备的单独启动的回调,我怀疑这些回调不会以任何明确定义的顺序调用,甚至可能会彼此同时调用(?)。我需要以某种方式将音频从一个回调传递到另一个回调,理想情况下不会显着增加音频延迟。

  • 处理两个设备采样时钟速率的差异。例如,即使两个设备名义上都设置为 96kHz 采样率,我怀疑实际上可能是这样的情况,例如上游设备以 95.99999kHz 生成样本,而下游设备以 96.000001kHz 消耗样本(反之亦然),并且这最终会导致我在给定的渲染回调期间得到“不够”或“太多”的样本来供给下游设备,从而导致故障。

  • 我还没有考虑过的其他问题

其他 MacOS/X 程序如何处理这些问题?

macos core-audio

4
推荐指数
1
解决办法
1551
查看次数

标签 统计

macos ×3

core-audio ×2

audio ×1

driver ×1

kernel ×1