我正在iPad上处理Midi,一切正常,我可以记录进来的所有东西,并且一切正常。但是,在尝试接收长消息(即Sysex)时,我只能得到一个最大为256字节的数据包,此后什么也没有。
使用Apple提供的代码:
MIDIPacket *packet = &packetList->packet[0];
for (int i = 0; i > packetList->numPackets; ++i) {
// ...
packet = MIDIPacketNext (packet);
}
packetList->numPackets
始终为1。收到第一条消息后,在发送"new" sysex消息之前,不会调用其他回调方法。我不认为我的MIDI处理方法可以用全packetList(可能是任意大小)来调用。我以为我会以流的形式接收数据。这样对吗?深入研究后,我唯一能找到的就是:http://lists.apple.com/archives/coreaudio-api/2010/May/msg00189.html,它提到的是完全相同的东西,但并没有太大帮助。我知道我可能需要实现缓冲,但是我什至看不到前256个字节以外的任何内容,因此我不确定从哪里开始。
最佳答案
我的直觉是,系统要么将整个sysex消息压缩为一个数据包,要么将其分解为多个数据包。根据CoreMidi文档,MIDIPacket结构的data
字段具有一些有趣的属性:
因此,基本上,您应该查看length
的已声明MIDIPacket
字段,并查看其是否大于256。根据规范,256字节只是标准分配,但是该数组可以容纳更多(如有必要)。您可能会发现整个邮件都塞满了该数组。
否则,似乎系统会将sysex消息分解为多个数据包。由于规范说不允许运行状态,因此它将必须发送多个数据包,每个数据包都带有一个前置的0xF0
字节。然后,您将需要创建自己的内部缓冲区来存储这些消息的内容,根据需要剥离状态字节或 header ,然后将数据附加到缓冲区中,直到读取表示序列末尾的0xF7
字节为止。
关于cocoa - MIDIPacketList,numPackets始终为1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4546025/