Compare commits

..

2 Commits

3 changed files with 47 additions and 19 deletions

View File

@ -5,45 +5,58 @@ using BarRaider.SdTools;
using System.Drawing; using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using FocusVolumeControl.UI; using FocusVolumeControl.UI;
using BitFaster.Caching.Lru;
namespace FocusVolumeControl.AudioSessions; namespace FocusVolumeControl.AudioSessions;
public sealed class ActiveAudioSessionWrapper : IAudioSession public sealed class ActiveAudioSessionWrapper : IAudioSession
{ {
static ConcurrentLru<string, string> _iconCache = new ConcurrentLru<string, string>(10);
public string DisplayName { get; set; } public string DisplayName { get; set; }
public string ExecutablePath { get; set; } public string ExecutablePath { get; set; }
public string IconPath { get; set; } public string IconPath { get; set; }
private List<IAudioSessionControl2> Sessions { get; } = new List<IAudioSessionControl2>(); private List<IAudioSessionControl2> Sessions { get; } = new List<IAudioSessionControl2>();
private IEnumerable<ISimpleAudioVolume> Volume => Sessions.Cast<ISimpleAudioVolume>(); private IEnumerable<ISimpleAudioVolume> Volume => Sessions.Cast<ISimpleAudioVolume>();
string _icon; string GetIconFromIconPath()
{
return _iconCache.GetOrAdd(IconPath, (key) =>
{
var tmp = (Bitmap)Bitmap.FromFile(IconPath);
tmp.MakeTransparent();
return Tools.ImageToBase64(tmp, true);
});
}
string GetIconFromExecutablePath()
{
return _iconCache.GetOrAdd(ExecutablePath, (key) =>
{
var tmp = IconExtraction.GetIcon(ExecutablePath);
//var tmp = Icon.ExtractAssociatedIcon(ExecutablePath);
return Tools.ImageToBase64(tmp, true);
});
}
public string GetIcon() public string GetIcon()
{
if (string.IsNullOrEmpty(_icon))
{ {
try try
{ {
if (!string.IsNullOrEmpty(IconPath)) if (!string.IsNullOrEmpty(IconPath))
{ {
var tmp = (Bitmap)Bitmap.FromFile(IconPath); return GetIconFromIconPath();
tmp.MakeTransparent();
_icon = Tools.ImageToBase64(tmp, true);
} }
else else
{ {
var tmp = IconExtraction.GetIcon(ExecutablePath); return GetIconFromExecutablePath();
//var tmp = Icon.ExtractAssociatedIcon(ExecutablePath);
_icon = Tools.ImageToBase64(tmp, true);
} }
} }
catch catch
{ {
_icon = "Images/encoderIcon"; return "Images/encoderIcon";
} }
} }
return _icon;
}
public bool Any() public bool Any()
{ {

View File

@ -97,6 +97,9 @@
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="BitFaster.Caching">
<Version>2.2.1</Version>
</PackageReference>
<PackageReference Include="IsExternalInit"> <PackageReference Include="IsExternalInit">
<Version>1.0.3</Version> <Version>1.0.3</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@ -39,12 +39,24 @@ namespace FocusVolumeControl
public event Action WindowChanged; public event Action WindowChanged;
private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) CancellationTokenSource? _cancellationTokenSource = null;
private async void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{ {
try try
{ {
//debounce the window changed events by 100 ms because if you click mouse over an application on the start bar
//and then click on the preview window, it will quickly go from current -> fallback -> new app
//which can often result in it getting stuck on the fallback app
_cancellationTokenSource?.Cancel();
_cancellationTokenSource = new CancellationTokenSource();
await Task.Delay(100, _cancellationTokenSource.Token);
WindowChanged?.Invoke(); WindowChanged?.Invoke();
} }
catch (TaskCanceledException)
{
//ignored
}
catch (Exception ex) catch (Exception ex)
{ {
Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in EventHandler:\n {ex}"); Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in EventHandler:\n {ex}");