private void OnSessionCreated(object sender, NAudio.CoreAudioApi.Interfaces.IAudioSessionControl asession) { Debug.Assert(System.Threading.Thread.CurrentThread != Context, "Must be called in same thread."); try { var session = new NAudio.CoreAudioApi.AudioSessionControl(asession); int pid = (int)session.GetProcessID; string name = session.DisplayName; float volume = session.SimpleAudioVolume.Volume; var info = ProcessManagerUtility.GetInfo(pid, getPath: true); if (info != null) { //OnNewSession?.Invoke(this, info); var prc = Taskmaster.processmanager.getController(info.Name); if (prc == null && !string.IsNullOrEmpty(info.Path)) { prc = Taskmaster.processmanager.getWatchedPath(info); } if (prc != null) { bool volAdjusted = false; float oldvolume = session.SimpleAudioVolume.Volume; switch (prc.VolumeStrategy) { default: case AudioVolumeStrategy.Ignore: break; case AudioVolumeStrategy.Force: session.SimpleAudioVolume.Volume = prc.Volume; volAdjusted = true; break; case AudioVolumeStrategy.Decrease: if (session.SimpleAudioVolume.Volume > prc.Volume) { session.SimpleAudioVolume.Volume = prc.Volume; volAdjusted = true; } break; case AudioVolumeStrategy.Increase: if (session.SimpleAudioVolume.Volume < prc.Volume) { session.SimpleAudioVolume.Volume = prc.Volume; volAdjusted = true; } break; } if (volAdjusted) { Serilog.Log.Information("<Audio> {Process} (#{Pid}) volume changed from {Source} to {Target}", info.Name, info.Id, string.Format("{0:N1}%", oldvolume * 100), string.Format("{0:N1}%", prc.Volume * 100)); } else { if (Taskmaster.ShowInaction && Taskmaster.DebugAudio) { Serilog.Log.Debug("<Audio> {Name} (#{Pid}) Volume: {Volume} – Already correct (Plan: {Plan})", info.Name, pid, string.Format("{0:N1}%", volume * 100), prc.VolumeStrategy.ToString()); } } } else { if (Taskmaster.ShowInaction && Taskmaster.DebugAudio) { Serilog.Log.Debug("<Audio> {Name} (#{Pid}) Volume: {Volume} – not watched: {Path}", info.Name, pid, string.Format("{0:N1}%", volume * 100), info.Path); } } } else { Serilog.Log.Debug("<Audio> Failed to get info for session (#{Pid})", pid); } } catch (Exception ex) { Logging.Stacktrace(ex); } }
public AudioSession(NAudio.CoreAudioApi.AudioSessionControl audiosession) { session = audiosession; }