rhythmbox r5813 - in trunk: . backends/gstreamer



Author: jmatthew
Date: Fri Jul 18 23:50:01 2008
New Revision: 5813
URL: http://svn.gnome.org/viewvc/rhythmbox?rev=5813&view=rev

Log:
2008-07-19  Jonathan Matthew  <jonathan d14n org>

	* backends/gstreamer/rb-player-gst-xfade.c:
	(stream_queue_probe_cb), (stream_queue_threshold_cb),
	(stream_queue_underrun_cb), (get_times_and_stream):
	If we're pretending a stream is playing in order to display buffering
	status, then we should also use its position (0) and duration for tick
	events etc.  Fixes last.fm submission of songs played from last.fm
	streams, oddly enough.


Modified:
   trunk/ChangeLog
   trunk/backends/gstreamer/rb-player-gst-xfade.c

Modified: trunk/backends/gstreamer/rb-player-gst-xfade.c
==============================================================================
--- trunk/backends/gstreamer/rb-player-gst-xfade.c	(original)
+++ trunk/backends/gstreamer/rb-player-gst-xfade.c	Fri Jul 18 23:50:01 2008
@@ -1777,8 +1777,8 @@
 	} else {
 		progress = 99;
 	}
-	rb_debug ("current network buffer level: %u; threshold %u - %u%%",
-		  level, stream->queue_threshold, progress);
+	rb_debug ("%s: buffer level: %u; threshold %u - %u%%",
+		  stream->uri, level, stream->queue_threshold, progress);
 
 	post_buffering_message (stream, progress);
 
@@ -1790,7 +1790,7 @@
 {
 	GstPad *sinkpad;
 
-	rb_debug ("queue running - removing pad probe, running signal handler");
+	rb_debug ("%s: queue running", stream->uri);
 
 	/* detach pad probe */
 	sinkpad = gst_element_get_pad (stream->queue, "sink");
@@ -1811,7 +1811,7 @@
 static void
 stream_queue_underrun_cb (GstElement *queue, RBXFadeStream *stream)
 {
-	rb_debug ("queue underrun - attaching pad probe, running signal handler");
+	rb_debug ("%s: queue underrun", stream->uri);
 	GstPad *sinkpad;
 
 	g_object_set (stream->queue, "min-threshold-bytes", stream->queue_threshold, NULL);
@@ -2454,13 +2454,30 @@
 get_times_and_stream (RBPlayerGstXFade *player, RBXFadeStream **pstream, gint64 *pos, gint64 *duration)
 {
 	gboolean got_time = FALSE;
+	gboolean buffering = FALSE;
 	RBXFadeStream *stream;
 
 	if (player->priv->pipeline == NULL)
 		return FALSE;
 
 	g_static_rec_mutex_lock (&player->priv->stream_list_lock);
-	stream = find_stream_by_state (player, FADING_IN | PLAYING | FADING_OUT_PAUSED | PAUSED | PENDING_REMOVE);
+	
+	/* first look for a network stream that is buffering during preroll */
+	stream = find_stream_by_state (player, PREROLLING | PREROLL_PLAY);
+	if (stream != NULL) {
+		if (stream->emitted_fake_playing == FALSE) {
+			g_object_unref (stream);
+			stream = NULL;
+		} else {
+			rb_debug ("found buffering stream %s as current", stream->uri);
+			buffering = TRUE;
+		}
+	}
+
+	/* otherwise, the stream that is playing */
+	if (stream == NULL) {
+		stream = find_stream_by_state (player, FADING_IN | PLAYING | FADING_OUT_PAUSED | PAUSED | PENDING_REMOVE);
+	}
 	g_static_rec_mutex_unlock (&player->priv->stream_list_lock);
 
 	if (stream != NULL) {
@@ -2469,7 +2486,9 @@
 		}
 
 		if (pos != NULL) {
-			if (stream->state == PAUSED) {
+			if (buffering) {
+				*pos = 0;
+			} else if (stream->state == PAUSED) {
 				GstFormat format = GST_FORMAT_TIME;
 				*pos = -1;
 



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