【问题标题】:How can I pass custom data into a MTAudioProcessingTapProcessCallback?如何将自定义数据传递到 MTAudioProcessingTapProcessCallback?
【发布时间】:2018-10-31 14:01:55
【问题描述】:

我在 MacOS 上的 Swift 中成功使用 MTAudioProcessingTap 来操纵我的音频路由以进行实时播放和导出。但是,在运行时应该发生的具体路由取决于用户的选择。我想要做的是在创建分接头时将一对 Ints 传递给 MTAudioProcessingTapProcessCallback,以便我可以使用单个回调定义,该定义可以使用这些 Ints 来确定如何进行路由。问题是回调是一个无法捕获上下文的 C 函数指针。

我想也许我可以使用 MTAudioProcessingTapCallbacks 的 clientInfo 参数来保存我需要的值,但是我找不到任何关于如何从 MTAudioProcessingTapProcessCallback 中访问此参数的文档。

我有 32 种可能的路由组合,不幸的是,此时我看到的唯一其他选项是声明 32 个单独的 MTAudioProcessingTapProcessCallbacks,然后在创建分接头时选择要使用的选项。但是,如果我只有一个 MTAudioProcessingTapProcessCallback,它可以根据传入的数据做出简单的决定,那对我来说会容易得多。

【问题讨论】:

  • 如果传递数据变得过于繁重,请考虑在您的应用程序中使用单例对象(如果您还没有的话),这样可以促进数据传输。我遇到过两个对象需要共享数据但相距甚远的情况,因此简单地创建一个单例,第一个对象更新第二个对象读取的数据对我来说更经济。当您的用户点击时,第一个对象会在与第二个对象通信之前使用整数值更新单例,因此第二个对象始终知道在每次点击后可以读取这些值。
  • (comment con't) 也就是说,子类化通常应该是您的第一次尝试。如果您可以将对象子类化并注入您自己的自定义属性,我可能会这样做。我从未与MTAudioProcessingTapProcessCallback 合作过,所以我不能说,但我想你已经探索过这个选项。

标签: swift macos core-audio


【解决方案1】:

我知道它是如何工作的。为了从 Process 回调中访问 c​​lientInfo 中的数据:

  1. 在 MTAudioProcessingTapInitCallback 中,您必须使用 clientInfo 指针初始化 tapStorageOut

  2. 在 Process 回调中使用 MTAudioProcessingTapGetStorage(tap) 获取该指针并访问数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2022-08-10
    • 2023-02-19
    • 2021-11-08
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多