Introduction

Sometimes we need to control the volume of our soundcard and Microsoft has provided
an API waveOutSetVolume() to do this. Unfortunately this can only set
the playback volume. When we want to set the volume of other lines such as mic or MIDI or
the line-in for recording, there is NO API to help!

At first I thought that DirectMedia may provide an interface to do this, and
it does, but after I coded it and tested, the result is not so good. The
interface IAMAudioInputMixer can only handle the record, not the playback, and
most of all:

"The name of each pin, such as "Line in" or "Microphone", reflects the type of input"

but the name is not the same on different machines!

eg:
I want to set the volume of the microphone, so I find the pin by name "Microphone"
and control it, it works on my computer. When I tested it at another machine, it failed
because the name of the pin is "Mic Volume"!

I tried many ways and at last I worked out how to do it using MIXER.

There may be some people that have had a headache over the same quetion, so I released
my solution. I hope it helps you.

Usage

Remarks

The constructor takes two parameters, the first is ComponentType
from MIXERLINE (see MSDN for all possible values), and the second is an enum
type, which
can be Record or Play. The above controls the record (waveIn) volume, you can
also control
the playback (waveout) volume using:

CMixer mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Play);

Notice that there is no default constructor takes no parameters, so if
you use it in a C++ class, you should code it like this:

if you have any suggestion or improvement, plz let me know: whoo@isWhoo.com

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.

Comments and Discussions

Hi Iam new bibe to directshow. In my application want to control microphone volume dynamically. Sometimes I need to mute/unmute microphone volume. During google search I got this link ,hope this will exactly suit my requirment. As you said I created a simple VC++ console application and included the Mixer.h and Mixer.cpp into my project.

Inside CMixer constructor call Iam getting an error while running this linehr = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);Error code:An attempt was load to a program with an incorrect format HRESULT-->0x0000000b