Click here to Skip to main content
Click here to Skip to main content

Volume Manipulation Classes

By , 16 Nov 1999
 

Introduction

Many times my applications required audio volume manipulation. To make the volume-enabled application development easier, I decided to create a few C++ classes that would allow me to easily regulate and track the changes of such volume controls as Output Master Volume, WaveOut Volume and Input (WaveIn) Volume. Here I provide such classes that share a common interface (defined in IVolume.h):

  • bool IsAvailable() - Says whether the volume controlling is possible.
  • void Enable() - Enables the line of the volume control.
  • void Disable() - Disables the line of the volume control.
  • DWORD GetVolumeMetric() - Retrieves the granularity of volume.
  • DWORD GetMinimalVolume() - Retrieves the minimal volume that can be set.
  • DWORD GetMaximalVolume() - Retrieves the maximal volume that can be set.
  • DWORD GetCurrentVolume() - Retrieves the current volume.
  • void SetCurrentVolume( DWORD dwValue ) - Sets the volume.

And the last function allows to register a user-implemented callback that will be called as a notification of volume changes:

void RegisterNotificationSink( PONMICVOULUMECHANGE, DWORD )

This interface is implemented by CVolumeOutMaster (VolumeOutMaster.h/cpp), CVolumeOutWave (VolumeOutWave.h/cpp) and CVolumeInXXX (VolumeInXXX.h/cpp) classes. The usage of the classes is very simple:

In your StdAfx.h, include "mmSystem.h" and make sure you link to the "winmm.lib" (#pragma comment(lib, "winmm.lib")). Then, if you are going to use Output Mater volume control, include "VolumeOutMaster.h", say, to the StdAfx.h.

The IVolume.h, VolumeInXXX.h, VolumeInXXX.cpp are to be inserted as your project files.

...
void CALLBACK MasterVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue );
...
// Volume control Initialization
IVolume* pMasterVolume = (IVolume*)new CVolumeOutMaster();
if ( !pMasterVolume || !pMasterVolume->IsAvailable() )
{
    // handle error
}
pMasterVolume->Enable();
pMasterVolume->RegisterNotificationSink( MasterVolumeChanged, dwAnyUserValue );
...
pMasterVolume->SetCurrentVolume( dwVolumeToSet );
...
DWORD dwCurrentVolume = pMasterVolume->SetCurrentVolume();
...
void CALLBACK MasterVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
{
   // handle the volume change
}
...

Very simple, isn't it? Yet, the CVolumeInXXX class requires more explanation. In order to manipulate the Input volume, the source line index is to be passed to the constructor. Confused? Please, be not. CVolumeInXXX class provides a static function to enumerate those lines:

bool EnumerateInputLines( PINPUTLINEPROC, DWORD dwUserValue );

This allows you to manipulate the volume of any WaveIn-based lines. Say, you want to manipulate the microphone volume:

...
bool CALLBACK EnumInputLineProc( UINT uLineIndex, 
              MIXERLINE* pLineInfo, DWORD dwUserValue );
...
// Initialization
UINT uMicrophoneLineIndex = (UINT)-1;
if ( !CVolumeInXXX::EnumerateInputLines( EnumInputLineProc, 
                           (DWORD)&uMicrophoneLineIndex ) )
{
   // handle error
}
if ( uMicrophoneLineIndex == (UINT)-1 )
{
        // Error: mic volume'ing is not available.
}
IVolume* pMicrophoneVolume = 
         (IVolume*)new CVolumeInXXX( uMicrophoneLineIndex );
if ( !pMicrophoneVolume || !pMicrophoneVolume->IsAvailable() )
{
   // handle error
}
// Go on and use pMicrophoneVolume to manipulate the volume
...
bool CALLBACK EnumInputLineProc( UINT uLineIndex, 
              MIXERLINE* pLineInfo, DWORD dwUserValue )
{
    if ( pLineInfo->dwComponentType == 
             MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
    {
        *((UINT*)dwUserValue) = uLineIndex;
        return false;
    }
    return true;
}
...

Be aware, that for performance reasons it is better to have a single instance of a given class per application. So don't rush to create lots of CVolumeInXXX objects, better share the only one through your code.

Conclusion

The proposed classes do not encapsulate all the abilities exposed by the mixers. However, working with a mixer just to add a pretty simple functionality is quite boring. That's why, as I think, the proposed classes might be of some help to you.

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

Alex Chmut
Web Developer
Ukraine Ukraine
Member
No Biography provided

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

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
SuggestionWindows 7 volume control samplememberM A V15 Dec '12 - 1:05 
QuestionLicense?memberLuisVilla16 Feb '12 - 4:48 
AnswerRe: License?memberAlex Chmut16 Feb '12 - 10:15 
GeneralControlling master volume in Win7 - IAudioEndpointVolume - Working sample code in MSDNmemberkormoe15 Jan '12 - 5:39 
GeneralVolume Control in Windows7memberMember 264083617 Aug '10 - 20:41 
GeneralMaking compatiblememberBazKhan18 Jan '09 - 22:49 
QuestionWindows Vista Anyone???member{bill}1 Sep '08 - 9:41 
AnswerRe: Windows Vista Anyone???memberSteven Dong9 Nov '08 - 4:37 
QuestionCallback Functionmemberpeene9 Aug '07 - 5:46 
Questionhow can i control the sound of left and right speakermemberrajneshmalik1 Aug '07 - 21:49 
GeneralProblem in 2000memberlilesh26 Feb '07 - 22:56 
QuestionBegginer's questionmemberlnenad12 Nov '06 - 8:12 
QuestionHigh Definition AudiomemberSaber00119 Jul '06 - 0:09 
QuestionHow to use Volume Manipulation Classesmembercastlezhen28 Apr '06 - 3:04 
GeneralDiable Microphonememberanakia18 Apr '06 - 17:05 
General[Q] Love your article and more...memberyoontet17 Aug '05 - 5:52 
GeneralRe: [Q] Love your article and more...memberyoontet17 Aug '05 - 6:23 
GeneralProblems with Microphone controlmemberVirendra Sharma25 May '05 - 23:29 
GeneralRe: Problems with Microphone controlmemberFco Javier Lama3 May '06 - 23:24 
Generaldoesn t work with a USB headsetmemberbartouze22 Apr '05 - 3:09 
GeneralProblem passing callback function in...memberel davo4 Mar '04 - 13:48 
GeneralRe: Problem passing callback function in...memberladuran27 Aug '04 - 12:55 
Make sure you declared the function as CALLBACK which boils down to __stdcall
GeneralRe: Problem passing callback function in...memberVinod Vijayan29 Jan '05 - 0:06 
QuestionHow to determine whether volume is enabled?memberM A V22 Feb '04 - 9:54 
GeneralMany Compile Errors - microphone implementationmemberBobboots12 Feb '04 - 19:19 
GeneralSolved Compile - microphone vol does not change...sussAnonymous13 Feb '04 - 16:40 
Generalline-in playbacksussAnonymous12 Feb '04 - 10:53 
GeneralRe: line-in playbackmemberSaber00119 Jul '06 - 0:13 
GeneralRe: line-in playbackmemberwanhaven23 Feb '07 - 1:38 
GeneralDisplaying input audio level in progress barmemberHridaynath Musale10 Feb '04 - 13:24 
GeneralFound bug. It should called the destructor.membersaintstone1 Feb '04 - 17:28 
GeneralThanks!membersparky90923 Oct '03 - 1:05 
GeneralRe: Thanks!sussAnonymous8 Aug '04 - 4:33 
GeneralmmSystem.hmemberdietercools20 Sep '03 - 13:02 
GeneralRe: mmSystem.hmembersparky90923 Oct '03 - 0:57 
GeneralRe: mmSystem.hmemberdietercools11 Feb '04 - 8:42 
GeneralRe: mmSystem.hsussAnonymous11 Feb '04 - 13:21 
QuestionHow to support WinCEmemberweblxj2 Jul '03 - 15:03 
AnswerRe: How to support WinCEmemberAlex Chmut2 Jul '03 - 22:17 
Generalstdafx.hmemberM.Joshi5 Apr '03 - 5:44 
AnswerRe: stdafx.hmemberSaber00118 Jul '06 - 23:54 
GeneralRe: stdafx.hmemberSaber00119 Jul '06 - 0:05 
Generalto increse the volumesussxyz1233 Feb '03 - 1:57 
GeneralRe: to increse the volumesussAnonymous20 Nov '03 - 22:26 
GeneralDoes not work while device in usemembercodermallu1 Aug '02 - 3:11 
GeneralRe: Does not work while device in usememberPeter B.22 May '03 - 10:55 
GeneralHelp: compilation error for VolumeInXXX.cppmemberAnnette Skaar7 Jul '02 - 17:51 
QuestionChanges the balance !?!?memberLou4 May '02 - 13:03 
AnswerRe: Changes the balance !?!?memberKuZiKuZi6 Jan '05 - 20:04 
GeneralDoes not work with USB Audio DevicememberAnonymous12 Feb '02 - 8:09 

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 17 Nov 1999
Article Copyright 1999 by Alex Chmut
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid