Use LRU cache for icons to improve performance when changing back and forth between frequently used apps, and reduce possibility of an icon randomly not loading

This commit is contained in:
dlprows 2023-10-04 09:29:52 -06:00
parent 48161b5c2e
commit 6de76da8ad
2 changed files with 34 additions and 18 deletions

View File

@ -5,45 +5,58 @@ 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;
public string GetIcon()
string GetIconFromIconPath()
{
if (string.IsNullOrEmpty(_icon))
{
try
{
if(!string.IsNullOrEmpty(IconPath))
return _iconCache.GetOrAdd(IconPath, (key) =>
{
var tmp = (Bitmap)Bitmap.FromFile(IconPath);
tmp.MakeTransparent();
_icon = Tools.ImageToBase64(tmp, true);
return Tools.ImageToBase64(tmp, true);
});
}
else
string GetIconFromExecutablePath()
{
return _iconCache.GetOrAdd(ExecutablePath, (key) =>
{
var tmp = IconExtraction.GetIcon(ExecutablePath);
//var tmp = Icon.ExtractAssociatedIcon(ExecutablePath);
_icon = Tools.ImageToBase64(tmp, true);
return Tools.ImageToBase64(tmp, true);
});
}
public string GetIcon()
{
try
{
if (!string.IsNullOrEmpty(IconPath))
{
return GetIconFromIconPath();
}
else
{
return GetIconFromExecutablePath();
}
}
catch
{
_icon = "Images/encoderIcon";
return "Images/encoderIcon";
}
}
return _icon;
}
public bool Any()
{

View File

@ -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>