[banshee/gapless-ng: 7/836] [Banshee.PlayerEngine, PlayerEngineService] Implement SetNextTrack



commit 05fc07c60abcd0fe7739f23fc87d22736bba086c
Author: Christopher James Halse Rogers <raof ubuntu com>
Date:   Fri Jul 17 15:37:17 2009 +1000

    [Banshee.PlayerEngine,PlayerEngineService] Implement SetNextTrack

 .../Banshee.MediaEngine/PlayerEngine.cs            |   50 ++++++++++++++++++++
 .../Banshee.MediaEngine/PlayerEngineService.cs     |   35 +++++++++++++-
 2 files changed, 84 insertions(+), 1 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index 1f7a1ec..834fa08 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -47,6 +47,8 @@ namespace Banshee.MediaEngine
         
         private TrackInfo current_track;
         private SafeUri current_uri;
+        private TrackInfo pending_track;
+        private SafeUri pending_uri;
         private PlayerState current_state = PlayerState.NotReady;
         private PlayerState last_state = PlayerState.NotReady;
         
@@ -98,6 +100,40 @@ namespace Banshee.MediaEngine
             HandleOpen (uri);
         }
 
+        public void SetNextTrack (TrackInfo track)
+        {
+            pending_track = track;
+            pending_uri = track.Uri;
+
+            HandleNextTrack (pending_uri);
+        }
+
+        public void SetNextTrack (SafeUri uri)
+        {
+            pending_uri = uri;
+            pending_track = new UnknownTrackInfo (uri);
+
+            HandleNextTrack (uri);
+        }
+
+        private void HandleNextTrack (SafeUri uri)
+        {
+            if (current_state != PlayerState.Playing) {
+                // Pre-buffering the next track only makes sense when we're currently playing
+                // Instead, just open.
+                HandleOpen (uri);
+                Play ();
+                return;
+            }
+
+            try {
+                // Setting the next track doesn't change the player state.
+                SetNextTrackUri (uri);
+            } catch (Exception e) {
+                Log.Exception ("Failed to pre-buffer next track", e);
+            }
+        }
+
         private void HandleOpen (SafeUri uri)
         {
             if (current_state != PlayerState.Idle && current_state != PlayerState.NotReady && current_state != PlayerState.Contacting) {
@@ -117,6 +153,13 @@ namespace Banshee.MediaEngine
 
         public abstract void Pause ();
 
+        public virtual void SetNextTrackUri (SafeUri uri)
+        {
+            // Opening files on SetNextTrack is a sane default behaviour.
+            // This only wants to be overridden if the PlayerEngine sends out RequestNextTrack signals before EoS
+            OpenUri (uri);
+        }
+
         public virtual void VideoExpose (IntPtr displayContext, bool direct)
         {
             throw new NotImplementedException ("Engine must implement VideoExpose since this method only gets called when SupportsVideo is true");
@@ -163,6 +206,13 @@ namespace Banshee.MediaEngine
         
         protected virtual void OnEventChanged (PlayerEventArgs args)
         {
+            if (args.Event == PlayerEvent.StartOfStream && pending_track != null) {
+                Log.DebugFormat ("OnEventChanged called with StartOfStream.  Replacing current_track: \"{0}\" with pending_track: \"{1}\"", current_track.DisplayTrackTitle, pending_track.DisplayTrackTitle);
+                current_track = pending_track;
+                current_uri = pending_uri;
+                pending_track = null;
+                pending_uri = null;
+            }
             if (ThreadAssist.InMainThread) {
                 RaiseEventChanged (args);
             } else {
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index fb56e7e..f5d7062 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -302,7 +302,40 @@ namespace Banshee.MediaEngine
         {
             OpenCheck (new SafeUri (uri));
         }
-        
+
+
+        public void SetNextTrack (TrackInfo track)
+        {
+            if (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.
+                    track = null;
+                } else {
+                    // If we're not playing, then switch engines and Open
+                    SwitchToEngine (FindSupportingEngine (track.Uri));
+                    CheckPending ();
+                }
+            }
+            active_engine.SetNextTrack (track);
+        }
+
+        public void SetNextTrack (SafeUri uri)
+        {
+            if (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.
+                    uri = null;
+                } else {
+                    // If we're not playing, then switch engines and Open
+                    SwitchToEngine (FindSupportingEngine (uri));
+                    CheckPending ();
+                }
+            }
+            active_engine.SetNextTrack (uri);
+        }
+
         public void OpenPlay (TrackInfo track)
         {
             OpenPlay (track, true);



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