internal AudioSessionManager(IAudioSessionManager2 realAudioSessionManager) { _AudioSessionManager = realAudioSessionManager; IAudioSessionEnumerator _SessionEnum ; Marshal.ThrowExceptionForHR(_AudioSessionManager.GetSessionEnumerator(out _SessionEnum)); _Sessions = new SessionCollection(_SessionEnum); }
internal AudioSessionManager(IAudioSessionManager audioSessionManager) { audioSessionInterface = audioSessionManager; audioSessionInterface2 = audioSessionManager as IAudioSessionManager2; RefreshSessions(); }
internal AudioSessionManager(IAudioSessionManager2 realAudioSessionManager) { try { _AudioSessionManager = realAudioSessionManager; IAudioSessionEnumerator _SessionEnum; Marshal.ThrowExceptionForHR(_AudioSessionManager.GetSessionEnumerator(out _SessionEnum)); _Sessions = new SessionCollection(_SessionEnum); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(DateTime.Now); System.Diagnostics.Trace.WriteLine(ex); } }
internal AudioSessionManager2(IAudioSessionManager2 realAudioSessionManager2) { _AudioSessionManager2 = realAudioSessionManager2; RefreshSessions(); }
private static ISimpleAudioVolume GetVolumeObject(int pid) { IMMDeviceEnumerator deviceEnumerator = null; IAudioSessionEnumerator sessionEnumerator = null; IAudioSessionManager2 mgr = null; IMMDevice speakers = null; try { // get the speakers (1st render + multimedia) device deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); 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); mgr = (IAudioSessionManager2)o; // enumerate sessions for on this device mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); // search for an audio session with the required process-id ISimpleAudioVolume volumeControl = null; for (int i = 0; i < count; ++i) { IAudioSessionControl2 ctl = null; try { sessionEnumerator.GetSession(i, out ctl); // NOTE: we could also use the app name from ctl.GetDisplayName() int cpid; ctl.GetProcessId(out cpid); if (cpid == pid) { volumeControl = ctl as ISimpleAudioVolume; break; } } finally { if (ctl != null) { Marshal.ReleaseComObject(ctl); } } } return(volumeControl); } finally { if (sessionEnumerator != null) { Marshal.ReleaseComObject(sessionEnumerator); } if (mgr != null) { Marshal.ReleaseComObject(mgr); } if (speakers != null) { Marshal.ReleaseComObject(speakers); } if (deviceEnumerator != null) { Marshal.ReleaseComObject(deviceEnumerator); } } }
public static void SetApplicationMute(string procname, bool mute) { IAudioSessionManager2 mgr = null; IAudioSessionEnumerator sessionEnumerator = null; try { ISimpleAudioVolume obj = null; mgr = GetAudioSessionManager(); if (mgr == null) { return; } mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); for (int i = 0; i < count; i++) { IAudioSessionControl ctl; sessionEnumerator.GetSession(i, out ctl); if (ctl == null) { continue; } IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2; if (ctl2 != null) { try { if (new AudioSession(ctl2).Process.ProcessName.ToLower().Equals(procname)) { obj = ctl2 as ISimpleAudioVolume; if (mute) { //obj.SetMute(mute, Guid.Empty); try { obj.GetMasterVolume(out volume); // Save old volume } catch (Exception e) { } obj.SetMasterVolume(0f, Guid.Empty); } else { obj.SetMasterVolume(volume, Guid.Empty); } } } catch (Exception e) { Console.WriteLine(e); } } } Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); } catch (Exception spotify_hire_me) { Console.WriteLine(spotify_hire_me); } finally { Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); } return; }
public static VolumeControl GetVolumeControl(int p) { ISimpleAudioVolume volumeControl = null; IMMDeviceEnumerator deviceEnumerator = null; IMMDevice speakers = null; IAudioSessionManager2 sm = null; IAudioSessionEnumerator sessionEnumerator = null; int ctlPid = 0; try { // Get default device deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator(); deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); // Get session manager Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out object o); sm = (IAudioSessionManager2)o; // Get sessions sm.GetSessionEnumerator(out sessionEnumerator); sessionEnumerator.GetCount(out int count); // Get volume control for (int i = 0; i < count; i++) { IAudioSessionControl2 ctl = null; try { sessionEnumerator.GetSession(i, out ctl); if (ctl == null) { continue; } // Get and compare process id ctl.GetProcessId(out ctlPid); if (p == ctlPid) { volumeControl = ctl as ISimpleAudioVolume; break; } } finally { if (volumeControl == null && ctl != null) { Marshal.ReleaseComObject(ctl); // Only release if not target session } } } } finally { if (sessionEnumerator != null) { Marshal.ReleaseComObject(sessionEnumerator); } if (sm != null) { Marshal.ReleaseComObject(sm); } if (speakers != null) { Marshal.ReleaseComObject(speakers); } if (deviceEnumerator != null) { Marshal.ReleaseComObject(deviceEnumerator); } } if (volumeControl != null) { return(new VolumeControl(ctlPid, volumeControl)); } return(null); }
/// <summary> /// 音量操作のためのデータを取得します。 /// </summary> /// <param name="processID">対象のプロセスID。</param> /// <returns>データ。取得に失敗した場合は null。</returns> private static ISimpleAudioVolume GetVolumeObject(uint processID) { ISimpleAudioVolume ret = null; // スピーカーデバイスの取得 IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); IMMDevice speakers; deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); // 列挙のためにセッションマネージャをアクティベート Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; object o; speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); IAudioSessionManager2 mgr = (IAudioSessionManager2)o; // セッションの列挙 IAudioSessionEnumerator sessionEnumerator; mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); for (int i = 0; i < count; i++) { IAudioSessionControl ctl; IAudioSessionControl2 ctl2; sessionEnumerator.GetSession(i, out ctl); ctl2 = ctl as IAudioSessionControl2; uint pid = uint.MaxValue; if (ctl2 != null) { ctl2.GetProcessId(out pid); } if (pid == processID) { ret = ctl2 as ISimpleAudioVolume; break; } if (ctl != null) { Marshal.ReleaseComObject(ctl); } if (ctl2 != null) { Marshal.ReleaseComObject(ctl2); } } Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); Marshal.ReleaseComObject(speakers); Marshal.ReleaseComObject(deviceEnumerator); return(ret); }