Click here to Skip to main content
3.19 / 5, 15 votes
3 votes, 27.3%
1
1 vote, 9.1%
2

3

4
7 votes, 63.6%
5

A simple record and playback volume control class

By Whoo | 27 Oct 2001
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 for this article
Add a reason or comment to your vote:

Comments and Discussions

You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 62 (Total in Forum: 62) (Refresh)FirstPrevNext
GeneralIs error? Pinmemberyangzmpang@21:54 22 Aug '10  
GeneralCMixer constructor error Pinmemberanandveerappan0:24 5 Mar '10  
GeneralAnother Code Project article on this topic Pinmemberdaluu10:06 5 Sep '07  
GeneralPlease, I need help Pinmemberwanhaven5:00 27 Feb '07  
GeneralConversion error Pinmembersraigiuz23:44 25 Jan '07  
GeneralThe archive file is not avaible ... Pinmemberjere44trial@yahoo.fr6:28 29 Nov '06  
QuestionHow to choose FrontPanel MIC or BackPanel MIC? Pinmemberguzeliang22:48 9 Oct '06  
AnswerRe: How to choose FrontPanel MIC or BackPanel MIC? Pinmemberknightriderjon0:21 31 May '07  
GeneralRecord Volume Control on Vista OS Pinmembervarungarg20:01 25 Jul '06  
QuestionAdjusting Record Volume Pinmember~Jabeen~21:46 22 Jun '06  
AnswerRe: Adjusting Record Volume [modified] PinmemberMartin Skibye22:14 25 Mar '07  
GeneralMixer.obj : error LNK2001 PinmemberLowFly4:21 23 Nov '05  
GeneralIt was a valiant effort, but... PinmemberProdelos6:01 15 Jun '05  
GeneralRe: It was a valiant effort, but... Pinmemberkoehler3:28 10 Feb '06  
GeneralCMixer class to controll multiple cards in one system Pinmembersujudavid1:30 2 Mar '05  
GeneralRe: CMixer class to controll multiple cards in one system PinmemberProdelos4:35 15 Jun '05  
GeneralThank you very much Pinmemberniukaimin17:45 27 Jan '05  
GeneralComawhite is right. PinmemberWhoo2:52 17 Dec '04  
GeneralHow do you SELECT the Control Pinmemberckathrani11:17 16 Dec '04  
GeneralRe: How do you SELECT the Control Pinmemberdaluu9:50 5 Sep '07  
AnswerRe: How do you SELECT the Control PinmemberMartin Skibye21:37 25 Feb '08  
Generalmicrophone record volume PinsussAnonymous18:41 15 Dec '04  
GeneralLink doesn't work Pinmemberramontxu3:08 6 Jul '04  
GeneralRe: Link doesn't work Pinmemberoyljerry3:07 8 Nov '04  
GeneralPlayback Pinmemberwhacker9:41 30 Jun '04  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

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

PermaLink | Privacy | Terms of Use
Last Updated: 27 Oct 2001

Copyright 2001 by Whoo
Everything else Copyright © CodeProject, 1999-2010
Web19 | Advertise on the Code Project