By : Demitrius Wheelwright
/// <summary>
/// The waveInOpen function opens the given waveform-audio input device for recording. Then returning the devide id.
/// </summary>
/// <param name="hWaveIn">
/// Pointer to a buffer that receives a handle identifying the open waveform-audio input device. Use this
/// handle to identify the device when calling other waveform-audio input functions. This parameter can be NULL if WAVE_FORMAT_QUERY
/// is specified for dwFlags
/// </param>
/// <param name="deviceId">
/// Identifier of the waveform-audio input device to open. It can be either a device identifier or a handle of an open waveform-audio
/// input device. You can use the following flag instead of a device identifier.
/// </param>
/// <param name="wfx">
/// Pointer to a WAVEFORMATEX structure that identifies the desired format for recording waveform-audio data.
/// You can free this structure immediately after waveInOpen returns.
/// </param>
/// <param name="dwCallBack">
/// Pointer to a fixed callback function, an event handle, a handle to a window, or the identifier of a thread to be called during
/// waveform-audio recording to process messages related to the progress of recording. If no callback function is required, this
/// value can be zero. For more information on the callback function, see waveInProc.
/// </param>
/// <param name="dwInstance">
/// User-instance data passed to the callback mechanism. This parameter is not used with the window callback mechanism.
/// </param>
/// <param name="dwFlags">
/// Flags for opening the device. The following values are defined.
/// </param>
/// <returns></returns>
[DllImport("winmm.dll")]
private static extern uint waveInOpen(ref IntPtr hWaveIn, uint deviceId, ref WAVEFORMATEX wfx, IntPtr dwCallBack, uint dwInstance, uint dwFlags);
(TODO)
MMSYSERR_BASE 0
MMSYSERR_NOERROR 0 /* no error */
MMSYSERR_ERROR (MMSYSERR_BASE + 1) /* unspecified error */
MMSYSERR_BADDEVICEID (MMSYSERR_BASE + 2) /* device ID out of range */
MMSYSERR_NOTENABLED (MMSYSERR_BASE + 3) /* driver failed enable */
MMSYSERR_ALLOCATED (MMSYSERR_BASE + 4) /* device already allocated */
MMSYSERR_INVALHANDLE (MMSYSERR_BASE + 5) /* device handle is invalid */
MMSYSERR_NODRIVER (MMSYSERR_BASE + 6) /* no device driver present */
MMSYSERR_NOMEM (MMSYSERR_BASE + 7) /* memory allocation error */
MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8) /* function isn't supported */
MMSYSERR_BADERRNUM (MMSYSERR_BASE + 9) /* error value out of range */
MMSYSERR_INVALFLAG (MMSYSERR_BASE + 10) /* invalid flag passed */
MMSYSERR_INVALPARAM (MMSYSERR_BASE + 11) /* invalid parameter passed */
MMSYSERR_HANDLEBUSY (MMSYSERR_BASE + 12) /* handle being used */
MMSYSERR_INVALIDALIAS (MMSYSERR_BASE + 13) /* specified alias not found */
MMSYSERR_BADDB (MMSYSERR_BASE + 14) /* bad registry database */
MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE + 15) /* registry key not found */
MMSYSERR_READERROR (MMSYSERR_BASE + 16) /* registry read error */
MMSYSERR_WRITEERROR (MMSYSERR_BASE + 17) /* registry write error */
MMSYSERR_DELETEERROR (MMSYSERR_BASE + 18) /* registry delete error */
MMSYSERR_VALNOTFOUND (MMSYSERR_BASE + 19) /* registry value not found */
MMSYSERR_NODRIVERCB (MMSYSERR_BASE + 20) /* driver does not call
MMSYSERR_MOREDATA (MMSYSERR_BASE + 21) /* more data to be returned */
MMSYSERR_LASTERROR (MMSYSERR_BASE + 21) /* last error in range */
CALLBACK_TYPEMASK 0x00070000l /* callback type mask */
CALLBACK_NULL 0x00000000l /* no callback */
CALLBACK_WINDOW 0x00010000l /* dwCallback is a HWND */
CALLBACK_TASK 0x00020000l /* dwCallback is a HTASK */
CALLBACK_FUNCTION 0x00030000l /* dwCallback is a FARPROC */
Microsoft.DirectX.DirectSound
It is key to use the ref keyword with 'hWaveIn' and 'wfx' or else you return value will always be 11 (MMSYSERR_INVALPARAM).
Please add some!
/// <summary>
/// The waveInOpen function opens the given waveform-audio input device for recording. Then returning the devide id.
/// </summary>
/// <param name="hWaveIn">
/// Pointer to a buffer that receives a handle identifying the open waveform-audio input device. Use this
/// handle to identify the device when calling other waveform-audio input functions. This parameter can be NULL if WAVE_FORMAT_QUERY
/// is specified for dwFlags
/// </param>
/// <param name="deviceId">
/// Identifier of the waveform-audio input device to open. It can be either a device identifier or a handle of an open waveform-audio
/// input device. You can use the following flag instead of a device identifier.
/// </param>
/// <param name="wfx">
/// Pointer to a WAVEFORMATEX structure that identifies the desired format for recording waveform-audio data.
/// You can free this structure immediately after waveInOpen returns.
/// </param>
/// <param name="dwCallBack">
/// Pointer to a fixed callback function, an event handle, a handle to a window, or the identifier of a thread to be called during
/// waveform-audio recording to process messages related to the progress of recording. If no callback function is required, this
/// value can be zero. For more information on the callback function, see waveInProc.
/// </param>
/// <param name="dwInstance">
/// User-instance data passed to the callback mechanism. This parameter is not used with the window callback mechanism.
/// </param>
/// <param name="dwFlags">
/// Flags for opening the device. The following values are defined.
/// </param>
/// <returns></returns>
[DllImport("winmm.dll")]
private static extern uint waveInOpen(ref IntPtr hWaveIn, uint deviceId, ref WAVEFORMATEX wfx, IntPtr dwCallBack, uint dwInstance, uint dwFlags);
/// <summary>
/// Prefered structure to use with API call waveInOpen.
/// Needed to encapsulate wave format data.
/// </summary>
public struct WAVEFORMATEX
{
public short wFormatTag;
public short nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public short nBlockAlign;
public short wBitsPerSample;
public short cbSize;
}
public enum MMSYSERR : uint
{
// Add MMSYSERR's here!
MMSYSERR_BASE = 0x0000,
MMSYSERR_NOERROR = 0x0000
}
private WAVEFORMATEX waveFormat;
private const uint WAVE_MAPPER = unchecked((uint)(-1));
private const short WAVE_FORMAT_PCM = 0x0001;
private const uint WAVE_FORMAT_FLAG = 0x00010000;
private IntPtr hwWaveIn = IntPtr.Zero;
private IntPtr dwCallBack = IntPtr.Zero;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// For documentation on the correct values to use, please refer to the MSDN library.
waveFormat = new WAVEFORMATEX();
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = 1;
waveFormat.nSamplesPerSec = 44100;
waveFormat.nAvgBytesPerSec = 44100;
waveFormat.nBlockAlign = 1;
waveFormat.wBitsPerSample = 8;
waveFormat.cbSize = 0;
waveInOpen(ref hwWaveIn, WAVE_MAPPER, ref waveFormat, dwCallBack, 0, WAVE_FORMAT_FLAG);
}