internal static IntPtr CreatePacketList (MidiPacket [] packets) { // calculate the total size of the data. int size = 4; for (int i = 0; i < packets.Length; i++) size += GetPacketLength (packets [i].Length); // write it out IntPtr buffer = Marshal.AllocHGlobal (size); Marshal.WriteInt32 (buffer, 0, packets.Length); int dest = 4; for (int i = 0; i < packets.Length; i++) { Marshal.WriteInt64 (buffer, dest, packets [i].TimeStamp); dest += 8; Marshal.WriteInt16 (buffer, dest, (short) packets [i].Length); dest += 2; if (packets [i].ByteArray == null) { Runtime.memcpy (buffer + dest, packets [i].BytePointer, packets [i].Length); } else { Marshal.Copy (packets [i].ByteArray, packets [i].start, buffer + dest, packets [i].Length); } dest += GetPacketLength (packets [i].Length) - 10; } return buffer; }
public MidiError Received (MidiPacket [] packets) { if (packets == null) throw new ArgumentNullException ("packets"); var block = MidiPacket.CreatePacketList (packets); var code = MIDIReceived (handle, block); Marshal.FreeHGlobal (block); return code; }
internal static MidiPacket [] ReadPacketList (IntPtr packetList) { /* * struct MIDIPacketList { * UInt32 numPackets; * MIDIPacket packet[] * } */ int npackets = Marshal.ReadInt32 (packetList); var packets = new MidiPacket [npackets]; packetList += 4; for (int i = 0; i < npackets; i++){ int plen; packets [i] = MidiPacket.ReadPacket (packetList, out plen); packetList += plen; } return packets; }
public MidiError Send (MidiEndpoint endpoint, MidiPacket [] packets) { if (endpoint == null) throw new ArgumentNullException ("endpoint"); if (packets == null) throw new ArgumentNullException ("packets"); var p = MidiPacket.CreatePacketList (packets); var code = MIDISend (handle, endpoint.handle, p); Marshal.FreeHGlobal (p); return code; }