.NET MAUI(iOS):iOS14后MidiPort.Send已过时,求CoreMIDI发送MIDI替代方案
嘿,我刚好碰到过这个问题!在iOS 14及以后的版本里,Apple确实把MidiPort.Send给标记过时了,取而代之的是MidiOutputConnection这个新类,完全适配iOS 16,下面是具体怎么用:
解决方案:用MidiOutputConnection替代过时的MidiPort.Send
1. 创建MidiOutputConnection实例
首先,用你已经获取到的有效MidiEndpoint来创建这个新的连接对象——这是新API的核心入口:
// 假设你已经拿到了目标输出端点targetEndpoint var midiOutputConn = new MidiOutputConnection(targetEndpoint);
如果需要同时发送到多个MIDI设备,还可以传入端点数组:
var multiConn = new MidiOutputConnection(new[] { endpoint1, endpoint2 });
2. 构造并发送MIDI消息
新API支持同步和异步两种发送方式,根据你的场景选择就行:
同步发送(适合单条或少量消息)
// 构造一个C4音符的Note On消息(状态字节0x90,音高0x3C,力度0x40) byte[] noteOnData = new byte[] { 0x90, 0x3C, 0x40 }; var midiPacket = new MidiPacket(0, noteOnData); // 时间戳传0表示立即发送 // 执行发送并检查结果 MidiError sendResult = midiOutputConn.Send(new[] { midiPacket }); if (sendResult != MidiError.Ok) { Console.WriteLine($"MIDI发送失败:{sendResult}"); // 这里可以添加错误处理逻辑 }
异步发送(适合批量消息,避免阻塞主线程)
如果要发送多条消息,异步方式更友好:
var packetList = new MidiPacketList(); // 添加Note On和延迟100ms的Note Off消息 packetList.Add(new MidiPacket(0, new byte[] { 0x90, 0x3C, 0x40 })); packetList.Add(new MidiPacket(100, new byte[] { 0x80, 0x3C, 0x00 })); // 异步发送 await midiOutputConn.SendAsync(packetList);
3. 管理连接生命周期
不用的时候记得释放连接资源,避免内存泄漏:
midiOutputConn.Dispose();
几个关键提醒
- 确认你的
MidiEndpoint是输出端点:可以通过targetEndpoint.IsOutput属性检查,避免传成输入端点导致失败。 MidiOutputConnection支持iOS 14+、macOS 11+和Mac Catalyst,完全覆盖你的iOS 16场景,是Apple官方推荐的替代方案。- 如果你之前的代码是基于Xamarin.iOS的MIDI示例改的,直接替换成这个新类的逻辑就能解决API过时的问题。
内容的提问来源于stack exchange,提问作者Ayaphi
相关产品推荐
相关产品推荐

