private static Interfaces.IAudioEndpointVolume GetMasterVolumeObject() { Interfaces.IMMDeviceEnumerator deviceEnumerator = null; Interfaces.IMMDevice speakers = null; try { deviceEnumerator = (Interfaces.IMMDeviceEnumerator)(new Interfaces.MMDeviceEnumerator()); deviceEnumerator.GetDefaultAudioEndpoint(Interfaces.EDataFlow.eRender, Interfaces.ERole.eMultimedia, out speakers); Guid IID_IAudioEndpointVolume = typeof(Interfaces.IAudioEndpointVolume).GUID; object o; speakers.Activate(IID_IAudioEndpointVolume, 0, IntPtr.Zero, out o); Interfaces.IAudioEndpointVolume masterVol = (Interfaces.IAudioEndpointVolume)o; return(masterVol); } finally { if (speakers != null) { Marshal.ReleaseComObject(speakers); } if (deviceEnumerator != null) { Marshal.ReleaseComObject(deviceEnumerator); } } }
/// <summary> /// Switches between the master volume mute states depending on the current state /// </summary> /// <returns>the current mute state, true if the volume was muted, false if unmuted</returns> public static bool ToggleMasterVolumeMute() { Interfaces.IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) { return(false); } bool isMuted; masterVol.GetMute(out isMuted); masterVol.SetMute(!isMuted, Guid.Empty); return(!isMuted); } finally { if (masterVol != null) { Marshal.ReleaseComObject(masterVol); } } }
/// <summary> /// Increments or decrements the current volume level by the <see cref="stepAmount"/>. /// </summary> /// <param name="stepAmount">Value between -100 and 100 indicating the desired step amount. Use negative numbers to decrease /// the volume and positive numbers to increase it.</param> /// <returns>the new volume level assigned</returns> public static float StepMasterVolume(float stepAmount) { Interfaces.IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) { return(-1); } float stepAmountScaled = stepAmount / 100; // Get the level float volumeLevel; masterVol.GetMasterVolumeLevelScalar(out volumeLevel); // Calculate the new level float newLevel = volumeLevel + stepAmountScaled; newLevel = Math.Min(1, newLevel); newLevel = Math.Max(0, newLevel); masterVol.SetMasterVolumeLevelScalar(newLevel, Guid.Empty); // Return the new volume level that was set return(newLevel * 100); } finally { if (masterVol != null) { Marshal.ReleaseComObject(masterVol); } } }
/// <summary> /// Sets the master volume to a specific level /// </summary> /// <param name="newLevel">Value between 0 and 100 indicating the desired scalar value of the volume</param> public static void SetMasterVolume(float newLevel) { Interfaces.IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) { return; } masterVol.SetMasterVolumeLevelScalar(newLevel / 100, Guid.Empty); } finally { if (masterVol != null) { Marshal.ReleaseComObject(masterVol); } } }
/// <summary> /// Mute or unmute the master volume /// </summary> /// <param name="isMuted">true to mute the master volume, false to unmute</param> public static void SetMasterVolumeMute(bool isMuted) { Interfaces.IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) { return; } masterVol.SetMute(isMuted, Guid.Empty); } finally { if (masterVol != null) { Marshal.ReleaseComObject(masterVol); } } }
/// <summary> /// Gets the current master volume in scalar values (percentage) /// </summary> /// <returns>-1 in case of an error, if successful the value will be between 0 and 100</returns> public static float GetMasterVolume() { Interfaces.IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) { return(-1); } float volumeLevel; masterVol.GetMasterVolumeLevelScalar(out volumeLevel); return(volumeLevel * 100); } finally { if (masterVol != null) { Marshal.ReleaseComObject(masterVol); } } }