using System.Diagnostics; using Windows.Media.Control; namespace Hyperbar.Windows.MediaController; public class MediaControllerManager(IMediator mediator, IFactory factory, IDispatcher dispatcher, IDisposer disposer) : IInitializer { private readonly AsyncLock asyncLock = new(); private readonly List> cache = []; private GlobalSystemMediaTransportControlsSessionManager? mediaTransportControlsSessionManager; public async Task InitializeAsync() { mediaTransportControlsSessionManager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); mediaTransportControlsSessionManager.SessionsChanged += OnSessionsChanged; IReadOnlyList sessions = mediaTransportControlsSessionManager.GetSessions(); foreach (GlobalSystemMediaTransportControlsSession session in sessions) { await InitializeSessionAsync(session); } } private async Task InitializeSessionAsync(GlobalSystemMediaTransportControlsSession session) { if (factory.Create(session) is MediaController mediaController) { await mediator.PublishAsync(new Created(mediaController)); Debug.WriteLine("Added " + session.SourceAppUserModelId + " " + session); cache.Add(new KeyValuePair(session, mediaController)); } } private async void OnSessionsChanged(GlobalSystemMediaTransportControlsSessionManager sender, SessionsChangedEventArgs args) { IReadOnlyList sessions = sender.GetSessions(); using (await asyncLock) { foreach (KeyValuePair session in cache.ToList()) { if (!sessions.Any(x => x.SourceAppUserModelId == session.Key.SourceAppUserModelId)) { await dispatcher.InvokeAsync(() => disposer.Dispose(session.Value)); cache.Remove(session); } } } using (await asyncLock) { foreach (GlobalSystemMediaTransportControlsSession session in sessions) { if (!cache.Any(x => x.Key.SourceAppUserModelId == session.SourceAppUserModelId)) { await InitializeSessionAsync(session); } } } } }