/// <summary> /// Closes the MIDI out device /// </summary> /// <param name="disposing">True if called from Dispose</param> protected virtual void Dispose(bool disposing) { if (!this.disposed) { //if(disposing) Components.Dispose(); if (SysexBufferHeaders.Length > 0) { // Reset in order to release any Sysex buffers // We can't Unprepare and free them until they are flushed out. Neither can we close the handle. MmException.Try(MidiInterop.midiInReset(hMidiIn), "midiInReset"); // Free up all created and allocated buffers for incoming Sysex messages foreach (var lpHeader in SysexBufferHeaders) { MidiInterop.MIDIHDR hdr = (MidiInterop.MIDIHDR)Marshal.PtrToStructure(lpHeader, typeof(MidiInterop.MIDIHDR)); MmException.Try(MidiInterop.midiInUnprepareHeader(hMidiIn, lpHeader, Marshal.SizeOf(typeof(MidiInterop.MIDIHDR))), "midiInPrepareHeader"); Marshal.FreeHGlobal(hdr.lpData); Marshal.FreeHGlobal(lpHeader); } // Defensive protection against double disposal SysexBufferHeaders = new IntPtr[0]; } MidiInterop.midiInClose(hMidiIn); } disposed = true; }
/// <summary> /// Reset the MIDI in device /// </summary> public void Reset() { MmException.Try(MidiInterop.midiInReset(hMidiIn), "midiInReset"); }