[banshee] Next skips entire album/artist when random-by



commit 9013c59b15cbd5c3f0a3981984243f00179fc8e6
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Fri Jun 12 18:54:37 2009 -0500

    Next skips entire album/artist when random-by
    
    Also, play albums in chronological order when random-by-artist.

 .../DatabaseTrackListModel.cs                      |   19 +++++++++++++------
 .../Banshee.Collection/MemoryTrackListModel.cs     |    2 +-
 .../Banshee.Collection/TrackListModel.cs           |    2 +-
 .../PlaybackControllerService.cs                   |    7 ++++++-
 4 files changed, 21 insertions(+), 9 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
index 8ab3aae..adb03d6 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
@@ -342,14 +342,14 @@ namespace Banshee.Collection.Database
         private const string random_condition = "AND LastStreamError = 0 AND (LastPlayedStamp < ? OR LastPlayedStamp IS NULL) AND (LastSkippedStamp < ? OR LastSkippedStamp IS NULL)";
         private static string random_fragment = String.Format ("{0} ORDER BY RANDOM()", random_condition);
         private static string random_by_album_fragment = String.Format ("AND CoreTracks.AlbumID = ? {0} ORDER BY Disc ASC, TrackNumber ASC", random_condition);
-        private static string random_by_artist_fragment = String.Format ("AND CoreAlbums.ArtistID = ? {0} ORDER BY CoreAlbums.TitleSortKey ASC, Disc ASC, TrackNumber ASC", random_condition);
+        private static string random_by_artist_fragment = String.Format ("AND CoreAlbums.ArtistID = ? {0} ORDER BY CoreTracks.Year, CoreTracks.AlbumID ASC, Disc ASC, TrackNumber ASC", random_condition);
 
         private DateTime random_began_at = DateTime.MinValue;
         private DateTime last_random = DateTime.MinValue;
         private int? random_album_id;
         private int? random_artist_id;
 
-        public override TrackInfo GetRandom (DateTime notPlayedSince, PlaybackShuffleMode mode, bool repeat)
+        public override TrackInfo GetRandom (DateTime notPlayedSince, PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
         {
             lock (this) {
                 if (Count == 0) {
@@ -360,11 +360,11 @@ namespace Banshee.Collection.Database
                     random_began_at = last_random = notPlayedSince;
                 }
 
-                TrackInfo track = GetRandomTrack (mode, repeat);
+                TrackInfo track = GetRandomTrack (mode, repeat, lastWasSkipped);
                 if (track == null && (repeat || mode != PlaybackShuffleMode.Linear)) {
-                    random_began_at = last_random;
+                    random_began_at = (random_began_at == last_random) ? DateTime.Now : last_random;
                     random_album_id = random_artist_id = null;
-                    track = GetRandomTrack (mode, repeat);
+                    track = GetRandomTrack (mode, repeat, lastWasSkipped);
                 }
 
                 last_random = DateTime.Now;
@@ -372,8 +372,13 @@ namespace Banshee.Collection.Database
             }
         }
 
-        private TrackInfo GetRandomTrack (PlaybackShuffleMode mode, bool repeat)
+        private TrackInfo GetRandomTrack (PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
         {
+            // Skip the entire album or artist
+            if (lastWasSkipped) {
+                random_album_id = random_artist_id = null;
+            }
+
             if (mode == PlaybackShuffleMode.Album) {
                 random_artist_id = null;
                 if (random_album_id == null) {
@@ -387,6 +392,7 @@ namespace Banshee.Collection.Database
                 if (random_album_id != null) {
                     return cache.GetSingle (random_by_album_fragment, (int)random_album_id, random_began_at, random_began_at);
                 }
+                return null;
             } else if (mode == PlaybackShuffleMode.Artist) {
                 random_album_id = null;
                 if (random_artist_id == null) {
@@ -400,6 +406,7 @@ namespace Banshee.Collection.Database
                 if (random_artist_id != null) {
                     return cache.GetSingle (random_by_artist_fragment, (int)random_artist_id, random_began_at, random_began_at);
                 }
+                return null;
             } else {
                 random_album_id = random_artist_id = null;
             }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
index 8f12c32..dbe12c6 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
@@ -81,7 +81,7 @@ namespace Banshee.Collection
             get { lock (this) { return (index >= 0 && index < tracks.Count) ? tracks[index] : null; } }
         }
 
-        public override TrackInfo GetRandom (DateTime since, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat)
+        public override TrackInfo GetRandom (DateTime since, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
         {
             if (Count == 0)
                 return null;
diff --git a/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
index 3b0e700..e3c6f02 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
@@ -51,6 +51,6 @@ namespace Banshee.Collection
         
         public abstract int IndexOf (TrackInfo track);
 
-        public abstract TrackInfo GetRandom (DateTime notPlayedSince, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat);
+        public abstract TrackInfo GetRandom (DateTime notPlayedSince, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped);
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
index da5fa71..5c52f55 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
@@ -56,6 +56,7 @@ namespace Banshee.PlaybackController
         private TrackInfo changing_to_track;
         private bool raise_started_after_transition = false;
         private bool transition_track_started = false;
+        private bool last_was_skipped = true;
         private int consecutive_errors;
         private uint error_transition_id;
         private DateTime source_auto_set_at = DateTime.MinValue;
@@ -180,6 +181,7 @@ namespace Banshee.PlaybackController
                 if (RepeatMode == PlaybackRepeatMode.RepeatSingle) {
                     QueuePlayTrack ();
                 } else {
+                    last_was_skipped = false;
                     Next ();
                 }
             } else {
@@ -342,7 +344,10 @@ namespace Banshee.PlaybackController
         
         private TrackInfo QueryTrackRandom (PlaybackShuffleMode mode, bool restart)
         {
-            return Source.TrackModel.GetRandom (source_set_at, mode, restart);
+            var track = Source.TrackModel.GetRandom (source_set_at, mode, restart, last_was_skipped);
+            // Reset to default of true, only ever set to false by EosTransition
+            last_was_skipped = true;
+            return track;
         }
         
         private void QueuePlayTrack ()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]