[rhythmbox] RBHeader: update using playing-song-changed signal



commit 36af8332c75ba127e54bdbe9715d6e9b926f8183
Author: Jonathan Matthew <jonathan d14n org>
Date:   Tue Jul 21 21:48:16 2009 +1000

    RBHeader: update using playing-song-changed signal
    
    The header widget is now updated when the new song is actually playing,
    rather than when we ask the player to open it.  The difference is most
    visible when doing gapless transitions between tracks on the same album.

 shell/rb-shell-player.c |   12 +--------
 widgets/rb-header.c     |   59 ++++++++++++----------------------------------
 widgets/rb-header.h     |    4 ---
 3 files changed, 18 insertions(+), 57 deletions(-)
---
diff --git a/shell/rb-shell-player.c b/shell/rb-shell-player.c
index 009adb0..61c89a3 100644
--- a/shell/rb-shell-player.c
+++ b/shell/rb-shell-player.c
@@ -2928,6 +2928,8 @@ rb_shell_player_sync_with_source (RBShellPlayer *player)
 			/* override artist from entry */
 			artist = streaming_artist;
 		}
+
+		rhythmdb_entry_unref (entry);
 	}
 
 	if ((artist && artist[0] != '\0') || entry_title || stream_name) {
@@ -2958,16 +2960,6 @@ rb_shell_player_sync_with_source (RBShellPlayer *player)
 	g_signal_emit (G_OBJECT (player), rb_shell_player_signals[ELAPSED_CHANGED], 0,
 		       player->priv->elapsed);
 
-	/* Sync the header */
-	rb_header_set_playing_entry (player->priv->header_widget,
-				     entry,
-				     TRUE /*rb_player_seekable (player->priv->mmplayer)*/);
-	rb_header_sync (player->priv->header_widget);
-
-	if (entry != NULL) {
-		rhythmdb_entry_unref (entry);
-	}
-
 	g_free (streaming_artist);
 	g_free (streaming_title);
 }
diff --git a/widgets/rb-header.c b/widgets/rb-header.c
index 552c507..55c764d 100644
--- a/widgets/rb-header.c
+++ b/widgets/rb-header.c
@@ -116,7 +116,6 @@ enum
 	PROP_0,
 	PROP_DB,
 	PROP_SHELL_PLAYER,
-	PROP_ENTRY,
 	PROP_SEEKABLE,
 	PROP_SLIDER_DRAGGING
 };
@@ -155,18 +154,6 @@ rb_header_class_init (RBHeaderClass *klass)
 							      G_PARAM_READWRITE));
 
 	/**
-	 * RBHeader:entry:
-	 *
-	 * The #RhythmDBEntry to display
-	 */
-	g_object_class_install_property (object_class,
-					 PROP_ENTRY,
-					 g_param_spec_boxed ("entry",
-							     "RhythmDBEntry",
-							     "RhythmDBEntry pointer",
-							     RHYTHMDB_TYPE_ENTRY,
-							     G_PARAM_READWRITE));
-	/**
 	 * RBHeader:shell-player:
 	 *
 	 * The #RBShellPlayer instance
@@ -283,6 +270,11 @@ rb_header_init (RBHeader *header)
 	gtk_scale_set_draw_value (GTK_SCALE (header->priv->scale), FALSE);
 	gtk_widget_set_size_request (header->priv->scale, 150, -1);
 	gtk_box_pack_start (GTK_BOX (header->priv->scaleline), header->priv->scale, TRUE, TRUE, 0);
+
+	/* currently, nothing sets this.  it should be set on track changes. */
+	header->priv->seekable = TRUE;
+
+	rb_header_sync (header);
 }
 
 static void
@@ -300,7 +292,7 @@ rb_header_finalize (GObject *object)
 }
 
 static void
-rb_header_set_playing_entry_internal (RBHeader *header, RhythmDBEntry *entry)
+rb_header_playing_song_changed_cb (RBShellPlayer *player, RhythmDBEntry *entry, RBHeader *header)
 {
 	if (header->priv->entry == entry)
 		return;
@@ -315,6 +307,8 @@ rb_header_set_playing_entry_internal (RBHeader *header, RhythmDBEntry *entry)
 
 	header->priv->adjustment->upper = header->priv->duration;
 	gtk_adjustment_changed (header->priv->adjustment);
+
+	rb_header_sync (header);
 }
 
 static void
@@ -329,15 +323,16 @@ rb_header_set_property (GObject *object,
 	case PROP_DB:
 		header->priv->db = g_value_get_object (value);
 		break;
-	case PROP_ENTRY:
-		rb_header_set_playing_entry_internal (header, g_value_get_boxed (value));
-		break;
 	case PROP_SHELL_PLAYER:
 		header->priv->shell_player = g_value_get_object (value);
-		g_signal_connect (G_OBJECT (header->priv->shell_player),
-				  "elapsed-nano-changed",
-				  (GCallback) rb_header_elapsed_changed_cb,
-				  header);
+		g_signal_connect_object (header->priv->shell_player,
+					 "elapsed-nano-changed",
+					 G_CALLBACK (rb_header_elapsed_changed_cb),
+					 header, 0);
+		g_signal_connect_object (header->priv->shell_player,
+					 "playing-song-changed",
+					 G_CALLBACK (rb_header_playing_song_changed_cb),
+					 header, 0);
 		break;
 	case PROP_SEEKABLE:
 		header->priv->seekable = g_value_get_boolean (value);
@@ -360,9 +355,6 @@ rb_header_get_property (GObject *object,
 	case PROP_DB:
 		g_value_set_object (value, header->priv->db);
 		break;
-	case PROP_ENTRY:
-		g_value_set_boxed (value, header->priv->entry);
-		break;
 	case PROP_SHELL_PLAYER:
 		g_value_set_object (value, header->priv->shell_player);
 		break;
@@ -400,25 +392,6 @@ rb_header_new (RBShellPlayer *shell_player, RhythmDB *db)
 	return header;
 }
 
-/**
- * rb_header_set_playing_entry:
- * @header: the #RBHeader
- * @entry: the new playing #RhythmDBEntry
- * @seekable: whether the new playing entry is seekable
- *
- * Sets a new playing entry to be displayed in the header.
- */
-void
-rb_header_set_playing_entry (RBHeader *header,
-			     RhythmDBEntry *entry,
-			     gboolean seekable)
-{
-	g_object_set (header,
-		      "entry", entry,
-		      "seekable", seekable,
-		      NULL);
-}
-
 static void
 append_and_free (GString *str,
 		 char *text)
diff --git a/widgets/rb-header.h b/widgets/rb-header.h
index 29a6050..e18c4bb 100644
--- a/widgets/rb-header.h
+++ b/widgets/rb-header.h
@@ -67,10 +67,6 @@ GType		rb_header_get_type		(void);
 RBHeader *	rb_header_new			(RBShellPlayer *shell_player,
 						 RhythmDB *db);
 
-void		rb_header_set_playing_entry	(RBHeader *header,
-						 RhythmDBEntry *entry,
-						 gboolean seekable);
-
 void		rb_header_set_show_position_slider (RBHeader *header,
                                                     gboolean show);
 



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