I want to control other application volume(firefox).
i can do it with Volume Mixer
What is the libraries of the Volume Mixer
?
There is a simple fix: manually drag all of them to 100% and the drag the master all the way to 0. Drag the master up again. You'll notice they're all in sync now. This happens if you modiy the volumes for programs individually to different levels and you attempt to modify them all use the master slider.
Volume controls on your Windows 10 PC can change automatically for several reasons. A faulty volume rocker on your headset, third-party app conflict, and an audio driver glitch are the common causes for this problem.
Along with many other interface changes, Microsoft removed the classic mixer in Windows 11 and replaced it with a unified sound menu. Unfortunately, not everyone is a fan of the change, and you might be looking to restore the classic Volume Mixer in Windows 11.
In your Windows 10 settings, navigate to Sound, and at the bottom of the page, locate "App volume and device preferences" under the Advanced sound options. From that screen, press the reset button to "reset to the Microsoft recommended defaults."
Here is a sample C# Console Application that does it. It's based on the Windows Core Audio Library. It works only on Windows 7 and higher.
using System; using System.Runtime.InteropServices; using System.Collections.Generic; namespace SetAppVolumne { class Program { static void Main(string[] args) { const string app = "Mozilla Firefox"; foreach (string name in EnumerateApplications()) { Console.WriteLine("name:" + name); if (name == app) { // display mute state & volume level (% of master) Console.WriteLine("Mute:" + GetApplicationMute(app)); Console.WriteLine("Volume:" + GetApplicationVolume(app)); // mute the application SetApplicationMute(app, true); // set the volume to half of master volume (50%) SetApplicationVolume(app, 50); } } } public static float? GetApplicationVolume(string name) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return null; float level; volume.GetMasterVolume(out level); return level * 100; } public static bool? GetApplicationMute(string name) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return null; bool mute; volume.GetMute(out mute); return mute; } public static void SetApplicationVolume(string name, float level) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return; Guid guid = Guid.Empty; volume.SetMasterVolume(level / 100, ref guid); } public static void SetApplicationMute(string name, bool mute) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return; Guid guid = Guid.Empty; volume.SetMute(mute, ref guid); } public static IEnumerable<string> EnumerateApplications() { // 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); for (int i = 0; i < count; i++) { IAudioSessionControl ctl; sessionEnumerator.GetSession(i, out ctl); string dn; ctl.GetDisplayName(out dn); yield return dn; Marshal.ReleaseComObject(ctl); } Marshal.ReleaseComObject(sessionEnumerator); Marshal.ReleaseComObject(mgr); Marshal.ReleaseComObject(speakers); Marshal.ReleaseComObject(deviceEnumerator); } private static ISimpleAudioVolume GetVolumeObject(string name) { // 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; } } [ComImport] [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] internal class MMDeviceEnumerator { } internal enum EDataFlow { eRender, eCapture, eAll, EDataFlow_enum_count } internal enum ERole { eConsole, eMultimedia, eCommunications, ERole_enum_count } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDeviceEnumerator { int NotImpl1(); [PreserveSig] int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppDevice); // the rest is not implemented } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDevice { [PreserveSig] int Activate(ref Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface); // the rest is not implemented } [Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioSessionManager2 { int NotImpl1(); int NotImpl2(); [PreserveSig] int GetSessionEnumerator(out IAudioSessionEnumerator SessionEnum); // the rest is not implemented } [Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioSessionEnumerator { [PreserveSig] int GetCount(out int SessionCount); [PreserveSig] int GetSession(int SessionCount, out IAudioSessionControl Session); } [Guid("F4B1A599-7266-4319-A8CA-E70ACB11E8CD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioSessionControl { int NotImpl1(); [PreserveSig] int GetDisplayName([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); // the rest is not implemented } [Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface ISimpleAudioVolume { [PreserveSig] int SetMasterVolume(float fLevel, ref Guid EventContext); [PreserveSig] int GetMasterVolume(out float pfLevel); [PreserveSig] int SetMute(bool bMute, ref Guid EventContext); [PreserveSig] int GetMute(out bool pbMute); } }
Note: I have not defined the interfaces completely, only what was needed for the code to work.
I know this is too late, but I needed this lately, I tried Simon's answer and couldn't get it to work, tried ElektroStudios's comment and Simon's other answer and still nothing, I don't know what I did wrong but I gave up on it.
I later found this asnwer and got it to work using CSCore
private static void Main(string[] args) { using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render)) { using (var sessionEnumerator = sessionManager.GetSessionEnumerator()) { foreach (var session in sessionEnumerator) { using (var simpleVolume = session.QueryInterface<SimpleAudioVolume>()) using (var sessionControl = session.QueryInterface<AudioSessionControl2>()) { if (sessionControl.ProcessID == 2436) simpleVolume.MasterVolume = 0.5f; } } } } Console.ReadKey(); } private static AudioSessionManager2 GetDefaultAudioSessionManager2(DataFlow dataFlow) { using (var enumerator = new MMDeviceEnumerator()) { using (var device = enumerator.GetDefaultAudioEndpoint(dataFlow, Role.Multimedia)) { Debug.WriteLine("DefaultDevice: " + device.FriendlyName); var sessionManager = AudioSessionManager2.FromMMDevice(device); return sessionManager; } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With