C/C++调用MIDISendEventList()发送MIDI无输出无报错问题求解
问题原因和修复方案
核心错误点
MIDIEventListAdd的第二个参数传值错误:该参数要求传入整个MIDIEventList结构体的总缓冲区大小,你当前传入的是单个packet的大小sizeof(MIDIEventList::packet),系统会判定缓冲区容量不足,直接丢弃消息但不会返回显性错误,此处应该替换为sizeof(clockMessageEventList)。- UMP格式封装错误:使用UMP API发送MIDI 1.0消息时,不能直接传入原始MIDI字节,需要符合UMP(通用MIDI数据包)的格式规范。你要发送的0xF8是MIDI 1.0系统实时消息,属于32位长度的UMP类型0消息,正确的32位消息值应为
0x00F80000:高8位的0x00代表「消息类型为MIDI1.0短消息+MIDI组号为0」,次8位0xF8是原始MIDI状态字节,后16位为填充值0。 - 可选端口检查:如果你创建
outputPortRef时使用的是旧版MIDIOutputPortCreate接口,需要替换为新版的MIDIOutputPortCreateWithProtocol,并显式指定协议为kMIDIProtocol_1_0,旧接口创建的端口不支持MIDISendEventList方法。
修复后可运行代码
// 正确的UMP格式MIDI 1.0时钟消息 const ByteCount umpWordCount = 1; const UInt32 clockMessage[umpWordCount] = { 0x00F80000 }; const MIDITimeStamp timeStamp = mach_absolute_time(); MIDIEventList clockMessageEventList = {}; MIDIEventPacket* endPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0); // 第二个参数传入整个EventList的大小 endPacket = MIDIEventListAdd(&clockMessageEventList, sizeof(clockMessageEventList), endPacket, timeStamp, umpWordCount, clockMessage); for (NSUInteger i = 0; i < endPointRefsCount; ++i) { MIDIObjectRef destEndpoint = endPointRefs[i]; OSStatus sendErr = MIDISendEventList(outputPortRef, destEndpoint, &clockMessageEventList); if (sendErr != noErr) { printf("MIDISendEventList error: %i", (int)sendErr); } }
内容的提问来源于stack exchange,提问作者adamjansch
相关产品推荐
相关产品推荐

