Q:

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:

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? 

A:

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