Compare commits
2 Commits
d1df235af0
...
6de76da8ad
Author | SHA1 | Date | |
---|---|---|---|
6de76da8ad | |||
48161b5c2e |
@ -5,44 +5,57 @@ using BarRaider.SdTools;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
using FocusVolumeControl.UI;
|
||||
using BitFaster.Caching.Lru;
|
||||
|
||||
namespace FocusVolumeControl.AudioSessions;
|
||||
|
||||
public sealed class ActiveAudioSessionWrapper : IAudioSession
|
||||
{
|
||||
static ConcurrentLru<string, string> _iconCache = new ConcurrentLru<string, string>(10);
|
||||
|
||||
public string DisplayName { get; set; }
|
||||
public string ExecutablePath { get; set; }
|
||||
public string IconPath { get; set; }
|
||||
private List<IAudioSessionControl2> Sessions { get; } = new List<IAudioSessionControl2>();
|
||||
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()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_icon))
|
||||
try
|
||||
{
|
||||
try
|
||||
if (!string.IsNullOrEmpty(IconPath))
|
||||
{
|
||||
if(!string.IsNullOrEmpty(IconPath))
|
||||
{
|
||||
var tmp = (Bitmap)Bitmap.FromFile(IconPath);
|
||||
tmp.MakeTransparent();
|
||||
_icon = Tools.ImageToBase64(tmp, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var tmp = IconExtraction.GetIcon(ExecutablePath);
|
||||
//var tmp = Icon.ExtractAssociatedIcon(ExecutablePath);
|
||||
_icon = Tools.ImageToBase64(tmp, true);
|
||||
}
|
||||
return GetIconFromIconPath();
|
||||
}
|
||||
catch
|
||||
else
|
||||
{
|
||||
_icon = "Images/encoderIcon";
|
||||
return GetIconFromExecutablePath();
|
||||
}
|
||||
}
|
||||
return _icon;
|
||||
catch
|
||||
{
|
||||
return "Images/encoderIcon";
|
||||
}
|
||||
}
|
||||
|
||||
public bool Any()
|
||||
|
@ -97,6 +97,9 @@
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BitFaster.Caching">
|
||||
<Version>2.2.1</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="IsExternalInit">
|
||||
<Version>1.0.3</Version>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
|
@ -39,12 +39,24 @@ namespace FocusVolumeControl
|
||||
|
||||
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
|
||||
{
|
||||
//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();
|
||||
}
|
||||
catch (TaskCanceledException)
|
||||
{
|
||||
//ignored
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Instance.LogMessage(TracingLevel.ERROR, $"Unexpected Error in EventHandler:\n {ex}");
|
||||
|
Loading…
Reference in New Issue
Block a user