Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

waveInOpen (winmm)
 
.
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:

<DllImport("winmm.dll")> _

Shared Function waveInOpen(ByRef phwi As IntPtr, ByVal uDeviceID As IntPtr, ByRef pwfx As WAVEFORMATEX, ByVal dwCallback As waveInProc, ByVal dwCallbackInstance As IntPtr, ByVal fdwOpen As WaveInOpenFlags) As MMRESULT
End Function

User-Defined Types:

WAVEFORMATEX

waveInProc

WaveInOpenFlags

MMRESULT

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;

        waveInOpen(ref hwWaveIn, WAVE_MAPPER, ref waveFormat, dwCallBack, 0, WAVE_FORMAT_FLAG);

    }

Documentation
waveInOpen on MSDN

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Find References
Show Printable Version
Revisions