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