[banshee/gapless-ng: 325/836] Fix player_engine.SetNextTrack(null). Use this to disable the next-track-starting callback, because



commit 50255bed7ec84d1c5ba4bca3703065998f7b5a67
Author: Christopher James Halse Rogers <raof ubuntu com>
Date:   Fri Oct 30 17:38:42 2009 +1100

    Fix player_engine.SetNextTrack(null).
    Use this to disable the next-track-starting callback, because there won't be a next track

 libbanshee/banshee-player.c                        |    5 +++++
 .../Banshee.GStreamer/PlayerEngine.cs              |    1 +
 .../Banshee.MediaEngine/PlayerEngine.cs            |    2 +-
 .../Banshee.MediaEngine/PlayerEngineService.cs     |    4 ++--
 .../PlaybackControllerService.cs                   |   15 +++++++--------
 5 files changed, 16 insertions(+), 11 deletions(-)
---
diff --git a/libbanshee/banshee-player.c b/libbanshee/banshee-player.c
index 019cdb3..32efc68 100644
--- a/libbanshee/banshee-player.c
+++ b/libbanshee/banshee-player.c
@@ -213,6 +213,11 @@ bp_set_next_track (BansheePlayer *player, const gchar *uri)
 {
     g_return_val_if_fail (IS_BANSHEE_PLAYER (player), FALSE);
     g_return_val_if_fail (player->playbin != NULL, FALSE);
+    if (uri == NULL && player->timeout_id != 0) {
+        g_source_remove (player->timeout_id);
+        player->timeout_id = 0;
+        return TRUE;
+    }
     g_object_set (G_OBJECT (player->playbin), "uri", uri, NULL);
     return TRUE;
 }
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
index d67ebab..476a81a 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
@@ -229,6 +229,7 @@ namespace Banshee.GStreamer
             // If there isn't a next track for us, release the block on the about-to-finish callback.
             if (uri == null) {
                 next_track_set.Set ();
+                bp_set_next_track (handle, IntPtr.Zero);
                 return;
             }            
             IntPtr uri_ptr = GLib.Marshaller.StringToPtrGStrdup (uri.AbsoluteUri);
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index 834fa08..435b594 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -103,7 +103,7 @@ namespace Banshee.MediaEngine
         public void SetNextTrack (TrackInfo track)
         {
             pending_track = track;
-            pending_uri = track.Uri;
+            pending_uri = track != null ? track.Uri : null;
 
             HandleNextTrack (pending_uri);
         }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index 15b4aa8..3ace877 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -310,7 +310,7 @@ namespace Banshee.MediaEngine
 
         public void SetNextTrack (TrackInfo track)
         {
-            if (active_engine != FindSupportingEngine (track.Uri)) {
+            if (track != null && active_engine != FindSupportingEngine (track.Uri)) {
                 if (active_engine.CurrentState == PlayerState.Playing) {
                     // If we're playing and the current engine can't handle the next track then treat this as setting
                     // no next track for the engine, since it's not going to receive this next track.
@@ -326,7 +326,7 @@ namespace Banshee.MediaEngine
 
         public void SetNextTrack (SafeUri uri)
         {
-            if (active_engine != FindSupportingEngine (uri)) {
+            if (uri != null && active_engine != FindSupportingEngine (uri)) {
                 if (active_engine.CurrentState == PlayerState.Playing) {
                     // If we're playing and the current engine can't handle the next track then treat this as setting
                     // no next track for the engine, since it's not going to receive this next track.
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
index 5a8ed81..4e454bc 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
@@ -192,7 +192,7 @@ namespace Banshee.PlaybackController
                     QueuePlayTrack ();
                 } else {
                     last_was_skipped = false;
-                    Next (RepeatMode == PlaybackRepeatMode.RepeatSingle, false);
+                    Next (RepeatMode == PlaybackRepeatMode.RepeatAll, false);
                 }
             } else {
                 OnStopped ();
@@ -285,12 +285,11 @@ namespace Banshee.PlaybackController
             }
 
             CurrentTrack = CalcNextTrack (Direction.Next, restart);
-            if (CurrentTrack != null) {
-                if (userRequested) {
-                    QueuePlayTrack ();
-                } else {
-                    player_engine.SetNextTrack (CurrentTrack);
-                }
+            if (!userRequested) {
+                // A RequestNextTrack event should always result in SetNextTrack being called.  null is acceptable.
+                player_engine.SetNextTrack (CurrentTrack);
+            } else if (CurrentTrack != null) {
+                QueuePlayTrack ();
             }
             return true;
         }
@@ -302,7 +301,7 @@ namespace Banshee.PlaybackController
             }
 
             CurrentTrack = CalcNextTrack (Direction.Previous, restart);
-            if (CurrentTrack == null) {
+            if (CurrentTrack != null) {
                 QueuePlayTrack ();
             }
             



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