[banshee] Next skips entire album/artist when random-by
- From: Gabriel Burt <gburt src gnome org>
- To: svn-commits-list gnome org
- Subject: [banshee] Next skips entire album/artist when random-by
- Date: Fri, 12 Jun 2009 20:28:42 -0400 (EDT)
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]