Search code examples
c++winapicomcore-audiowasapi

How is SndVol able to change the volume level of a given audio session?


I am writing my own API to perform some of the functionality of the SndVol system utility. I would like part of this API to be the ability to set the volume level of a given audio session.

SndVol displays a slider on the "Device" panel that the user can use to change the master volume level of the audio device as well as a slider for each audio session (on the "Applications" panel) that changes the volume level of the session:

Screenshot of SndVol Volume Mixer

If I drag the slider handle for one of the audio sessions, then SndVol is able to change the audio session's volume level. How does it do that?

I thought that it was possible using Windows Vista's Core Audio API, but I encountered the problem that although I am able to iterate audio sessions of a device using an IAudioSessionEnumerator, the IAudioSessionEnumerator only gives me access to IAudioSessionControl objects, but I need the IAudioClient object to obtain an ISimpleAudioVolume object that I can use to set the audio session volume level. Is it possible to get the IAudioClient object associated with an IAudioSessionControl object?


Solution

  • If you call QueryInterface on the IAudioSessionControl interface, you can often get access to an ISimpleAudioVolume.