diff --git a/BMM.Core/NewMediaPlayer/MediaQueue.cs b/BMM.Core/NewMediaPlayer/MediaQueue.cs index 5ba17d3fa..370db35ff 100644 --- a/BMM.Core/NewMediaPlayer/MediaQueue.cs +++ b/BMM.Core/NewMediaPlayer/MediaQueue.cs @@ -22,6 +22,7 @@ namespace BMM.Core.NewMediaPlayer /// public class MediaQueue : IMediaQueue { + private object _lock = new(); private readonly MediaFileUrlSetter _mediaFileUrlSetter; private readonly IToastDisplayer _toastDisplayer; private readonly IBMMLanguageBinder _bmmLanguageBinder; @@ -42,7 +43,10 @@ public MediaQueue( public void Replace(IMediaTrack track) { _mediaFileUrlSetter.SetLocalPathIfDownloaded(track); - Tracks = new List { track }; + lock (_lock) + { + Tracks = new List { track }; + } } public async Task Replace(IEnumerable tracks, IMediaTrack currentTrack) @@ -75,7 +79,11 @@ await Mvx.IoCProvider.Resolve().ExecuteOnMainThre } } - Tracks = filteredList; + lock (_lock) + { + Tracks = filteredList; + } + return true; } @@ -84,21 +92,30 @@ public async Task Append(IMediaTrack track) if (await FileNotDownloadedButInOfflineViewModel(track)) return false; - Tracks.Add(track); - return true; + lock (_lock) + { + Tracks.Add(track); + return true; + } } public async Task PlayNext(IMediaTrack track, IMediaTrack currentPlayedTrack) { var nextPlayedIndex = Tracks.IndexOf(currentPlayedTrack) + 1; - if (Tracks.Count < nextPlayedIndex) - return false; + lock (_lock) + { + if (Tracks.Count < nextPlayedIndex) + return false; + } if (await FileNotDownloadedButInOfflineViewModel(track)) return false; - Tracks.Insert(nextPlayedIndex, track); + lock (_lock) + { + Tracks.Insert(nextPlayedIndex, track); + } return true; } @@ -132,48 +149,62 @@ public bool IsSameQueue(IList newMediaTracks) if (newMediaTracks.Any(t => t.IsLivePlayback)) return false; - if (newMediaTracks.Count != Tracks.Count) - return false; - - var comparer = new MediaTrackComparer(); - var onlyInNew = newMediaTracks.Except(Tracks, comparer); - var onlyInQueue = Tracks.Except(newMediaTracks, comparer); - - bool tracksChanged = onlyInNew.Any() || onlyInQueue.Any(); + lock (_lock) + { + if (newMediaTracks.Count != Tracks.Count) + return false; + var comparer = new MediaTrackComparer(); + + if (newMediaTracks.Count != Tracks.Count) + return false; + var onlyInNew = newMediaTracks.Except(Tracks, comparer); + var onlyInQueue = Tracks.Except(newMediaTracks, comparer); + + bool tracksChanged = onlyInNew.Any() || onlyInQueue.Any(); - if (tracksChanged) - return false; + if (tracksChanged) + return false; - return CheckAllTracksOnTheSamePosition(newMediaTracks); + return CheckAllTracksOnTheSamePosition(newMediaTracks); + } } private bool CheckAllTracksOnTheSamePosition(IList newMediaTracks) { - bool allTracksOnTheSamePosition = true; - - for (int i = 0; i < Tracks.Count; i++) + lock (_lock) { - var queueTrack = Tracks[i]; - var newTrack = newMediaTracks[i]; + bool allTracksOnTheSamePosition = true; - if (queueTrack.Equals(newTrack)) - continue; + for (int i = 0; i < Tracks.Count; i++) + { + var queueTrack = Tracks[i]; + var newTrack = newMediaTracks[i]; - allTracksOnTheSamePosition = false; - break; - } + if (queueTrack.Equals(newTrack)) + continue; - return allTracksOnTheSamePosition; + allTracksOnTheSamePosition = false; + break; + } + + return allTracksOnTheSamePosition; + } } public IMediaTrack GetTrackById(int id) { - return Tracks.FirstOrDefault(t => t.Id == id); + lock (_lock) + { + return Tracks.FirstOrDefault(t => t.Id == id); + } } public void Clear() { - Tracks = new List(); + lock (_lock) + { + Tracks = new List(); + } } } diff --git a/BMM.UI.Android/Application/NewMediaPlayer/CustomShuffleOrder.cs b/BMM.UI.Android/Application/NewMediaPlayer/CustomShuffleOrder.cs index 6d9a96e9a..67027059c 100644 --- a/BMM.UI.Android/Application/NewMediaPlayer/CustomShuffleOrder.cs +++ b/BMM.UI.Android/Application/NewMediaPlayer/CustomShuffleOrder.cs @@ -126,10 +126,10 @@ public IShuffleOrder CloneAndClear() private static int[] CreateShuffledListStartingWith(int startIndex, int length, Random random) { var list = IndexList(1, length); - if (startIndex != 0) - { + + if (startIndex > 0 && startIndex <= list.Count) list[startIndex - 1] = 0; - } + ShuffleableQueue.ShuffleList(list, random); return list.Prepend(startIndex).ToArray(); } diff --git a/lib/FFImageLoading.Droid.dll b/lib/FFImageLoading.Droid.dll index bd2cec1f3..eb0f8599d 100644 Binary files a/lib/FFImageLoading.Droid.dll and b/lib/FFImageLoading.Droid.dll differ diff --git a/lib/FFImageLoading.Shared.dll b/lib/FFImageLoading.Shared.dll index deb9d580f..eb0ecd0c6 100644 Binary files a/lib/FFImageLoading.Shared.dll and b/lib/FFImageLoading.Shared.dll differ diff --git a/lib/FFImageLoading.dll b/lib/FFImageLoading.dll index d2802918c..d86dbcdba 100644 Binary files a/lib/FFImageLoading.dll and b/lib/FFImageLoading.dll differ