/* * windows.cs * Copyright (c) 2009 kbinani * * This file is part of bocoree. * * bocoree is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * bocoree is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ using System; using System.Runtime.InteropServices; using bocoree; namespace bocoree { using MMRESULT = System.UInt32; using HMIDIIN = System.Int32; using DWORD = System.UInt32; using UINT = System.UInt32; using WORD = System.UInt16; using BYTE = System.Byte; public delegate void delegateWaveOutProc( IntPtr hwo, uint uMsg, uint dwInstance, uint dwParam1, uint dwParam2 ); [StructLayout( LayoutKind.Sequential, Pack = 1 )] public struct JOYINFO { [MarshalAs( UnmanagedType.U4 )] public uint wXpos; [MarshalAs( UnmanagedType.U4 )] public uint wYpos; [MarshalAs( UnmanagedType.U4 )] public uint wZpos; [MarshalAs( UnmanagedType.U4 )] public uint wButtons; } [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1 )] public struct JOYCAPSW { const int MAXPNAMELEN = 32; const int MAX_JOYSTICKOEMVXDNAME = 260; [MarshalAs( UnmanagedType.U2 )] public ushort wMid; [MarshalAs( UnmanagedType.U2 )] public ushort wPid; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN )] public string szPname; [MarshalAs( UnmanagedType.U4 )] public uint wXmin; [MarshalAs( UnmanagedType.U4 )] public uint wXmax; [MarshalAs( UnmanagedType.U4 )] public uint wYmin; [MarshalAs( UnmanagedType.U4 )] public uint wYmax; [MarshalAs( UnmanagedType.U4 )] public uint wZmin; [MarshalAs( UnmanagedType.U4 )] public uint wZmax; [MarshalAs( UnmanagedType.U4 )] public uint wNumButtons; [MarshalAs( UnmanagedType.U4 )] public uint wPeriodMin; [MarshalAs( UnmanagedType.U4 )] public uint wPeriodMax; [MarshalAs( UnmanagedType.U4 )] public uint wRmin; [MarshalAs( UnmanagedType.U4 )] public uint wRmax; [MarshalAs( UnmanagedType.U4 )] public uint wUmin; [MarshalAs( UnmanagedType.U4 )] public uint wUmax; [MarshalAs( UnmanagedType.U4 )] public uint wVmin; [MarshalAs( UnmanagedType.U4 )] public uint wVmax; [MarshalAs( UnmanagedType.U4 )] public uint wCaps; [MarshalAs( UnmanagedType.U4 )] public uint wMaxAxes; [MarshalAs( UnmanagedType.U4 )] public uint wNumAxes; [MarshalAs( UnmanagedType.U4 )] public uint wMaxButtons; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN )] public string szRegKey; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = MAX_JOYSTICKOEMVXDNAME )] public string szOEMVxD; } [StructLayout( LayoutKind.Sequential, Pack = 1 )] public struct JOYINFOEX { public uint dwSize; public uint dwFlags; public uint dwXpos; public uint dwYpos; public uint dwZpos; public uint dwRpos; public uint dwUpos; public uint dwVpos; public uint dwButtons; public uint dwButtonNumber; public uint dwPOV; public uint dwReserved1; public uint dwReserved2; } [StructLayout( LayoutKind.Sequential, Pack = 1 )] public struct WAVEFORMATEX { public ushort wFormatTag; public ushort nChannels; public uint nSamplesPerSec; public uint nAvgBytesPerSec; public ushort nBlockAlign; public ushort wBitsPerSample; public ushort cbSize; } [StructLayout( LayoutKind.Sequential, Pack = 1 )] public struct WAVEHDR { public IntPtr lpData; // pointer to locked data buffer public uint dwBufferLength; // length of data buffer public uint dwBytesRecorded; // used for input only public IntPtr dwUser; // for client's use public uint dwFlags; // assorted flags (see defines) public uint dwLoops; // loop control counter public IntPtr lpNext; // PWaveHdr, reserved for driver public uint reserved; // reserved for driver } [StructLayout( LayoutKind.Explicit )] public struct MMTIME { [StructLayout( LayoutKind.Sequential, Pack = 1 )] public struct MIDI { public DWORD songptrpos; // song pointer position } [StructLayout( LayoutKind.Sequential, Pack = 1 )] public unsafe struct SMPTE { public BYTE hour; // hours public BYTE min; // minutes public BYTE sec; // seconds public BYTE frame; // frames public BYTE fps; // frames per second public BYTE dummy; // pad public fixed BYTE pad[2]; } [FieldOffset( 0 )] public uint wType; [FieldOffset( 4 )] public SMPTE smpte; [FieldOffset( 4 )] public MIDI midi; [FieldOffset( 4 )] public uint ms; [FieldOffset( 4 )] public uint sample; [FieldOffset( 4 )] public uint cb; [FieldOffset( 4 )] public uint ticks; } [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Ansi )] public struct MIDIINCAPS { public ushort wMid; public ushort wPid; public uint vDriverVersion; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = windows.MAXPNAMELEN )] public string szPname; public uint dwSupport; public override string ToString() { return szPname; } } [StructLayout( LayoutKind.Sequential )] public unsafe struct MIDIHDR { public byte* lpData; public DWORD dwBufferLength; public DWORD dwBytesRecorded; public DWORD dwUser; public DWORD dwFlags; public MIDIHDR* lpNext; public DWORD reserved; public DWORD dwOffset; public fixed DWORD dwReserved[8]; } [StructLayout( LayoutKind.Sequential )] public struct MIDIOUTCAPSA { public WORD wMid; public WORD wPid; public uint vDriverVersion; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = windows.MAXPNAMELEN )] public string szPname; public WORD wTechnology; public WORD wVoices; public WORD wNotes; public WORD wChannelMask; public DWORD dwSupport; } public static partial class windows { private enum DllStatus { Unknown, Found, NotFound, } public const uint JOYERR_NOERROR = 0; public const ushort JOY_RETURNX = 0x00000001; public const ushort JOY_RETURNY = 0x00000002; public const ushort JOY_RETURNZ = 0x00000004; public const ushort JOY_RETURNR = 0x00000008; public const ushort JOY_RETURNU = 0x00000010; public const ushort JOY_RETURNV = 0x00000020; public const ushort JOY_RETURNPOV = 0x00000040; public const ushort JOY_RETURNBUTTONS = 0x00000080; public const ushort JOY_RETURNRAWDATA = 0x00000100; public const ushort JOY_RETURNPOVCTS = 0x00000200; public const ushort JOY_RETURNCENTERED = 0x00000400; public const ushort JOY_USEDEADZONE = 0x00000800; public const ushort JOY_RETURNALL = (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNPOV | JOY_RETURNBUTTONS); public const ushort MM_MCINOTIFY = 0x3B9; /* MCI */ public const ushort MM_WOM_OPEN = 0x3BB; /* waveform output */ public const ushort MM_WOM_CLOSE = 0x3BC; public const ushort MM_WOM_DONE = 0x3BD; public const ushort MM_WIM_OPEN = 0x3BE; /* waveform input */ public const ushort MM_WIM_CLOSE = 0x3BF; public const ushort MM_WIM_DATA = 0x3C0; public const ushort MM_MIM_OPEN = 0x3C1; /* MIDI input */ public const ushort MM_MIM_CLOSE = 0x3C2; public const ushort MM_MIM_DATA = 0x3C3; public const ushort MM_MIM_LONGDATA = 0x3C4; public const ushort MM_MIM_ERROR = 0x3C5; public const ushort MM_MIM_LONGERROR = 0x3C6; public const ushort MM_MOM_OPEN = 0x3C7; /* MIDI output */ public const ushort MM_MOM_CLOSE = 0x3C8; public const ushort MM_MOM_DONE = 0x3C9; public const int WAVE_MAPPER = -1; public const int WAVE_FORMAT_PCM = 1; public const int CALLBACK_TYPEMASK = 0x00070000; /* callback type mask */ public const int CALLBACK_NULL = 0x00000000; /* no callback */ public const int CALLBACK_WINDOW = 0x00010000; /* dwCallback is a HWND */ public const int CALLBACK_TASK = 0x00020000; /* dwCallback is a HTASK */ public const int CALLBACK_FUNCTION = 0x00030000; /* dwCallback is a FARPROC */ public const int CALLBACK_THREAD = (CALLBACK_TASK);/* thread ID replaces 16 bit task */ public const int CALLBACK_EVENT = 0x00050000; /* dwCallback is an EVENT Handle */ public const int WHDR_DONE = 0x00000001; /* done bit */ public const int WHDR_PREPARED = 0x00000002; /* set if this header has been prepared */ public const int WHDR_BEGINLOOP = 0x00000004; /* loop start block */ public const int WHDR_ENDLOOP = 0x00000008; /* loop end block */ public const int WHDR_INQUEUE = 0x00000010; /* reserved for driver */ public const int TIME_MS = 0x0001; /* time in milliseconds */ public const int TIME_SAMPLES = 0x0002; /* number of wave samples */ public const int TIME_BYTES = 0x0004; /* current byte offset */ public const int TIME_SMPTE = 0x0008; /* SMPTE time */ public const int TIME_MIDI = 0x0010; /* MIDI time */ public const int TIME_TICKS = 0x0020; /* Ticks within MIDI stream */ public const int MAXPNAMELEN = 32; public const int MAX_JOYSTICKOEMVXDNAME = 260; public const uint MMSYSERR_NOERROR = 0; public const uint MMSYSERR_ERROR = 1; public const uint MMSYSERR_BADDEVICEID = 2; public const uint MMSYSERR_NOTENABLED = 3; public const uint MMSYSERR_ALLOCATED = 4; public const uint MMSYSERR_INVALHANDLE = 5; public const uint MMSYSERR_NODRIVER = 6; public const uint MMSYSERR_NOMEM = 7; public const uint MMSYSERR_NOTSUPPORTED = 8; public const uint MMSYSERR_BADERRNUM = 9; public const uint MMSYSERR_INVALFLAG = 10; public const uint MMSYSERR_INVALPARAM = 11; public const uint MMSYSERR_HANDLEBUSY = 12; public const uint MMSYSERR_INVALIDALIAS = 13; public const uint MMSYSERR_BADDB = 14; public const uint MMSYSERR_KEYNOTFOUND = 15; public const uint MMSYSERR_READERROR = 16; public const uint MMSYSERR_WRITEERROR = 17; public const uint MMSYSERR_DELETEERROR = 18; public const uint MMSYSERR_VALNOTFOUND = 19; public const uint MMSYSERR_NODRIVERCB = 20; public const uint MMSYSERR_LASTERROR = 20; private static DllStatus status_winmm = DllStatus.Unknown; private static DllStatus status_winmm_so = DllStatus.Unknown; #region midi [DllImport( "winmm", EntryPoint = "midiInGetDevCaps", CharSet = CharSet.Ansi )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiInGetDevCaps( [MarshalAs( UnmanagedType.U4 )]uint uDeviceID, ref MIDIINCAPS lpMidiInCaps, [MarshalAs( UnmanagedType.U4 )]uint cbMidiInCaps ); [DllImport( "winmm.dll.so", EntryPoint = "midiInGetDevCaps", CharSet = CharSet.Ansi )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiInGetDevCaps( [MarshalAs( UnmanagedType.U4 )]uint uDeviceID, ref MIDIINCAPS lpMidiInCaps, [MarshalAs( UnmanagedType.U4 )]uint cbMidiInCaps ); public static uint midiInGetDevCaps( uint uDeviceID, ref MIDIINCAPS lpMidiInCaps, uint cbMidiInCaps ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInGetDevCaps( uDeviceID, ref lpMidiInCaps, cbMidiInCaps ); status_winmm = DllStatus.Found; } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInGetDevCaps( uDeviceID, ref lpMidiInCaps, cbMidiInCaps ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiInClose" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiInClose( uint hMidiIn ); [DllImport( "winmm.dll.so", EntryPoint = "midiInClose" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiInClose( uint hMidiIn ); public static uint midiInClose( uint hMidiIn ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInClose( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInClose( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiInStart" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiInStart( uint hMidiIn ); [DllImport( "winmm.dll.so", EntryPoint = "midiInStart" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiInStart( uint hMidiIn ); public static uint midiInStart( uint hMidiIn ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInStart( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInStart( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiInReset" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiInReset( uint hMidiIn ); [DllImport( "winmm.dll.so", EntryPoint = "midiInReset" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiInReset( uint hMidiIn ); public static uint midiInReset( uint hMidiIn ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInReset( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInReset( hMidiIn ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiInGetNumDevs" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiInGetNumDevs(); [DllImport( "winmm.dll.so", EntryPoint = "midiInGetNumDevs" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiInGetNumDevs(); public static uint midiInGetNumDevs() { uint ret = 0; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInGetNumDevs(); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInGetNumDevs(); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiInOpen" )] private static extern uint __midiInOpen( ref uint lphMidiIn, int uDeviceID, IntPtr dwCallback, int dwCallbackInstance, int dwFlags ); [DllImport( "winmm.dll.so", EntryPoint = "midiInOpen" )] private static extern uint __so_midiInOpen( ref uint lphMidiIn, int uDeviceID, IntPtr dwCallback, int dwCallbackInstance, int dwFlags ); public static uint midiInOpen( ref uint lphMidiIn, int uDeviceID, IntPtr dwCallback, int dwCallbackInstance, int dwFlags ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiInOpen( ref lphMidiIn, uDeviceID, dwCallback, dwCallbackInstance, dwFlags ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiInOpen( ref lphMidiIn, uDeviceID, dwCallback, dwCallbackInstance, dwFlags ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutGetNumDevs" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutGetNumDevs(); [DllImport( "winmm.dll.so", EntryPoint = "midiOutGetNumDevs" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutGetNumDevs(); public static uint midiOutGetNumDevs() { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutGetNumDevs(); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutGetNumDevs(); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutGetDevCapsA", CharSet = CharSet.Ansi )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutGetDevCapsA( [MarshalAs( UnmanagedType.U4 )] uint uDeviceID, ref MIDIOUTCAPSA pMidiOutCaps, [MarshalAs( UnmanagedType.U4 )] uint cbMidiOutCaps ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutGetDevCapsA", CharSet = CharSet.Ansi )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutGetDevCapsA( [MarshalAs( UnmanagedType.U4 )] uint uDeviceID, ref MIDIOUTCAPSA pMidiOutCaps, [MarshalAs( UnmanagedType.U4 )] uint cbMidiOutCaps ); public static uint midiOutGetDevCapsA( uint uDeviceID, ref MIDIOUTCAPSA pMidiOutCaps, uint cbMidiOutCaps ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutGetDevCapsA( uDeviceID, ref pMidiOutCaps, cbMidiOutCaps ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutGetDevCapsA( uDeviceID, ref pMidiOutCaps, cbMidiOutCaps ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutOpen" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutOpen( [MarshalAs( UnmanagedType.SysUInt )] ref IntPtr lphMidiOut, [MarshalAs( UnmanagedType.U4 )] uint uDeviceID, [MarshalAs( UnmanagedType.FunctionPtr )] Delegate dwCallback, [MarshalAs( UnmanagedType.U4 )] uint dwInstance, [MarshalAs( UnmanagedType.U4 )] uint dwFlags ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutOpen" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutOpen( [MarshalAs( UnmanagedType.SysUInt )] ref IntPtr lphMidiOut, [MarshalAs( UnmanagedType.U4 )] uint uDeviceID, [MarshalAs( UnmanagedType.FunctionPtr )] Delegate dwCallback, [MarshalAs( UnmanagedType.U4 )] uint dwInstance, [MarshalAs( UnmanagedType.U4 )] uint dwFlags ); public static uint midiOutOpen( ref IntPtr lphMidiOut, uint uDeviceID, Delegate dwCallback, uint dwInstance, uint dwFlags ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutOpen( ref lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutOpen( ref lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutClose" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutClose( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutClose" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutClose( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut ); public static uint midiOutClose( IntPtr hMidiOut ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutClose( hMidiOut ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutClose( hMidiOut ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutShortMsg" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutShortMsg( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, [MarshalAs( UnmanagedType.U4 )] uint dwMsg ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutShortMsg" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutShortMsg( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, [MarshalAs( UnmanagedType.U4 )] uint dwMsg ); public static uint midiOutShortMsg( IntPtr hMidiOut, uint dwMsg ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutShortMsg( hMidiOut, dwMsg ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutShortMsg( hMidiOut, dwMsg ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutLongMsg" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutLongMsg( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutLongMsg" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutLongMsg( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); public static uint midiOutLongMsg( IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, uint uSize ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutLongMsg( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutLongMsg( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutPrepareHeader" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutPrepareHeader( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutPrepareHeader" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutPrepareHeader( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); public static uint midiOutPrepareHeader( IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, uint uSize ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutPrepareHeader( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutPrepareHeader( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "midiOutUnprepareHeader" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __midiOutUnprepareHeader( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); [DllImport( "winmm.dll.so", EntryPoint = "midiOutUnprepareHeader" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __so_midiOutUnprepareHeader( [MarshalAs( UnmanagedType.SysUInt )] IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, [MarshalAs( UnmanagedType.U4 )] uint uSize ); public static uint midiOutUnprepareHeader( IntPtr hMidiOut, ref MIDIHDR lpMidiOutHdr, uint uSize ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __midiOutUnprepareHeader( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } else if ( status_winmm_so != DllStatus.NotFound ) { try { ret = __so_midiOutUnprepareHeader( hMidiOut, ref lpMidiOutHdr, uSize ); } catch ( DllNotFoundException ex ) { status_winmm_so = DllStatus.NotFound; } } return ret; } #endregion #region joy [DllImport( "winmm", EntryPoint = "joyGetNumDevs" )] [return: MarshalAs( UnmanagedType.U4 )] private static extern uint __joyGetNumDevs(); public static uint joyGetNumDevs() { uint ret = 0; if ( status_winmm != DllStatus.NotFound ) { try { ret = __joyGetNumDevs(); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "joyGetPos" )] private static extern uint __joyGetPos( uint uJoyID, ref JOYINFO pji ); public static uint joyGetPos( uint uJoyID, ref JOYINFO pji ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __joyGetPos( uJoyID, ref pji ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "joyGetDevCapsW" )] private static extern uint __joyGetDevCapsW( uint uJoyID, ref JOYCAPSW pjc, uint cbjc ); public static uint joyGetDevCapsW( uint uJoyID, ref JOYCAPSW pjc, uint cbjc ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __joyGetDevCapsW( uJoyID, ref pjc, cbjc ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } return ret; } [DllImport( "winmm", EntryPoint = "joyGetPosEx" )] private static extern uint __joyGetPosEx( uint uJoyID, ref JOYINFOEX pji ); public static uint joyGetPosEx( uint uJoyID, ref JOYINFOEX pji ) { uint ret = MMSYSERR_ERROR; if ( status_winmm != DllStatus.NotFound ) { try { ret = __joyGetPosEx( uJoyID, ref pji ); } catch ( DllNotFoundException ex ) { status_winmm = DllStatus.NotFound; } } return ret; } #endregion #region wave [DllImport( "winmm.dll" )] public static extern uint waveOutWrite( IntPtr hwo, ref WAVEHDR pwh, uint cbwh ); [DllImport( "winmm.dll" )] //[return: MarshalAs(UnmanagedType.U4)] public static extern uint waveOutOpen( ref IntPtr hWaveOut, int uDeviceID, ref WAVEFORMATEX lpFormat, delegateWaveOutProc dwCallback, IntPtr dwInstance, uint dwFlags ); //public static extern uint waveOutOpen( ref IntPtr phwo, UINT uDeviceID, ref WAVEFORMATEX pwfx, delegateWaveOutProc dwCallback, IntPtr dwInstance, uint fdwOpen ); [DllImport( "winmm.dll" )] public static extern uint waveOutPrepareHeader( IntPtr hwo, ref WAVEHDR pwh, UINT cbwh ); [DllImport( "winmm.dll" )] public static extern uint waveOutGetPosition( IntPtr hwo, ref MMTIME pmmt, UINT cbmmt ); [DllImport( "winmm.dll" )] public static extern uint waveOutReset( IntPtr hwo ); [DllImport( "winmm.dll" )] public static extern uint waveOutUnprepareHeader( IntPtr hwo, ref WAVEHDR pwh, UINT cbwh ); [DllImport( "winmm.dll" )] public static extern uint waveOutClose( IntPtr hwo ); #endregion #region mci [DllImport( "winmm.dll", CharSet = CharSet.Ansi )] public static extern bool mciGetErrorStringA( uint mcierr, [MarshalAs( UnmanagedType.LPStr )] string pszText, UINT cchText ); #endregion } }