You are currently offline, waiting for your internet to reconnect

HOWTO: Monitor Audio Volume Levels

This article was previously published under Q181550
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
This article describes how to monitor audio volume levels by using themixerXXX APIs.
You can use the mixerXXX APIs to monitor the volume levels of the input andoutput lines of your sound card. This involves the following steps:
  1. Open the mixer device associated with the sound card.
  2. Obtain the peak meter mixer control associated with the line that you want to monitor.
  3. Get the volume level from the control.
The following code implements these steps. Link with "Winmm.lib".

Sample Code

    #include <windows.h>    #include <mmsystem.h>    MMRESULT rc;              // Return code.    HMIXER hMixer;            // Mixer handle used in mixer API calls.    MIXERCONTROL mxc;         // Holds the mixer control data.    MIXERLINE mxl;            // Holds the mixer line data.    MIXERLINECONTROLS mxlc;   // Obtains the mixer control.    // Open the mixer. This opens the mixer with a deviceID of 0. If you    // have a single sound card/mixer, then this will open it. If you have    // multiple sound cards/mixers, the deviceIDs will be 0, 1, 2, and    // so on.    rc = mixerOpen(&hMixer, 0,0,0,0);    if (MMSYSERR_NOERROR != rc) {        // Couldn't open the mixer.    }    // Initialize MIXERLINE structure.    ZeroMemory(&mxl,sizeof(mxl));    mxl.cbStruct = sizeof(mxl);    // Specify the line you want to get. You are getting the input line    // here. If you want to get the output line, you need to use    // MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT.    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;    rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl,                           MIXER_GETLINEINFOF_COMPONENTTYPE);    if (MMSYSERR_NOERROR == rc) {        // Couldn't get the mixer line.    }    // Get the control.    ZeroMemory(&mxlc, sizeof(mxlc));    mxlc.cbStruct = sizeof(mxlc);    mxlc.dwLineID = mxl.dwLineID;    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_PEAKMETER;    mxlc.cControls = 1;    mxlc.cbmxctrl = sizeof(mxc);    mxlc.pamxctrl = &mxc;    ZeroMemory(&mxc, sizeof(mxc));    mxc.cbStruct = sizeof(mxc);    rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,                               MIXER_GETLINECONTROLSF_ONEBYTYPE);    if (MMSYSERR_NOERROR != rc) {        // Couldn't get the control.    }    // After successfully getting the peakmeter control, the volume range    // will be specified by mxc.Bounds.lMinimum to mxc.Bounds.lMaximum.    MIXERCONTROLDETAILS mxcd;             // Gets the control values.    MIXERCONTROLDETAILS_SIGNED volStruct; // Gets the control values.    long volume;                          // Holds the final volume value.    // Initialize the MIXERCONTROLDETAILS structure    ZeroMemory(&mxcd, sizeof(mxcd));    mxcd.cbStruct = sizeof(mxcd);    mxcd.cbDetails = sizeof(volStruct);    mxcd.dwControlID = mxc.dwControlID;    mxcd.paDetails = &volStruct;    mxcd.cChannels = 1;    // Get the current value of the peakmeter control. Typically, you    // would set a timer in your program to query the volume every 10th    // of a second or so.    rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd,                                 MIXER_GETCONTROLDETAILSF_VALUE);    if (MMSYSERR_NOERROR == rc) {        // Couldn't get the current volume.    }    volume = volStruct.lValue;    // Get the absolute value of the volume.    if (volume < 0)        volume = -volume;				
peak meter, audio volume

Article ID: 181550 - Last Review: 05/25/2012 15:35:00 - Revision: 2.0

  • Microsoft Win32 Application Programming Interface
  • kbdswmm2003swept kbhowto KB181550