[banshee/gapless-ng: 822/836] [libbanshee] Use playbin2's stream-changed message.



commit b1519fded83eab0f0d2dba821dcecf802f54490b
Author: Christopher James Halse Rogers <raof ubuntu com>
Date:   Fri Feb 5 12:08:02 2010 +1100

    [libbanshee] Use playbin2's stream-changed message.
    
    Use playbin2's stream-changed message to trigger next-track-starting rather than approximating this
    with a glib timeout.  More accurate and less convoluted.  Yay!

 libbanshee/banshee-player-pipeline.c |   37 ++++++++++++++++-----------------
 libbanshee/banshee-player-private.h  |    8 -------
 libbanshee/banshee-player.c          |   20 +-----------------
 3 files changed, 19 insertions(+), 46 deletions(-)
---
diff --git a/libbanshee/banshee-player-pipeline.c b/libbanshee/banshee-player-pipeline.c
index ac4a3ae..e9b89c8 100644
--- a/libbanshee/banshee-player-pipeline.c
+++ b/libbanshee/banshee-player-pipeline.c
@@ -63,6 +63,18 @@ bp_pipeline_process_tag (const GstTagList *tag_list, const gchar *tag_name, Bans
 }
 
 static gboolean
+bp_next_track_starting (gpointer player)
+{
+    g_return_val_if_fail (IS_BANSHEE_PLAYER (player), FALSE);
+
+    bp_debug ("[gapless] Triggering track-change signal");
+    if (((BansheePlayer *)player)->next_track_starting_cb != NULL) {
+        ((BansheePlayer *)player)->next_track_starting_cb (player);
+    }
+    return FALSE;
+}
+
+static gboolean
 bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
 {
     BansheePlayer *player = (BansheePlayer *)userdata;
@@ -161,6 +173,11 @@ bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
         } 
         
         case GST_MESSAGE_ELEMENT: {
+            const GstStructure *messageStruct;
+            messageStruct = gst_message_get_structure (message);
+            if (GST_MESSAGE_SRC (message) == GST_OBJECT (player->playbin) && gst_structure_has_name (messageStruct, "playbin2-stream-changed")) {
+                bp_next_track_starting (player);
+            }
             _bp_missing_elements_process_message (player, message);
             break;
         }
@@ -171,28 +188,10 @@ bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
     return TRUE;
 }
 
-static gboolean 
-bp_next_track_starting (gpointer player)
-{
-    g_return_val_if_fail (IS_BANSHEE_PLAYER (player), FALSE);
-    
-    bp_debug ("[gapless] Triggering track-change signal");
-    if (((BansheePlayer *)player)->next_track_starting_cb != NULL) {
-        ((BansheePlayer *)player)->next_track_starting_cb (player);
-    }
-    ((BansheePlayer *)player)->next_track_starting_timer_id = 0;
-    return FALSE;
-}
-
 static void bp_about_to_finish_callback (GstElement *playbin, BansheePlayer *player)
 {
     g_return_if_fail (IS_BANSHEE_PLAYER (player));
-    // Playbin2 doesn't (yet) have any way to notify us when the current track has actually finished playing on the
-    // hardware.  Fake this for now by adding a timer with length equal to the hardware buffer.
-    player->next_track_starting_timer_id = g_timeout_add (((guint64)BP_BUFFER_LEN_MICROSECONDS) / 1000, 
-                                                          &bp_next_track_starting, 
-                                                          player);
-    
+
     if (player->about_to_finish_cb != NULL) {
         player->about_to_finish_cb (player);
     }
diff --git a/libbanshee/banshee-player-private.h b/libbanshee/banshee-player-private.h
index 7a42f99..6df0884 100644
--- a/libbanshee/banshee-player-private.h
+++ b/libbanshee/banshee-player-private.h
@@ -65,8 +65,6 @@
 #define bp_debug(x...) banshee_log_debug ("player", x)
 #endif
 
-#define BP_BUFFER_LEN_MICROSECONDS 1000000
-
 typedef struct BansheePlayer BansheePlayer;
 
 typedef void (* BansheePlayerEosCallback)          (BansheePlayer *player);
@@ -157,12 +155,6 @@ struct BansheePlayer {
     gdouble album_peak;
     gdouble track_gain;
     gdouble track_peak;
-    
-    // Work around playbin2 not giving any notification about when a
-    // track changes.  We know how long playbin's buffer is, so we know
-    // how long after about-to-finish is raised the track will end.
-    // Use this timer to fire a signal when that happens.
-    guint next_track_starting_timer_id;
 };
 
 #endif /* _BANSHEE_PLAYER_PRIVATE_H */
diff --git a/libbanshee/banshee-player.c b/libbanshee/banshee-player.c
index d51c53d..47c19f2 100644
--- a/libbanshee/banshee-player.c
+++ b/libbanshee/banshee-player.c
@@ -180,12 +180,7 @@ bp_stop (BansheePlayer *player, gboolean nullstate)
         state = GST_STATE_NULL;
     }
     
-    if (player->next_track_starting_timer_id != 0) {
-        g_source_remove (player->next_track_starting_timer_id);
-        player->next_track_starting_timer_id = 0;
-    }
-    
-    bp_debug ("bp_stop: setting state to %s", 
+    bp_debug ("bp_stop: setting state to %s",
         state == GST_STATE_NULL ? "GST_STATE_NULL" : "GST_STATE_PAUSED");
     
     bp_pipeline_set_state (player, state);
@@ -201,10 +196,6 @@ P_INVOKE void
 bp_play (BansheePlayer *player)
 {
     g_return_if_fail (IS_BANSHEE_PLAYER (player));
-    if (player->next_track_starting_timer_id != 0) {
-        g_source_remove (player->next_track_starting_timer_id);
-        player->next_track_starting_timer_id = 0;
-    }
     bp_pipeline_set_state (player, GST_STATE_PLAYING);
 }
 
@@ -213,15 +204,6 @@ 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->next_track_starting_timer_id != 0) {
-        // URI == NULL indicates that there is not a next track to play.
-        // This means that there will not be a next track *starting*, so
-        // we have to disable the timer so that we don't fire a spurious
-        // next-track-starting signal.
-        g_source_remove (player->next_track_starting_timer_id);
-        player->next_track_starting_timer_id = 0;
-        return TRUE;
-    }
     g_object_set (G_OBJECT (player->playbin), "uri", uri, NULL);
     return TRUE;
 }



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