[banshee/gapless-ng: 7/836] [Banshee.PlayerEngine, PlayerEngineService] Implement SetNextTrack
- From: Christopher James Halse Rogers <chrishr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee/gapless-ng: 7/836] [Banshee.PlayerEngine, PlayerEngineService] Implement SetNextTrack
- Date: Thu, 25 Feb 2010 22:42:02 +0000 (UTC)
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]