private void DestroyHandle() { if (_handle == IntPtr.Zero) { return; } MidiOutWinApi.midiOutClose(_handle); }
private void EnsureHandleIsCreated() { if (_handle != IntPtr.Zero) { return; } _callback = OnMessage; ProcessMmResult(MidiOutWinApi.midiOutOpen(out _handle, Id, _callback, IntPtr.Zero, MidiWinApi.CallbackFunction)); }
private void UnprepareSysExBuffer(IntPtr headerPointer) { if (headerPointer == IntPtr.Zero) { return; } MidiOutWinApi.midiOutUnprepareHeader(_handle, headerPointer, MidiWinApi.MidiHeaderSize); var header = (MidiWinApi.MIDIHDR)Marshal.PtrToStructure(headerPointer, typeof(MidiWinApi.MIDIHDR)); Marshal.FreeHGlobal(header.lpData); Marshal.FreeHGlobal(headerPointer); }
private void SendSysExEvent(SysExEvent sysExEvent) { var data = sysExEvent.Data; if (data == null || !data.Any()) { return; } var headerPointer = PrepareSysExBuffer(data); _sysExHeadersPointers.Add(headerPointer); ProcessMmResult(MidiOutWinApi.midiOutLongMsg(_handle, headerPointer, MidiWinApi.MidiHeaderSize)); }
private void SetDeviceInformation() { var caps = default(MidiOutWinApi.MIDIOUTCAPS); ProcessMmResult(MidiOutWinApi.midiOutGetDevCaps(new IntPtr(Id), ref caps, (uint)Marshal.SizeOf(caps))); SetBasicDeviceInformation(caps.wMid, caps.wPid, caps.vDriverVersion, caps.szPname); DeviceType = (OutputDeviceType)caps.wTechnology; VoicesNumber = caps.wVoices; NotesNumber = caps.wNotes; Channels = (from channel in FourBitNumber.Values let isChannelSupported = (caps.wChannelMask >> channel) & 1 where isChannelSupported == 1 select channel).ToArray(); var support = (MidiOutWinApi.MIDICAPS)caps.dwSupport; SupportsPatchCaching = support.HasFlag(MidiOutWinApi.MIDICAPS.MIDICAPS_CACHE); SupportsVolumeControl = support.HasFlag(MidiOutWinApi.MIDICAPS.MIDICAPS_VOLUME); SupportsLeftRightVolumeControl = support.HasFlag(MidiOutWinApi.MIDICAPS.MIDICAPS_LRVOLUME); }
private IntPtr PrepareSysExBuffer(byte[] data) { var bufferLength = data.Length + 1; var dataPointer = Marshal.AllocHGlobal(bufferLength); Marshal.WriteByte(dataPointer, EventStatusBytes.Global.NormalSysEx); Marshal.Copy(data, 0, IntPtr.Add(dataPointer, 1), data.Length); var header = new MidiWinApi.MIDIHDR { lpData = dataPointer, dwBufferLength = bufferLength, dwBytesRecorded = bufferLength }; var headerPointer = Marshal.AllocHGlobal(MidiWinApi.MidiHeaderSize); Marshal.StructureToPtr(header, headerPointer, false); ProcessMmResult(MidiOutWinApi.midiOutPrepareHeader(_handle, headerPointer, MidiWinApi.MidiHeaderSize)); return(headerPointer); }
private void SendShortEvent(MidiEvent midiEvent) { var message = PackShortEvent(midiEvent); ProcessMmResult(MidiOutWinApi.midiOutShortMsg(_handle, (uint)message)); }
/// <summary> /// Gets error description for the specified MMRESULT which is return value of winmm function. /// </summary> /// <param name="mmrError">MMRESULT which is return value of winmm function.</param> /// <param name="pszText"><see cref="StringBuilder"/> to write error description to.</param> /// <param name="cchText">Size of <paramref name="pszText"/> buffer.</param> /// <returns>Return value of winmm function which gets error description.</returns> protected override uint GetErrorText(uint mmrError, StringBuilder pszText, uint cchText) { return(MidiOutWinApi.midiOutGetErrorText(mmrError, pszText, cchText)); }
/// <summary> /// Retrieves the number of output MIDI devices presented in the system. /// </summary> /// <returns>Number of output MIDI devices presented in the system.</returns> public static int GetDevicesCount() { return((int)MidiOutWinApi.midiOutGetNumDevs()); }
internal override MMRESULT GetErrorText(MMRESULT mmrError, StringBuilder pszText, uint cchText) { return(MidiOutWinApi.midiOutGetErrorText(mmrError, pszText, cchText)); }
private void DestroyHandle() { MidiOutWinApi.midiOutClose(_handle); }
public static int GetDevicesCount() { // TODO: process last error // TODO: uint instead of int return(MidiOutWinApi.midiOutGetNumDevs()); }