使用 Swift CFunctionPointer 将回调传递给 CoreMIDI API

2023-12-30

目前这可能实际上是不可能的,这将是不幸的。我正在尝试调用 CoreMIDI API 来设置 MIDI 输入。这就是我在 Swift 中尝试做的事情:

var midiClient = MIDIClientRef()
var inputPort = MIDIEndpointRef()
var status: OSStatus

func readProc(packetList: UnsafePointer<MIDIPacketList>, readProcRefCon: UnsafeMutablePointer<Void>, srcConnRefCon: UnsafeMutablePointer<Void>) -> Void {
}

status = MIDIClientCreate("MIDI client", nil, nil, &midiClient);

status = MIDIDestinationCreate(midiClient, "MIDI input", readProc, nil, &inputPort);

但我收到此错误: '(UnsafePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> Void' 无法转换为 'MIDIReadProc'

MIDIReadProc 的 typedef 如下:

typealias MIDIReadProc = CFunctionPointer<((UnsafePointer<MIDIPacketList>, UnsafeMutablePointer<Void>, UnsafeMutablePointer<Void>) -> Void)>

有没有办法为我的 readProc 方法获取函数指针以传递给 MIDIDestinationCreate API?


在 Swift 2.0(作为 Xcode 7 的一部分)中,处理函数指针的 C API 使用带注释的函数类型@convention(c)。您可以将任何 Swift 函数、方法或闭包作为@convention(c)函数类型——但前提是该闭包符合 C 约定……例如它无法从其周围范围捕获状态。

详细信息请参见类型属性 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID350 in Swift 编程语言.


至于 Xcode 6 中的内容:Swift 1.x 没有办法将 Swift 函数或闭包转换为 C 函数指针——唯一使用CFunctionPointertype 的作用是将从 (Obj)C API 导入的函数指针传递给其他 (Obj)C API。

您可以在 C 代码中声明一个函数指针,通过项目的桥接标头向 Swift 公开该函数指针,然后使用 Swift 将其传递给 CoreMIDI。但既然你无论如何都要跨过一座桥,你可能会考虑项目的哪些部分最好保留在 C 中,以及这些部分到 Swift 代码的最佳接口是什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swift CFunctionPointer 将回调传递给 CoreMIDI API 的相关文章

随机推荐

  • 如何告诉CRAN自动安装包依赖项?

    我在 R 中开发了一个包 当我在本地计算机中检查并构建它时 它可以正常工作 但是当我在 CRAN 中尝试时 出现包依赖错误 我的包依赖于其他包的两个功能 如果我在下面列出其他包description using Depends or imp
  • JS中如何将字符串类型的十六进制转换为数字?

    例如 假设我有一个十六进制 0xdc 如何转换这个十六进制string转为十六进制Number输入JS 从字面上看只是丢失了引号 这Number 构造函数和parseInt 只是将其转换为 0 到 255 之间的整数 我只是想要0xdc E
  • 有效统计 MongoDB 中出现的百分比

    所以 我正在修改 MongoDB 并且试图获得count 聚合查询可以适当扩展 以便我可以轻松计算文档中某些值在整个集合中出现的百分比 我有一个结构如下的文档 foo bar moo cow values alpha true beta f
  • 在数据库中更改后,Prestashop 重定向到旧域

    我正在尝试创建 prestashop 1 6 电子商店的副本 用于从domain com 到 dev domain com 的开发目的 我遵循的过程是 禁用缓存和编译 将文件从domain com复制到dev domain com 从dom
  • 如何加速向量叉积计算

    嗨 我是这里的新手 正在尝试使用 numpy 进行一些计算 我在一次特定的计算中经历了很长的时间 并且无法找到任何更快的方法来实现同样的事情 基本上它是射线三角形相交算法的一部分 我需要计算两个不同大小的矩阵的所有向量乘积 我使用的代码是
  • aws ecs 优化的 AMI 中的私有 docker 注册表身份验证不成功

    我正在编写一个 terraform 脚本来创建 ECS 自动缩放集群 我创建了一个集群并向其中添加了 ec2 容器实例 我的任务定义文件包含来自私有 docker 存储库的图像 我浏览了 aws 官方文档并找到了一个页面私人登记认证 htt
  • 通过 Geodjango 中的几何交集关联两个模型

    在 GeoDjango 中 两个有两个包含几何字段的模型 from django contrib gis db import models class Country models Model territory models MultiP
  • AudioKit:我可以在不调用 AudioKit.stop() 的情况下禁用 AKMicrophone 吗?

    我有一个具有两个功能的应用程序 一个扮演一个AKMetronome并允许当应用程序不在前台时进行后台播放 另一个是调谐器功能 它使用AKMicrophone 仅当应用程序位于前台时才需要处于活动状态 这些功能可以同时使用 调谐器处于活动状态
  • 为什么我不能在同一结构中存储值和对该值的引用?

    我有一个值 我想存储该值和对的引用 我自己的类型中该值内的某些内容 struct Thing count u32 struct Combined lt a gt Thing a u32 fn make combined lt a gt gt
  • 如何将初始参数传递给 django 的 ModelForm 实例?

    我遇到的具体情况是这样的 我有一个交易模型 其中包含以下字段 from to 两者都是ForeignKeys to auth User型号 和amount 在我的表单中 我想向用户展示 2 个要填写的字段 amount and from t
  • 从命令行运行 Eclipse 项目

    我在从命令行编译和运行 Eclipse java 项目时遇到两个问题 当我刚刚从 Eclipse IDE 运行时 这工作得很好 我尝试过谷歌搜索 但无法真正让事情发挥作用 任何帮助深表感谢 问题 1 当我尝试从 java 文件所在目录以外的
  • 在所有路线上反应加载屏幕?

    我了解如何获得旋转屏幕state and componentDidMount 但我将如何在所有路线之间创建一个加载屏幕而无需编写componentDidMount 在每个组件中 我的 app js 文件 class App extends
  • 无法在 WebView 中输入内容

    我在与某个人交互时遇到问题WebView 我正在显示一个 HTML 登录表单WebView我无法在表单的任何输入字段内键入内容 我确实可以与链接 选择框 按钮等进行交互 这是我的代码的示例 基本上我从 xml 中检索 Web 视图并将其设置
  • 在循环内声明变量,是好习惯还是坏习惯?

    问题 1 在循环内声明变量是好习惯还是坏习惯 我读过有关是否存在性能问题的其他线程 大多数人说不 并且您应该始终将变量声明为靠近它们将要使用的位置 我想知道是否应该避免这种情况 或者是否确实是首选 Example for int count
  • 如何填充页面网格并将内容宽度布置在单列中?

    我正在尝试为网络开发创建弹性框列 然而 我所能做的就是制作一列弹性盒 有哪些基本 CSS 代码可以验证 div 卡是否始终填充页面网格 并且宽度足够小 内容会布局在单列中 charset utf 8 CSS Code section dis
  • 为 matplotlib Slider 小部件设置刻度标签

    The slider https matplotlib org stable api widgets api html highlight slider matplotlib widgets Slidermatplotlib 中的行为随着最
  • ValueError:无法在空集合上计算 LDA(无术语)

    当尝试计算较小规模的语料库的 lda 时 在 python 中出现此错误 但在其他情况下工作正常 语料库的大小是 15 我尝试将主题数设置为 5 然后将其减少到 2 但它仍然给出相同的错误 ValueError 无法在空集合上计算 LDA
  • 计算流中的元素数并返回 Integer 而不是 long

    我需要计算流中的元素并将其分配给一个整数而不进行强制转换 count 确实返回很长 想到了 collect Collectors reducing 但无法弄清楚 我觉得有一些简单的事情我不明白 My Try Stream
  • bootstrap datepicker 设置日期格式 dd/mm/yyyy

    我必须以 dd mm yyyy 格式在日期选择器中设置日期 我想用 Javascript 做的是这样的 var year 2014 var month 5 var day 10 var realDate new Date year mont
  • 使用 Swift CFunctionPointer 将回调传递给 CoreMIDI API

    目前这可能实际上是不可能的 这将是不幸的 我正在尝试调用 CoreMIDI API 来设置 MIDI 输入 这就是我在 Swift 中尝试做的事情 var midiClient MIDIClientRef var inputPort MID