waveInOpen (winmm)
Last changed: Gabriel F-181.122.167.183

.
Summary
The waveInOpen function opens the given waveform-audio input device for recording.

By : Demitrius Wheelwright

C# Signature:

/// <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);

VB Signature:

(TODO)

User-Defined Types:

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 */

Alternative Managed API:

Microsoft.DirectX.DirectSound

Notes:

It is key to use the ref keyword with 'hWaveIn' and 'wfx' or else you return value will always be 11 (MMSYSERR_INVALPARAM).

Tips & Tricks:

Please add some!

Sample Code:

/// <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;

        OpenRecordingDev();

    }

    private int OpenRecordingDev()
    {
         return waveInOpen(ref hwWaveIn, WAVE_MAPPER, ref waveFormat, dwCallBack, 0, WAVE_FORMAT_FLAG).ToString());
    }

Documentation
waveInOpen on MSDN