121 lines
4.1 KiB
C#
121 lines
4.1 KiB
C#
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
|
||
|
namespace SafeMobileLib
|
||
|
{
|
||
|
public enum WaveFormats
|
||
|
{
|
||
|
Pcm = 1,
|
||
|
Float = 3
|
||
|
}
|
||
|
|
||
|
[StructLayout(LayoutKind.Sequential)]
|
||
|
public class WaveFormat
|
||
|
{
|
||
|
public short wFormatTag;
|
||
|
public short nChannels;
|
||
|
public int nSamplesPerSec;
|
||
|
public int nAvgBytesPerSec;
|
||
|
public short nBlockAlign;
|
||
|
public short wBitsPerSample;
|
||
|
public short cbSize;
|
||
|
|
||
|
public WaveFormat(int rate, int bits, int channels)
|
||
|
{
|
||
|
wFormatTag = (short)WaveFormats.Pcm;
|
||
|
nChannels = (short)channels;
|
||
|
nSamplesPerSec = rate;
|
||
|
wBitsPerSample = (short)bits;
|
||
|
cbSize = 0;
|
||
|
|
||
|
nBlockAlign = (short)(channels * (bits / 8));
|
||
|
nAvgBytesPerSec = nSamplesPerSec * nBlockAlign;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal class WaveNative
|
||
|
{
|
||
|
// consts
|
||
|
public const int MMSYSERR_NOERROR = 0; // no error
|
||
|
|
||
|
public const int MM_WOM_OPEN = 0x3BB;
|
||
|
public const int MM_WOM_CLOSE = 0x3BC;
|
||
|
public const int MM_WOM_DONE = 0x3BD;
|
||
|
|
||
|
public const int MM_WIM_OPEN = 0x3BE;
|
||
|
public const int MM_WIM_CLOSE = 0x3BF;
|
||
|
public const int MM_WIM_DATA = 0x3C0;
|
||
|
|
||
|
public const int CALLBACK_FUNCTION = 0x00030000; // dwCallback is a FARPROC
|
||
|
|
||
|
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
|
||
|
|
||
|
// callbacks
|
||
|
public delegate void WaveDelegate(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
|
||
|
|
||
|
// structs
|
||
|
|
||
|
[StructLayout(LayoutKind.Sequential)] public struct WaveHdr
|
||
|
{
|
||
|
public IntPtr lpData; // pointer to locked data buffer
|
||
|
public int dwBufferLength; // length of data buffer
|
||
|
public int dwBytesRecorded; // used for input only
|
||
|
public IntPtr dwUser; // for client's use
|
||
|
public int dwFlags; // assorted flags (see defines)
|
||
|
public int dwLoops; // loop control counter
|
||
|
public IntPtr lpNext; // PWaveHdr, reserved for driver
|
||
|
public int reserved; // reserved for driver
|
||
|
}
|
||
|
|
||
|
private const string mmdll = "winmm.dll";
|
||
|
|
||
|
// WaveOut calls
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutGetNumDevs();
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutPrepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutUnprepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutWrite(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutReset(IntPtr hWaveOut);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutClose(IntPtr hWaveOut);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutPause(IntPtr hWaveOut);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutRestart(IntPtr hWaveOut);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutGetPosition(IntPtr hWaveOut, out int lpInfo, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutSetVolume(IntPtr hWaveOut, int dwVolume);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveOutGetVolume(IntPtr hWaveOut, out int dwVolume);
|
||
|
|
||
|
// WaveIn calls
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInGetNumDevs();
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInClose(IntPtr hwi);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInPrepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInReset(IntPtr hwi);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInStart(IntPtr hwi);
|
||
|
[DllImport(mmdll)]
|
||
|
public static extern int waveInStop(IntPtr hwi);
|
||
|
}
|
||
|
}
|