[banshee/gapless-ng: 822/836] [libbanshee] Use playbin2's stream-changed message.
- From: Christopher James Halse Rogers <chrishr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee/gapless-ng: 822/836] [libbanshee] Use playbin2's stream-changed message.
- Date: Thu, 25 Feb 2010 22:44:58 +0000 (UTC)
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]