Compare commits

..

3 Commits

Author SHA1 Message Date
708180dc8e Commenting out the debug/info logs so the logs will only have errors 2023-09-24 15:02:20 -06:00
5711ace990 Fixed an issue where disposing was not working correctly, so using auto-profiles by application was causing the plugin to stop responding
now there is just one event loop for window changing, and instances of the dial action can register to the event
2023-09-24 15:01:12 -06:00
d89c8b1ffa Fix a bug where the step size starts at 0 instead of 1 2023-09-24 14:59:52 -06:00
4 changed files with 70 additions and 33 deletions

View File

@ -10,6 +10,11 @@ namespace FocusVolumeControl.AudioSessions
{
public static float GetAdjustedVolume(float startingVolume, int step, int ticks)
{
if(step <= 0)
{
step = 1;
}
var level = startingVolume;
level += 0.01f * step * ticks;

View File

@ -26,20 +26,13 @@ public class DialAction : EncoderBase
{
PluginSettings instance = new PluginSettings();
instance.FallbackBehavior = FallbackBehavior.SystemSounds;
instance.StepSize = 1;
return instance;
}
}
private PluginSettings settings;
IntPtr _foregroundWindowChangedEvent;
Native.WinEventDelegate _delegate;
PluginSettings settings;
AudioHelper _audioHelper = new AudioHelper();
Thread _thread;
Dispatcher _dispatcher;
UIState _previousState;
public DialAction(ISDConnection connection, InitialPayload payload) : base(connection, payload)
@ -54,19 +47,7 @@ public class DialAction : EncoderBase
settings = payload.Settings.ToObject<PluginSettings>();
}
_thread = new Thread(() =>
{
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Registering for events");
_delegate = new Native.WinEventDelegate(WinEventProc);
_foregroundWindowChangedEvent = Native.RegisterForForegroundWindowChangedEvent(_delegate);
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Starting Dispatcher");
_dispatcher = Dispatcher.CurrentDispatcher;
Dispatcher.Run();
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Dispatcher Stopped");
});
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
WindowChangedEventLoop.Instance.WindowChanged += WindowChanged;
var session = _audioHelper.GetActiveSession(settings.FallbackBehavior);
_ = UpdateStateIfNeeded(session);
@ -74,19 +55,15 @@ public class DialAction : EncoderBase
public override void Dispose()
{
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Disposing");
if (_foregroundWindowChangedEvent != IntPtr.Zero)
{
Native.UnhookWinEvent(_foregroundWindowChangedEvent);
}
_dispatcher.InvokeShutdown();
//Logger.Instance.LogMessage(TracingLevel.DEBUG, "Disposing");
WindowChangedEventLoop.Instance.WindowChanged -= WindowChanged;
}
public override async void DialDown(DialPayload payload)
{
try
{
Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Down");
//Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Down");
await ToggleMuteAsync();
}
catch (Exception ex)
@ -100,7 +77,7 @@ public class DialAction : EncoderBase
{
try
{
Logger.Instance.LogMessage(TracingLevel.INFO, "Touch Press");
//Logger.Instance.LogMessage(TracingLevel.INFO, "Touch Press");
if (payload.IsLongPress)
{
await ResetAllAsync();
@ -120,7 +97,7 @@ public class DialAction : EncoderBase
{
try
{
Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Rotate");
//Logger.Instance.LogMessage(TracingLevel.INFO, "Dial Rotate");
//dial rotated. ticks positive for right, negative for left
var activeSession = _audioHelper.Current;
if (activeSession != null)
@ -258,7 +235,7 @@ public class DialAction : EncoderBase
}
public void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
public void WindowChanged()
{
try
{
@ -266,7 +243,7 @@ public class DialAction : EncoderBase
}
catch (Exception ex)
{
Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in DialDown:\n {ex}");
Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in Window Down:\n {ex}");
}
}
}

View File

@ -70,6 +70,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UI\UIState.cs" />
<Compile Include="UI\ValueWithOpacity.cs" />
<Compile Include="WindowChangedEventLoop.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />

View File

@ -0,0 +1,54 @@
using BarRaider.SdTools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
namespace FocusVolumeControl
{
internal class WindowChangedEventLoop
{
private static readonly Lazy<WindowChangedEventLoop> _lazy = new Lazy<WindowChangedEventLoop>(() => new WindowChangedEventLoop());
public static WindowChangedEventLoop Instance => _lazy.Value;
readonly Thread _thread;
Dispatcher _dispatcher;
IntPtr _foregroundWindowChangedEvent;
Native.WinEventDelegate _delegate;
private WindowChangedEventLoop()
{
_thread = new Thread(() =>
{
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Starting Window Changed Event Loop");
_delegate = new Native.WinEventDelegate(WinEventProc);
_foregroundWindowChangedEvent = Native.RegisterForForegroundWindowChangedEvent(_delegate);
_dispatcher = Dispatcher.CurrentDispatcher;
Dispatcher.Run();
Logger.Instance.LogMessage(TracingLevel.DEBUG, "Window Changed Event Loop Stopped");
});
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public event Action WindowChanged;
private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
try
{
WindowChanged?.Invoke();
}
catch (Exception ex)
{
Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in EventHandler:\n {ex}");
}
}
}
}