Compare commits
2 Commits
d1df235af0
...
6de76da8ad
Author | SHA1 | Date | |
---|---|---|---|
6de76da8ad | |||
48161b5c2e |
@ -5,44 +5,57 @@ 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))
|
return GetIconFromIconPath();
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch
|
else
|
||||||
{
|
{
|
||||||
_icon = "Images/encoderIcon";
|
return GetIconFromExecutablePath();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _icon;
|
catch
|
||||||
|
{
|
||||||
|
return "Images/encoderIcon";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Any()
|
public bool Any()
|
||||||
|
@ -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>
|
||||||
|
@ -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}");
|
||||||
|
Loading…
Reference in New Issue
Block a user