Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment