问题描述
Apple 最近弃用了 MIDIDestinationCreate 方法并将其替换为 MidiDestinationCreateWithProtocol (MIDIDestinationCreate)
旧方法需要传递一个简单的回调方法“MIDIReadProc”,它来自 C# 可以通过创建以下委托签名来完成,然后创建一个委托并分配一个方法作为回调。我们声明委托签名:
internal delegate void MIDIReadProc(MIDIPacketListPtr pktlist,IntPtr readProcRefCon,IntPtr srcConnRefCon);
创建一个委托以将我们的回调方法分配给:
private CoreMidiInterop.NativeMethods.MIDIReadProc m_readProcDelegate;
为我们创建的委托分配一个方法:
m_readProcDelegate = CallMessageReceived;
创建一个回调方法,它应该从 macOS Core MIDI 接收 MIDI 消息:
private void CallMessageReceived(MIDIPacketListPtr pktlist,IntPtr srcConnRefCon)
{
...
}
最终将此委托传递给苹果核心 MIDI 方法:
CoreMidiInterop.NativeMethods
.MIDIDestinationCreate(m_clientRef,CoreFoundationUtils.ToCFStringRef(name),m_readProcDelegate,CFStringRef.Zero,out MIDIEndpointRef destinationRef);
这一切都按预期工作。
现在已弃用,不再适用于 macOS Big Sur。新方法“MidiDestinationCreateWithProtocol”需要一个苹果块作为回调参数(称为MIDIReceiveBlock readBlock):
OSStatus MIDIDestinationCreateWithProtocol(MIDIClientRef client,CFStringRef name,MIDIProtocolID protocol,MIDIEndpointRef *outDest,MIDIReceiveBlock readBlock);
此处的文档:MIDIReceiveBlock
如何用 C# 代码创建一个苹果块?我一直在寻找示例,但找不到任何示例。我确实在这里开始研究苹果块的底层实现:
Block Implementation Specification
这不是一件简单的事情,因此任何有关如何在 C# 中执行此操作的帮助/示例都会非常有帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)