using BarRaider.SdTools; using BarRaider.SdTools.Payloads; using CoreAudio; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FocusVolumeControl { /* todo: link both discord processes steam not detecting long press reset option for what to do when on app without sound gitea */ [PluginActionId("com.dlprows.focusvolumecontrol.dialaction")] public class DialAction : EncoderBase { private class PluginSettings { public static PluginSettings CreateDefaultSettings() { PluginSettings instance = new PluginSettings(); return instance; } } private PluginSettings settings; //IntPtr _foregroundWindowChangedEvent; //WinEventDelegate _delegate; ActiveAudioSessionWrapper _currentAudioSession; AudioHelper _audioHelper = new AudioHelper(); public DialAction(ISDConnection connection, InitialPayload payload) : base(connection, payload) { if (payload.Settings == null || payload.Settings.Count == 0) { settings = PluginSettings.CreateDefaultSettings(); SaveSettings(); } else { settings = payload.Settings.ToObject(); } //_delegate = new WinEventDelegate(WinEventProc); //_foregroundWindowChangedEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _delegate, 0, 0, WINEVENT_OUTOFCONTEXT); } public override async void DialDown(DialPayload payload) { //dial pressed down Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Down"); if(_currentAudioSession != null) { _currentAudioSession.Volume.Mute = !_currentAudioSession.Volume.Mute; var uiState = UIState.Build(_currentAudioSession); await Connection.SetFeedbackAsync(uiState); } else { await Connection.ShowAlert(); } } public override async void TouchPress(TouchpadPressPayload payload) { Logger.Instance.LogMessage(TracingLevel.INFO, "Touch Press"); if (payload.IsLongPress) { //todo: iterate through all sessions setting them back to 100 except the master volume } else { if (_currentAudioSession != null) { _currentAudioSession.Volume.Mute = !_currentAudioSession.Volume.Mute; var uiState = UIState.Build(_currentAudioSession); await Connection.SetFeedbackAsync(uiState); } else { await Connection.ShowAlert(); } } } public override async void DialRotate(DialRotatePayload payload) { Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Rotate"); //dial rotated. ticks positive for right, negative for left if(_currentAudioSession != null) { _currentAudioSession.Volume.MasterVolume += (0.01f) * payload.Ticks; var uiState = UIState.Build(_currentAudioSession); await Connection.SetFeedbackAsync(uiState); } else { await Connection.ShowAlert(); } } public override void DialUp(DialPayload payload) { //dial unpressed Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Up"); } public override void Dispose() { /* if(_foregroundWindowChangedEvent != IntPtr.Zero) { Native.UnhookWinEvent(_foregroundWindowChangedEvent); } */ } public override async void OnTick() { //called once every 1000ms and can be used for updating the title/image fo the key var activeSession = _audioHelper.GetActiveSession(); if (activeSession == null) { //todo: something? } else { _currentAudioSession = activeSession; } if(_currentAudioSession != null) { var uiState = UIState.BuildWithImage(_currentAudioSession); await Connection.SetFeedbackAsync(uiState); } } public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { } public override void ReceivedSettings(ReceivedSettingsPayload payload) { Tools.AutoPopulateSettings(settings, payload.Settings); SaveSettings(); } private Task SaveSettings() { return Connection.SetSettingsAsync(JObject.FromObject(settings)); } /* public async void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { var activeSession = _audioHelper.GetActiveSession(); if(activeSession == null) { //todo: something? } else { _currentAudioSession = activeSession; //populate the UI await Connection.SetTitleAsync(_currentAudioSession.DisplayName); } } */ } }