diff --git a/CHANGELOG.md b/CHANGELOG.md index 89abf11..4b9429c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v1.3.1 + +*Released: 03/11/2022* + +* Update .NET version from 5.0 to 6.0 +* Fix: simple patch to avoid a crash concerning GetAlbumCover +* Fix: connection change now working + ## v1.3 *Released: 18/04/2022* diff --git a/Handlers/MPDHandler.cs b/Handlers/MPDHandler.cs index a4b649d..0078fd6 100644 --- a/Handlers/MPDHandler.cs +++ b/Handlers/MPDHandler.cs @@ -66,17 +66,19 @@ namespace unison private MpcConnection _connection; private MpcConnection _commandConnection; private IPEndPoint _mpdEndpoint; - private CancellationTokenSource _cancelToken; + + private CancellationTokenSource _cancelCommand; + private CancellationTokenSource _cancelConnect; public MPDHandler() { - Initialize(null, null); + Startup(null, null); _stats = new Statistics(); _retryTimer = new DispatcherTimer(); _retryTimer.Interval = TimeSpan.FromSeconds(5); - _retryTimer.Tick += Initialize; + _retryTimer.Tick += Startup; _elapsedTimer = new System.Timers.Timer(500); _elapsedTimer.Elapsed += new System.Timers.ElapsedEventHandler(ElapsedTimer); @@ -149,7 +151,7 @@ namespace unison public async Task SafelySendCommandAsync(IMpcCommand command) { - if (_commandConnection == null) + if (_commandConnection == null || !IsConnected()) { Trace.WriteLine("[SafelySendCommandAsync] no command connection"); return default(T); @@ -177,21 +179,52 @@ namespace unison return default(T); } - private void Initialize(object sender, EventArgs e) + public async void Startup(object sender, EventArgs e) { - if (!_connected) - Connect(); + await Initialize(); } - public async void Connect() + public async Task Initialize() { - _cancelToken = new CancellationTokenSource(); - CancellationToken token = _cancelToken.Token; + Trace.WriteLine("Initializing"); + + Disconnected(); + + if (!_connected) + await Connect(); + } + + public void Disconnected() + { + _connected = false; + ConnectionChanged?.Invoke(this, EventArgs.Empty); + + _commandConnection?.DisconnectAsync(); + _connection?.DisconnectAsync(); + + _cancelConnect?.Cancel(); + _cancelConnect = new CancellationTokenSource(); + + _cancelCommand?.Cancel(); + _cancelCommand = new CancellationTokenSource(); + + _connection = null; + _commandConnection = null; + + Trace.WriteLine("Disconnected"); + } + + public async Task Connect() + { + Trace.WriteLine("Connecting"); + + if (_cancelCommand.IsCancellationRequested || _cancelConnect.IsCancellationRequested) + return; try { - _connection = await ConnectInternal(token); - _commandConnection = await ConnectInternal(token); + _connection = await ConnectInternal(_cancelConnect.Token); + _commandConnection = await ConnectInternal(_cancelCommand.Token); } catch (MpcNET.Exceptions.MpcConnectException e) { @@ -219,11 +252,14 @@ namespace unison await UpdateStatusAsync(); await UpdateSongAsync(); - Loop(token); + Loop(_cancelCommand.Token); } private async Task ConnectInternal(CancellationToken token) { + if (token.IsCancellationRequested) + return null; + IPAddress.TryParse(Properties.Settings.Default.mpd_host, out _ipAddress); if (_ipAddress == null) @@ -263,18 +299,6 @@ namespace unison return connection; } - public void Disconnected() - { - _connected = false; - ConnectionChanged?.Invoke(this, EventArgs.Empty); - - if (_connection != null) - _connection = null; - - if (_commandConnection != null) - _commandConnection = null; - } - private void Loop(CancellationToken token) { Task.Run(async () => @@ -283,8 +307,7 @@ namespace unison { try { - token.ThrowIfCancellationRequested(); - if (token.IsCancellationRequested || _connection == null) + if (token.IsCancellationRequested || _connection == null || !IsConnected()) break; IMpdMessage idleChanges = await _connection.SendAsync(new IdleCommand("stored_playlist playlist player mixer output options update")); @@ -293,14 +316,17 @@ namespace unison await HandleIdleResponseAsync(idleChanges.Response.Content); else { - Trace.WriteLine($"Error in Idle connection thread: {idleChanges.Response?.Content}"); + Trace.WriteLine($"Error in Idle connection thread (1): {idleChanges.Response?.Content}"); throw new Exception(idleChanges.Response?.Content); } } catch (Exception e) { - Trace.WriteLine($"Error in Idle connection thread: {e.Message}"); - Disconnected(); + if (token.IsCancellationRequested) + Trace.WriteLine($"Idle connection cancelled."); + else + Trace.WriteLine($"Error in Idle connection thread: {e.Message}"); + await Initialize(); break; } } @@ -323,6 +349,7 @@ namespace unison catch (Exception e) { Trace.WriteLine($"Error in Idle connection thread: {e.Message}"); + await Initialize(); } } @@ -347,6 +374,7 @@ namespace unison catch (Exception e) { Trace.WriteLine($"Error in Idle connection thread: {e.Message}"); + await Initialize(); } _isUpdatingStatus = false; @@ -354,6 +382,8 @@ namespace unison private async Task UpdateSongAsync() { + Trace.WriteLine("Updating song"); + if (_connection == null || _isUpdatingSong) return; @@ -373,13 +403,17 @@ namespace unison catch (Exception e) { Trace.WriteLine($"Error in Idle connection thread: {e.Message}"); + await Initialize(); } _isUpdatingSong = false; } - private async void GetAlbumCover(string path, CancellationToken token = default) + private async void GetAlbumCover(string path, CancellationToken token) { + if (token.IsCancellationRequested) + return; + List data = new List(); try { @@ -392,7 +426,7 @@ namespace unison if (_connection == null) return; - IMpdMessage albumReq = await _connection.SendAsync(new ReadPictureCommand(path, currentSize)); + IMpdMessage albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize)); if (!albumReq.IsResponseValid) break; @@ -414,7 +448,7 @@ namespace unison if (_connection == null) return; - IMpdMessage albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize)); + IMpdMessage albumReq = await _connection.SendAsync(new ReadPictureCommand(path, currentSize)); if (!albumReq.IsResponseValid) break; @@ -430,6 +464,9 @@ namespace unison } catch (Exception e) { + if (token.IsCancellationRequested) + return; + Trace.WriteLine("Exception caught while getting albumart: " + e); return; } @@ -443,7 +480,7 @@ namespace unison { _cover = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); } - catch (System.NotSupportedException) + catch { _cover = null; } @@ -478,7 +515,7 @@ namespace unison SongChanged?.Invoke(this, EventArgs.Empty); string uri = Regex.Escape(_currentSong.Path); - GetAlbumCover(uri); + GetAlbumCover(uri, _cancelCommand.Token); } public void UpdateCover() diff --git a/Properties/PublishProfiles/FolderProfile.pubxml b/Properties/PublishProfiles/FolderProfile.pubxml index 430d9d7..0784803 100644 --- a/Properties/PublishProfiles/FolderProfile.pubxml +++ b/Properties/PublishProfiles/FolderProfile.pubxml @@ -4,14 +4,14 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - Release + Release-Stable Any CPU publish\ FileSystem - net5.0-windows + net6.0-windows false win-x64 - True - False + true + false \ No newline at end of file diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 530a43c..b384b3d 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -111,14 +111,11 @@ namespace unison SaveSettings(); - MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"]; - if (mpd.IsConnected()) - mpd = new MPDHandler(); - ConnectButton.IsEnabled = false; ConnectionStatus.Text = unison.Resources.Resources.Settings_ConnectionStatusConnecting; - System.Threading.Tasks.Task.Run(() => { mpd.Connect(); }); + MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"]; + System.Threading.Tasks.Task.Run(async () => { await mpd.Initialize(); }); } private void SnapcastReset_Clicked(object sender, RoutedEventArgs e) diff --git a/unison.csproj b/unison.csproj index bad23d8..d4ea26b 100644 --- a/unison.csproj +++ b/unison.csproj @@ -2,12 +2,12 @@ WinExe - net5.0-windows + net6.0-windows true Resources\icon-full.ico unison.App - 1.3 + 1.3.1 Théo Marchal LICENSE