Haven't checked but it seems you can indeed use WASAPI for this. Use this http://msdn.microsoft.com/en-us/library/windows/desktop/dd316769%28v=vs.85%29.aspx document as a starting point. The way I expect this to work is that for each IMMDevice (obtained from IMMDeviceEnumerator), you activate an IAudioSessionManager, use that to obtain an ISimpleAudioVolume and then you're able to use Get/SetMasterVolume for the session. In order for IAudioSessionManager to get you an ISimpleAudioVolume you're also going to need the session GUID for the session you want to control as multiple processes may write to the same device in shared mode. For this, you can use IAudioSessionEnumerator to obtain "current" sessions, but note that this will not be updated as new sessions are added to the system. For that you're going to need IAudioSessionManager2::RegisterSessionNotification (beware, has some specific threading requirements: it must run in the MTA apartment) and implement your own callback to add sessions into some internal collection (maintained by you and initially filled from IAudioSessionEnumerator). Also note that the session enumerator an notification stuff gets you an IAudioSessionControl, you'll have to QueryInterface that into IAudioSessionControl2 to get the session guid which you'll ultimately need to control the per-session volume. And finally, you'll also want to use IAudioSessionControl::RegisterAudioSessionNotification to get notified of changes in a session's master volume so you can keep in sync with (for example) sndvol, the windows volume mixer. Note again that this is all from memory and I haven't actually tested or verified any of this. About WASAPI being oversized, yes I think you're quite right. Anyway, this should at least get you started. Good luck.