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());
 }
Ejemplo n.º 10
0
 internal override MMRESULT GetErrorText(MMRESULT mmrError, StringBuilder pszText, uint cchText)
 {
     return(MidiOutWinApi.midiOutGetErrorText(mmrError, pszText, cchText));
 }
Ejemplo n.º 11
0
 private void DestroyHandle()
 {
     MidiOutWinApi.midiOutClose(_handle);
 }
Ejemplo n.º 12
0
 public static int GetDevicesCount()
 {
     // TODO: process last error
     // TODO: uint instead of int
     return(MidiOutWinApi.midiOutGetNumDevs());
 }