private static ISimpleAudioVolume GetVolumeObject(int pid, IMmDevice device) { // activate the session manager. we need the enumerator Guid iidIAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; device.Activate(ref iidIAudioSessionManager2, 0, IntPtr.Zero, out object o); IAudioSessionManager2 mgr = (IAudioSessionManager2)o; // enumerate sessions for on this device mgr.GetSessionEnumerator(out IAudioSessionEnumerator sessionEnumerator); sessionEnumerator.GetCount(out int 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++) { sessionEnumerator.GetSession(i, out IAudioSessionControl2 ctl); ctl.GetProcessId(out int cpid); if (cpid == pid) { volumeControl = (ISimpleAudioVolume)ctl; break; } Marshal.ReleaseComObject(ctl); } Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); return(volumeControl); }
private static IAudioEndpointVolume GetMasterVolumeObject() { IMMDeviceEnumerator deviceEnumerator = null; IMmDevice speakers = null; try { deviceEnumerator = MmDeviceEnumeratorFactory.CreateInstance(); deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.ERender, ERole.EMultimedia, out speakers); var IID_IAudioEndpointVolume = typeof(IAudioEndpointVolume).GUID; object o; speakers.Activate(ref IID_IAudioEndpointVolume, 0, IntPtr.Zero, out o); IAudioEndpointVolume masterVol = (IAudioEndpointVolume)o; return(masterVol); } finally { if (speakers != null) { Marshal.ReleaseComObject(speakers); } if (deviceEnumerator != null) { Marshal.ReleaseComObject(deviceEnumerator); } } }