Click here to Skip to main content
Licence 
First Posted 27 Oct 2001
Views 204,130
Bookmarked 46 times

A simple record and playback volume control class

By | 27 Oct 2001 | Article
A class to make setting the record and playback volume easier

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

  1. include the Mixer.h and Mixer.cpp into your project;
  2. 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:

// MyClass.h
//////////////////////////
class CMixer;
class CMyClass
{
  CMyClass();
private:
  CMixer m_mixer;
....
}

//MyClass.cpp
///////////////////////////
CMyClass::CMyClass():m_mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Play)
{
}
....

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.

A list of licenses authors might use can be found here

About the Author

Whoo

Architect

China China

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionIs error? Pinmemberyangzmpang@20:54 22 Aug '10  
GeneralCMixer constructor error Pinmemberanandveerappan23:24 4 Mar '10  
GeneralAnother Code Project article on this topic Pinmemberdaluu9:06 5 Sep '07  
GeneralPlease, I need help Pinmemberwanhaven4:00 27 Feb '07  
GeneralConversion error Pinmembersraigiuz22:44 25 Jan '07  
GeneralThe archive file is not avaible ... Pinmemberjere44trial@yahoo.fr5:28 29 Nov '06  
QuestionHow to choose FrontPanel MIC or BackPanel MIC? Pinmemberguzeliang21:48 9 Oct '06  
AnswerRe: How to choose FrontPanel MIC or BackPanel MIC? Pinmemberknightriderjon23:21 30 May '07  
GeneralRecord Volume Control on Vista OS Pinmembervarungarg19:01 25 Jul '06  
QuestionAdjusting Record Volume Pinmember~Jabeen~20:46 22 Jun '06  
AnswerRe: Adjusting Record Volume [modified] PinmemberMartin Skibye21:14 25 Mar '07  
GeneralMixer.obj : error LNK2001 PinmemberLowFly3:21 23 Nov '05  
GeneralIt was a valiant effort, but... PinmemberProdelos5:01 15 Jun '05  
..unfortunately, it fails to accomplish its objective. I ran into a similar problem when I wrote the Stay In Touch Messager Client. The folks at PalTalk seemed to have a similar problem with their client a few years back, too. Eventually, the PalTalk folks opted to use the Windows' "Audio Setup Wizard," but even that seems to fail 10-15% of the time.
 
There doesn't seem to be a 'one-size-fits-all' solution to the problem because each sound card vendor seems to do things their own way. That coupled with the different languages supported by Windows seems to make this a lost cause. The best you can hope for is a 'horseshoes-n-grenades' solution.
 
The problem with this CMixer class is that it fails to take into account the possibility that the microphone recording control may not actually be a MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE control. It may be part of a MIXERCONTROL_CONTROLTYPE_MUX control. And in that situation, the only way to find the control is by enumerating all of the controls and searching for it by name... and as you indicated at the top of your article, the name could be virtually anything, from "Microphone" to "Mic Volume"... or even something in a foreign language.
 
My 'horseshoes-n-grenades' solution was to enumerate all of the recording controls in a combobox that I placed in an "Audio Setup" dialog. The program searches through the list items of controls in the combobox for 'Microphone' and if it finds it, it selects that list item. If that fails, it searchs through the list for anything that starts with 'Mic' and selects whatever it finds. If the 'Mic' search fails, it selects the first list item in the combobox and lets the user to select the appropriate recording control from the list in the combobox.
 
It is a considerably complex process to traverse the mixer devices hierarchy, but there doesn't seem to be a simple way to accurately locate the desired control without traversing the hierarchy and searching for the control by name, rather than by control type.
 

GeneralRe: It was a valiant effort, but... Pinmemberkoehler2:28 10 Feb '06  
GeneralCMixer class to controll multiple cards in one system Pinmembersujudavid0:30 2 Mar '05  
GeneralRe: CMixer class to controll multiple cards in one system PinmemberProdelos3:35 15 Jun '05  
GeneralThank you very much Pinmemberniukaimin16:45 27 Jan '05  
GeneralComawhite is right. PinmemberWhoo1:52 17 Dec '04  
QuestionHow do you SELECT the Control Pinmemberckathrani10:17 16 Dec '04  
AnswerRe: How do you SELECT the Control Pinmemberdaluu8:50 5 Sep '07  
AnswerRe: How do you SELECT the Control PinmemberMartin Skibye20:37 25 Feb '08  
Generalmicrophone record volume PinsussAnonymous17:41 15 Dec '04  
GeneralLink doesn't work Pinmemberramontxu2:08 6 Jul '04  
GeneralRe: Link doesn't work Pinmemberoyljerry2:07 8 Nov '04  
GeneralPlayback Pinmemberwhacker8:41 30 Jun '04  

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

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120528.1 | Last Updated 28 Oct 2001
Article Copyright 2001 by Whoo
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid