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

Vista Core Audio API Master Volume Control

By , 3 May 2012
 
Screenshot - CoreAudioVolume.png

Introduction

Windows Vista features a completely new set of user-mode audio components that provide per application volume control. All legacy APIs such as the waveXxx and mixerXxx functions and DirectSound have been rebuilt on top of these new components so that without any code changes all 'old' applications support this new audio API. This is a great thing except when your application is reading or querying the master volume settings of the operating system because all of a sudden, you are no longer controlling the master volume of the operating system but only of your own application.

Core Audio API

The new API is COM based, and split into four sub APIs which roughly do the following:

  • MMDevice API - This API allows enumeration and instancing of the available audio devices in the system.
  • WASAPI - This API allows playback and recording of audio streams.
  • DeviceTopology API - This API allows access to hardware features such as bass, treble, and auto gain control.
  • EndpointVolume API - This API allows access to the Volume and Peak meters.

The MMDevice and EndpointVolume APIs are needed to control the master volume and mute settings, while the APIs themselves are a huge improvement since the legacy functions lack a nice managed interface, making working with them somehow an unpleasant experience in C#. Writing COM interop code is not for the novice and is error-prone, hence creating a wrapper to do all the plumbing for us seems a good idea.

Using the Code

You always start by creating the enumerator class, allowing you to find the device that you want, or just settle for the default device.

MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
MMDevice defaultDevice = 
  devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);

After you have a reference to an MMDevice object, toggling Mute is as easy as:

defaultDevice.AudioEndpointVolume.Mute = 
             !defaultDevice.AudioEndpointVolume.Mute;

Or getting the volume of the left channel:

Console.WriteLine("Left Volume : {0}", 
      defaultDevice.AudioEndpointVolume.Channels[0].VolumeLevelScalar);

Since the wrapper implements the complete EndpointVolume API, we can also get more advanced things such as peak meters for all channels:

Console.WriteLine("Master Peak : {0}", 
      defaultDevice.AudioMeterInformation.MasterPeakValue);
Console.WriteLine("Left   Peak : {0}", 
      defaultDevice.AudioMeterInformation.PeakValues[0]);
Console.WriteLine("Right  Peak : {0}", 
      defaultDevice.AudioMeterInformation.PeakValues[1]);

If you just want to be informed when somebody changes the volume settings, you can subscribe to the OnVolumeNotification event like this:

defaultDevice.AudioEndpointVolume.OnVolumeNotification += new 
    AudioEndpointVolumeNotificationDelegate(
       AudioEndpointVolume_OnVolumeNotification);
.
.
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
    Console.WriteLine("New Volume {0}", data.MasterVolume);
    Console.WriteLine("Muted      {0}", data.Muted);
}

Points of interest

The documentation of the volume notification states it must be non-blocking. The client should never wait on a synchronization object during an event callback. Keep that in mind when write event handlers.

Although Vista does per-application audio settings, Microsoft has not open up the APIs to enumerate Sessions. So it will not be possible to make a sndvol.exe-like application.

Right now, only the MMDevice and EndpointVolume APIs are implemented; I hope to add the WASAPI in a future update.

History

  • 2007.04.23 - Initial article
  • 2010.05.17 - Updated source and sample

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Ray M.
Web Developer
Netherlands Netherlands
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   
QuestionHow can i use this in VB.net to get the "AudioMeterInformation.MasterPeakValue"member3AgL3 DeeJay26 Apr '13 - 12:09 
AnswerRe: How can i use this in VB.net to get the "AudioMeterInformation.MasterPeakValue"member3AgL3 DeeJay27 Apr '13 - 9:03 
QuestionFollowing Code Cannot Run In Backgroundmemberq1139600966 Apr '13 - 14:07 
GeneralMy vote of 5memberSergio Andrés Gutiérrez Rojas29 Mar '13 - 13:46 
Questionhimembernmuhammad15 Mar '13 - 22:23 
GeneralMy vote of 5memberbachtkb11 Feb '13 - 17:49 
GeneralMy vote of 3memberjason.leex15 Jan '13 - 16:01 
GeneralMy vote of 5memberEdo Tzumer8 Jan '13 - 20:25 
QuestionIs Goodmemberisisbrand7 Jan '13 - 3:02 
GeneralMy vote of 5membersir-West27 Dec '12 - 23:37 
QuestionWhy the files i downloaded is broken?memberLoveIn_LIn21 Nov '12 - 15:23 
QuestionHow can I select the app in "CoreAudioConsoleTest"memberMember 94111563 Nov '12 - 8:16 
QuestionPeak meter level for a capture endpoint always 0.0 unless Microsoft recording panel is openmemberunpocoloco2 Nov '12 - 15:36 
QuestionHow to implement IMMNotificationClientmemberkhoonking26 Sep '12 - 23:29 
AnswerRe: How to implement IMMNotificationClientmemberimaginejta6 Jan '13 - 3:07 
GeneralMy vote of 4memberBurak Tunçbilek30 Aug '12 - 12:13 
Question64/32 compatibilitymemberErik Friesen24 Aug '12 - 11:13 
GeneralMy vote of 4memberBurak Tunçbilek31 Jul '12 - 11:51 
QuestionBug in PropertyStorememberkore_sar19 Jul '12 - 22:20 
GeneralMy vote of 5memberyuzsshuihan11 Jun '12 - 20:48 
QuestionTHANK YOU!!memberphate86712 May '12 - 5:39 
Questiondoesnt load in vs2005 as claimedmemberwilco_sg2 May '12 - 16:39 
AnswerRe: doesnt load in vs2005 as claimedmemberRay M.2 May '12 - 22:56 
SuggestionMy new code for switching the default audio devicememberMadMidi12 Mar '12 - 17:59 
GeneralRe: My new code for switching the default audio devicememberpetervanekeren22 Jan '13 - 3:23 
BugBug Report and Solution: FriendlyName gives wrong result [modified]memberMadMidi12 Mar '12 - 0:18 
GeneralMy vote of 5memberfairyredfox4 Mar '12 - 22:02 
GeneralMy vote of 5memberSteve McLenithan22 Feb '12 - 11:50 
GeneralMy vote of 5memberqzcreativeit13 Feb '12 - 5:29 
Questionseriously?memberqzcreativeit13 Feb '12 - 5:28 
GeneralMy vote of 5memberDr Bob22 Jan '12 - 11:27 
QuestionSimple Volume Controlmembergauravkale22 Dec '11 - 5:35 
QuestioncorememberSpricer16 Dec '11 - 22:21 
QuestioncorememberSpricer16 Dec '11 - 22:13 
AnswerRe: corememberRay M.16 Dec '11 - 22:14 
AnswerRe: corememberMember 869768727 May '12 - 13:10 
QuestioncorememberSpricer16 Dec '11 - 22:05 
AnswerRe: corememberRay M.16 Dec '11 - 22:11 
Questioncoreaudio apimemberSpricer16 Dec '11 - 14:52 
AnswerRe: coreaudio apimemberRay M.16 Dec '11 - 16:33 
QuestionDifference between VB and C#???? [modified]memberLeo de Blank12 Sep '11 - 6:06 
AnswerRe: Difference between VB and C#????memberRay M.12 Sep '11 - 6:19 
GeneralRe: Difference between VB and C#????memberLeo de Blank12 Sep '11 - 9:17 
GeneralRe: Difference between VB and C#????memberRay M.12 Sep '11 - 9:35 
GeneralRe: Difference between VB and C#????memberLeo de Blank12 Sep '11 - 9:39 
QuestionHow can I change left/right channel volume?memberJanJankovsky11 Sep '11 - 0:23 
GeneralMy vote of 5memberRecep GUVEN18 Aug '11 - 7:41 
GeneralMy vote of 5memberMember 809676019 Jul '11 - 10:28 
QuestionStrangeness on Dell Laptopmemberbilliam90413 Jul '11 - 7:43 
GeneralDeviceTopologymemberScott Meesseman16 Jun '11 - 11:48 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 3 May 2012
Article Copyright 2007 by Ray M.
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid