private static ISimpleAudioVolume GetVolumeObject(string name) { // dump all audio sessions foreach (AudioSession session in AudioUtilities.GetAllSessions()) { if (session.Process != null) { logger.Info("{0} , {1}", session.Process.ProcessName, session.Process.MainWindowTitle); } if ((session.Process != null) && (session.Process.ProcessName == name)) { ISimpleAudioVolume vol = session.GetControl() as ISimpleAudioVolume; return(vol); } } return(null); // get the speakers (1st render + multimedia) device IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); IMMDevice speakers; deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); // activate the session manager. we need the enumerator Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; object o; speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); IAudioSessionManager2 mgr = (IAudioSessionManager2)o; // enumerate sessions for on this device IAudioSessionEnumerator sessionEnumerator; mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); // search for an audio session with the required name // NOTE: we could also use the process id instead of the app name (with IAudioSessionControl2) ISimpleAudioVolume volumeControl = null; for (int i = 0; i < count; i++) { IAudioSessionControl ctl; sessionEnumerator.GetSession(i, out ctl); string dn; ctl.GetDisplayName(out dn); if (string.Compare(name, dn, StringComparison.OrdinalIgnoreCase) == 0) { volumeControl = ctl as ISimpleAudioVolume; break; } Marshal.ReleaseComObject(ctl); } Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); Marshal.ReleaseComObject(speakers); Marshal.ReleaseComObject(deviceEnumerator); return(volumeControl); }
internal AudioSession(AudioUtilities.IAudioSessionControl2 ctl) { _ctl = ctl; }