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
- include the Mixer.h and Mixer.cpp into your project;
- add code like this:
CMixer mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Record);
......
mixer.GetVolume();
mixer.SetVolume(...);
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:
class CMixer;
class CMyClass
{
CMyClass();
private:
CMixer m_mixer;
....
}
CMyClass::CMyClass():m_mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Play)
{
}
....
if you have any suggestion or improvement, plz let me know: whoo@isWhoo.com