示例#1
0
    private void HandleSysExMessage(object state)
    {
        lock (lockObject)
        {
            IntPtr headerPtr = (IntPtr)state;

            MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader));

            if (!resetting)
            {
                for (int i = 0; i < header.bytesRecorded; i++)
                {
                    sysExData.Add(Marshal.ReadByte(header.data, i));
                }

                if (sysExData[0] == 0xF0 && sysExData[sysExData.Count - 1] == 0xF7)
                {
                    SysExMessage message = new SysExMessage(sysExData.ToArray());

                    sysExData.Clear();

                    OnSysExMessageReceived(new SysExMessageEventArgs(message));
                }

                int result = AddSysExBuffer();

                if (result != MIDIExceptions.MMSYSERR_NOERROR)
                {
                    Exception ex = new InputDeviceException(result);

                    OnError(new ErrorEventArgs(ex));
                }
            }

            ReleaseBuffer(headerPtr);
        }
    }