Compare commits

..

No commits in common. "708180dc8e8e8e07a7e611e36e1d8c0872e67d82" and "f94052e54b49285d3c59e9c1b74de6ee91b70d22" have entirely different histories.

4 changed files with 33 additions and 70 deletions

View File

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

View File

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

View File

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

View File

@ -1,54 +0,0 @@
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}");
}
}
}
}