Click here to Skip to main content
15,867,568 members
Articles / Desktop Programming / MFC
Article

Simple Mixer Control Wrapper

Rate me:
Please Sign up or sign in to vote.
4.54/5 (12 votes)
9 Jan 2000 214.5K   2.6K   42   38
A small audio mixer control wrapper
  • Download source files - 2.7 Kb
  • This is small and useful C++ class which can encapsulate any windows multimedia mixer control.

    I wrote a simple class CAlexfMixer to wrap any multimedia mixer control. You can manipulate the Master Volume, Mute or someone elses mixer control with this class, as long as the control support these operations. You can also retrieve information such as the Peak Meter.

    Let's look at class definition:

    class CAlexfMixer
    {
    protected:
      HMIXER m_HMixer;
      INT m_iMixerControlID;
      MMRESULT mmr;
      DWORD m_dwChannels;
      BOOL m_bSuccess;
      void ZeroAll();
    public:
      BOOL IsOk() {return m_bSuccess;};
      BOOL On();
      BOOL Off();
      DWORD GetControlValue();
      BOOL SetControlValue(DWORD dw);
      CAlexfMixer(DWORD DstType, DWORD SrcType, DWORD ControlType);
      CAlexfMixer(HWND hwnd, DWORD DstType, DWORD SrcType, DWORD ControlType);
      virtual ~CAlexfMixer();
    };

    The class has two constructors - with and without the callback window.

    The class has member IsOk to check whether the specified control can be manipulated, and member functions to get and set the control's state.

    How it works

    Example 1. Master Volume Control.

    CAlexfMixer mixer(m_hWnd, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
                      NO_SOURCE, MIXERCONTROL_CONTROLTYPE_VOLUME);
    if (!mixer.IsOk()) 
       return;
    
    mixer.SetControlValue(500);

    First we create an object associated with the Master Volume meter control. The third parameter NO_SOURCE is a constant defined in the header file. It means that the control does not have a source line, only a destination line.

    Second we check if is this type of control available or not.

    Finally, we set the volume to 500.

    Example 2. Master Mute.

    CAlexfMixer mixer(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
                      NO_SOURCE, MIXERCONTROL_CONTROLTYPE_MUTE );
    mixer.Off();

    Here we create an object associated with Master Mute control, and turn it off.

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    Web Developer SEO
    Russian Federation Russian Federation
    AlexF's Blog in Russian
    Owner Spy competition analysis
    Rating Burner Rating of blogs

    Comments and Discussions

     
    Questioncan u guide me i am new for mixer control Pin
    rajneshmalik30-Aug-07 2:18
    rajneshmalik30-Aug-07 2:18 
    GeneralNo Mixer Present!!! Pin
    DexterND14-May-07 1:45
    DexterND14-May-07 1:45 
    QuestionHow to choose FrontPanel MIC or BackPanel MIC? Pin
    guzeliang10-Oct-06 15:42
    guzeliang10-Oct-06 15:42 
    AnswerRe: How to choose FrontPanel MIC or BackPanel MIC? Pin
    guzeliang11-Oct-06 17:09
    guzeliang11-Oct-06 17:09 
    GeneralHow did you solve that problem? Pin
    cheong junhwan26-Aug-07 23:50
    cheong junhwan26-Aug-07 23:50 
    GeneralNEW VERSION Pin
    gurtaran21-Apr-06 15:43
    gurtaran21-Apr-06 15:43 
    GeneralMute or Pause Sounds from other Applications Pin
    Suntai7-Feb-06 2:04
    Suntai7-Feb-06 2:04 
    Generalmodify change fault code Pin
    JS Lee1-May-05 19:25
    JS Lee1-May-05 19:25 
    GeneralForget My Email,Sorry! Pin
    peposi30-Aug-04 22:12
    peposi30-Aug-04 22:12 
    GeneralI Can not Download you code! Pin
    peposi30-Aug-04 22:01
    peposi30-Aug-04 22:01 
    GeneralPeak Meter not working Pin
    tunafish2419-Nov-03 7:38
    tunafish2419-Nov-03 7:38 
    GeneralRe: Peak Meter not working Pin
    AkikoAkikoChan17-Oct-04 17:44
    AkikoAkikoChan17-Oct-04 17:44 
    GeneralControlling mic loudness Pin
    In-Chul, Yang24-Jul-03 17:07
    In-Chul, Yang24-Jul-03 17:07 
    GeneralRe: Controlling mic loudness Pin
    FBKK12-Sep-06 22:57
    FBKK12-Sep-06 22:57 
    QuestionSolved balance problem? Pin
    geert jacobs8-May-03 22:39
    geert jacobs8-May-03 22:39 
    AnswerRe: Solved balance problem? Pin
    geert jacobs8-May-03 22:57
    geert jacobs8-May-03 22:57 
    GeneralRe: Solved balance problem? Pin
    AkikoAkikoChan17-Oct-04 17:42
    AkikoAkikoChan17-Oct-04 17:42 
    AnswerRe: Solved balance problem? [modified] Pin
    ultraVBCoder25-Jun-06 17:26
    ultraVBCoder25-Jun-06 17:26 
    Basically, it works like this:
    1) controls which have the UNIFORM flag set (found by ANDing the controlType with &H1) have only one adjustable channel. Take DST_SPEAKERS, for example, (usually) 2 channels, but one adjustable mute control for both channels
    2) If you set only the first structure for a control, (controls are set by the number of items AND the number of channels for non-UNIFORM controls) all items and channels are set to that value, regardless of the number of each of these
    3) By changing the cchannels to 1, you can 'force' it to return one structure (by the way, also change the 'item' to 1) - however, even returning all shouldn't crash VS.NET.

    Likely, you are assigning the amount of memory (the pamctrl, I believe) using AllocHGlobal to only the size of the structure. To remedy this, allocate the structureSize*numChannels*numItems memory. You can set up a loop to grab all the structures with PtrToStructure by offsetting the ptr address by the structure size for each sequential mixercontroldetails_xxxx structure to contruct a managed array (unsafe, but works)

    This is off the top of my head, but if anyone has any questions or corrections, feel free to comment

    Happy windows API coding :->

    EDIT: sorry, I'm thinking about this in a managed environment, I'll leave it for info as the proposed solution should still be revlevant

    -- modified at 23:26 Sunday 25th June, 2006
    GeneralCallback handling Pin
    rjo290928-Apr-03 18:43
    rjo290928-Apr-03 18:43 
    Questionhow to close Aux? Pin
    TangQin24-Feb-03 20:44
    TangQin24-Feb-03 20:44 
    AnswerRe: how to close Aux? Pin
    TangQin24-Feb-03 21:06
    TangQin24-Feb-03 21:06 
    GeneralUnmute does not work. Pin
    Jobe14-Jan-03 4:08
    Jobe14-Jan-03 4:08 
    GeneralRe: Unmute does not work. Pin
    Jobe14-Jan-03 5:11
    Jobe14-Jan-03 5:11 
    GeneralRe: Unmute does not work to wave too Pin
    Burgao24-Dec-04 8:32
    Burgao24-Dec-04 8:32 
    GeneralRe: Unmute does not work to wave too Pin
    sabit23-Jun-06 18:10
    sabit23-Jun-06 18:10 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.