Lyxica icon

LPD8 Volume Script

Lyxica | PRO | 05/01/21 09:25:24 AM UTC (Edited) | 0 ⭐ | 1667 👁️ | Never ⏰ | []
C# |

5.07 KB

|

None

|

0 👍

/

0 👎

using System.Collections.Concurrent;
 
namespace SetAppVolumne
{
    static class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine(MidiIn.DeviceInfo(0).ProductName);
            var x = new LDP();
        }
    }
    
    public class MidiEvent
    {
        public int controller;
        public float value;
        public DateTime time;
        
        public MidiEvent(int controller, float value) {
            this.controller = controller;
            this.value = getNormalizedValue(value);
            this.time = DateTime.Now.AddMilliseconds(8);
        }
        
        private float getNormalizedValue(float value)
        {
            // Max = 127
            float range = Math.Clamp(value, 5f, 120f) - 5f;
            float norm = range / 115.0f;
            return norm;
        }
    }
 
    public class LDP
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);
 
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
 
        Dictionary<int, string> lut = new Dictionary<int, string>()
        {
            {51, "System"},
            {52, "ActiveProcess"},
            {55, "foobar2000"},
            {57, "chrome"},
            {58, "Discord"}
        };
 
        ConcurrentDictionary<int, MidiEvent> event_list = new ConcurrentDictionary<int, SetAppVolumne.MidiEvent>();
 
        public LDP()
        {
            printProcessNames();
            
            var inmidi = new MidiIn(0);
            inmidi.MessageReceived += midiIn_messageReceive;
 
            inmidi.Start();
            
            while (true)
            {
                var now = DateTime.Now;
                foreach(var key in this.event_list.Keys)
                {
                    var event_item = this.event_list[key];
                    if (now >= event_item.time)
                    {
                        setVolumeForMatchingProcessNames(this.lut[event_item.controller], event_item.value);
                        while (!this.event_list.TryRemove(key, out _)) {}
                    }
                }
            }
        }
 
        private void midiIn_messageReceive(object sender, MidiInMessageEventArgs e)
        {
            var concrete_event = ((NAudio.Midi.ControlChangeEvent)e.MidiEvent);
            int controller = (int)concrete_event.Controller;
            if (!lut.ContainsKey(controller) && !lut.ContainsKey(controller - 40))
            {
                return;
            }
            
            if (controller > 90) 
            {
                setMuteForMatchingProcessNames(lut[controller - 40], concrete_event.ControllerValue > 0);
            }
            else
            {
                var pod_event = new MidiEvent(controller, concrete_event.ControllerValue);
                this.event_list[controller] = pod_event;
            }
        }
 
        private void setVolumeForMatchingProcessNames(string proc_name, float volume)
        {
            var x = new MMDeviceEnumerator();
            var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
            if (proc_name == "System")
            {
                device.AudioEndpointVolume.MasterVolumeLevelScalar = volume;
                return;
            }
            
            if (proc_name == "ActiveProcess")
            {
                uint active_process;
                GetWindowThreadProcessId(GetForegroundWindow(), out active_process);
                var proc_name_ = Process.GetProcessById((int)active_process).ProcessName;
                
                for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
                {
                    var session = device.AudioSessionManager.Sessions[i];
                    if (Process.GetProcessById((int)session.GetProcessID).ProcessName ==  proc_name_)
                    {
                        session.SimpleAudioVolume.Volume = volume;
                    }
                }
 
                return;
            }
            
            for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
            {
                var session = device.AudioSessionManager.Sessions[i];
                var process = Process.GetProcessById((int)session.GetProcessID);
                if (process.ProcessName.Contains(proc_name))
                {
                    session.SimpleAudioVolume.Volume = volume;
                }
            }
        }
 
        private void setMuteForMatchingProcessNames(string proc_name, bool mute)
        {
            var x = new MMDeviceEnumerator();
            var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
            if (proc_name == "System")
            {
                device.AudioEndpointVolume.Mute = mute;
                return;
            }
 
            if (proc_name == "ActiveProcess")
            {
                uint active_process;
                GetWindowThreadProcessId(GetForegroundWindow(), out active_process);
                var proc_name_ = Process.GetProcessById((int)active_process).ProcessName;
 
                for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
                {
                    var session = device.AudioSessionManager.Sessions[i];
                    if (Process.GetProcessById((int)session.GetProcessID).ProcessName == proc_name_)
                    {
                        session.SimpleAudioVolume.Mute = mute;
                    }
                }
 
                return;
            }
 
            for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
            {
                var session = device.AudioSessionManager.Sessions[i];
                var process = Process.GetProcessById((int)session.GetProcessID);
                if (process.ProcessName.Contains(proc_name))
                {
                    session.SimpleAudioVolume.Mute = mute;
                }
            }
        }
 
        private void printProcessNames()
        {
            var x = new MMDeviceEnumerator();
            var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
 
            for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
            {
                var session = device.AudioSessionManager.Sessions[i];
                var process = Process.GetProcessById((int)session.GetProcessID);
                Console.WriteLine(process.ProcessName);
            }
        }
    }
}
 

Comments