lipsync/trunk/bocoree/winmm.cs

406 lines
15 KiB
C#

/*
* 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;
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
}
/*typedef struct mmtime_tag
{
UINT wType; // indicates the contents of the union
union
{
DWORD ms; // milliseconds
DWORD sample; // samples
DWORD cb; // byte count
DWORD ticks; // ticks in MIDI stream
// SMPTE
struct
{
BYTE hour; // hours
BYTE min; // minutes
BYTE sec; // seconds
BYTE frame; // frames
BYTE fps; // frames per second
BYTE dummy; // pad
#ifdef _WIN32
BYTE pad[2];
#endif
} smpte;
// MIDI
struct
{
DWORD songptrpos; // song pointer position
} midi;
} u;
}*/
[StructLayout( LayoutKind.Explicit )]
public struct MMTIME {
[FieldOffset( 0 )]
public UInt32 wType;
[FieldOffset( 4 )]
public UInt32 ms;
[FieldOffset( 4 )]
public UInt32 sample;
[FieldOffset( 4 )]
public UInt32 cb;
[FieldOffset( 4 )]
public UInt32 ticks;
[FieldOffset( 4 )]
public Byte smpteHour;
[FieldOffset( 5 )]
public Byte smpteMin;
[FieldOffset( 6 )]
public Byte smpteSec;
[FieldOffset( 7 )]
public Byte smpteFrame;
[FieldOffset( 8 )]
public Byte smpteFps;
[FieldOffset( 9 )]
public Byte smpteDummy;
[FieldOffset( 10 )]
public Byte smptePad0;
[FieldOffset( 11 )]
public Byte smptePad1;
[FieldOffset( 4 )]
public UInt32 midiSongPtrPos;
}
[StructLayout(LayoutKind.Sequential, Pack = 1 )]
public unsafe struct _MMTIME {
public UINT wType;
byte b1;
byte b2;
byte b3;
byte b4;
byte b5;
byte b6;
byte b7;
byte b8;
public 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];
}
public SMPTE smpte {
get {
SMPTE ret = new SMPTE();
ret.hour = b1;
ret.min = b2;
ret.sec = b3;
ret.frame = b4;
ret.fps = b5;
ret.dummy = b6;
ret.pad[0] = b7;
ret.pad[1] = b8;
return ret;
}
}
public struct MIDI {
public DWORD songptrpos; // song pointer position
}
public MIDI midi {
get {
MIDI ret = new MIDI();
ret.songptrpos = ms;
return ret;
}
}
public uint ms {
get {
return (uint)b1 | (uint)(b2 << 8) | (uint)(b3 << 16) | (uint)(b4 << 32);
}
}
public uint sample {
get {
return ms;
}
}
public uint cb {
get {
return ms;
}
}
public uint ticks {
get {
return ms;
}
}
}
[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;
}
}
public static partial class windows {
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;
#region midi
[DllImport( "winmm.dll" )]
public static extern UINT midiInGetNumDevs();
[DllImport( "winmm.dll" )]
public static unsafe extern MMRESULT midiInOpen( HMIDIIN* lphMidiIn,
UINT uDeviceID,
DWORD dwCallback,
DWORD dwCallbackInstance,
DWORD dwFlags );
#endregion
#region joy
[DllImport( "winmm.dll" )]
[return: MarshalAs( UnmanagedType.U4 )]
public static extern uint joyGetNumDevs();
[DllImport( "winmm.dll" )]
public static extern uint joyGetPos( uint uJoyID, ref JOYINFO pji );
[DllImport( "winmm.dll" )]
public static extern uint joyGetDevCapsW( uint uJoyID, ref JOYCAPSW pjc, uint cbjc );
[DllImport( "winmm.dll" )]
public static extern uint joyGetPosEx( uint uJoyID, ref JOYINFOEX pji );
#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
}
}