[Xfce4-commits] <parole:master> Hacked-together Audio CD playlist support.

Sean Davis noreply at xfce.org
Sun Dec 2 20:26:03 CET 2012


Updating branch refs/heads/master
         to 6b991bbf4f61e8076f392a60614d737e7308656b (commit)
       from e683631c487cc3ccd0c204336b6a3330af635965 (commit)

commit 6b991bbf4f61e8076f392a60614d737e7308656b
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sun Dec 2 14:25:52 2012 -0500

    Hacked-together Audio CD playlist support.

 src/gst/parole-gst.c   |   62 +++--------------------------------------------
 src/gst/parole-gst.h   |    2 +
 src/misc/parole-file.c |   44 +++++++++++++++++++++++++++++++++-
 src/misc/parole-file.h |    2 +
 src/parole-medialist.c |   16 ++++++++++++
 src/parole-medialist.h |    2 +
 src/parole-player.c    |   37 +++++++++++++++++-----------
 7 files changed, 91 insertions(+), 74 deletions(-)

diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index 5d09e59..346e1fd 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -64,9 +64,6 @@ static void     parole_gst_change_state 	(ParoleGst *gst,
 static void	parole_gst_terminate_internal   (ParoleGst *gst, 
 						 gboolean fade_sound);
 						 
-static void     parole_gst_seek_cdda_track	(ParoleGst *gst,
-						 gint track);
-						 
 static gchar * parole_gst_tag_list_get_cover_external (ParoleGst *gst);
 						 
 static GdkPixbuf * parole_gst_tag_list_get_cover (ParoleGst *gst, GstTagList *tag_list);
@@ -1370,28 +1367,12 @@ parole_gst_bus_event (GstBus *bus, GstMessage *msg, gpointer data)
         case GST_MESSAGE_EOS:
 	{
 	    ParoleMediaType media_type;
-	    gint current_track;
 	    
 	    TRACE ("End of stream");
 	    
 	    g_object_get (G_OBJECT (gst->priv->stream),
 			  "media-type", &media_type,
 			  NULL);
-	    if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
-	    {
-		gint num_tracks;
-		g_object_get (G_OBJECT (gst->priv->stream),
-			      "num-tracks", &num_tracks,
-			      "track", &current_track,
-			      NULL);
-			  
-		TRACE ("Current track %d Number of tracks %d", current_track, num_tracks);
-		if ( num_tracks != current_track )
-		{
-		    parole_gst_seek_cdda_track (gst, current_track);
-		    break;
-		}
-	    }
 		
 	    gst->priv->media_state = PAROLE_STATE_PLAYBACK_FINISHED;
 	    g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, 
@@ -1670,19 +1651,6 @@ parole_gst_button_release_event (GtkWidget *widget, GdkEventButton *ev)
     return ret;
 }
 
-static void     parole_gst_seek_cdda_track	(ParoleGst *gst,
-						 gint track)
-{
-    TRACE ("Track %d", track);
-    
-    if ( !gst_element_seek (gst->priv->playbin, 1.0, gst_format_get_by_nick ("track"), 
-			    GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
-			    track,
-			    GST_SEEK_TYPE_NONE,
-			    0) )
-	g_warning ("Seek to track %d failed ", track);
-}
-
 static void
 parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step)
 {
@@ -2400,37 +2368,15 @@ void parole_gst_prev_dvd_chapter (ParoleGst *gst)
     parole_gst_change_dvd_chapter (gst, -1);
 }
 
-void parole_gst_next_cdda_track (ParoleGst *gst)
+gint parole_gst_get_num_tracks (ParoleGst *gst)
 {
-    //parole_gst_change_cdda_track (gst, 1);
-
-    gint num_tracks, current_track;
+    gint num_tracks;
     
     g_object_get (G_OBJECT (gst->priv->stream),
 			      "num-tracks", &num_tracks,
-			      "track", &current_track,
-			      NULL);
-
-    if ( num_tracks != current_track )
-    {
-        parole_gst_seek_cdda_track (gst, current_track);
-    }
-}
-
-void parole_gst_prev_cdda_track (ParoleGst *gst)
-{
-    //parole_gst_change_cdda_track (gst, -1);
-    
-    gint current_track;
-    
-    g_object_get (G_OBJECT (gst->priv->stream),
-			      "track", &current_track,
 			      NULL);
-
-    if ( current_track != 1 )
-    {
-        parole_gst_seek_cdda_track (gst, current_track-2);
-    }
+			      
+    return num_tracks;
 }
 
 void parole_gst_seek_cdda	(ParoleGst *gst, guint track_num)
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index 1102de1..5530768 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -128,6 +128,8 @@ void			parole_gst_next_cdda_track 	(ParoleGst *gst);
 
 void			parole_gst_prev_cdda_track 	(ParoleGst *gst);
 
+gint            parole_gst_get_num_tracks (ParoleGst *gst);
+
 void			parole_gst_seek_cdda	 	(ParoleGst *gst,
 							 guint track_num);
 
diff --git a/src/misc/parole-file.c b/src/misc/parole-file.c
index 531948b..996a74b 100644
--- a/src/misc/parole-file.c
+++ b/src/misc/parole-file.c
@@ -164,9 +164,24 @@ parole_file_constructed (GObject *object)
     ParoleFilePrivate *priv;
     GError *error = NULL;
     
+    gchar *filename;
+    
     file = PAROLE_FILE (object);
     priv = PAROLE_FILE_GET_PRIVATE (file);
     
+    filename = g_strdup(priv->filename);
+    
+    if ( g_str_has_prefix(filename, "cdda") )
+    {
+        priv->directory = NULL;
+        priv->uri = g_strdup(filename);
+        priv->content_type = "cdda";
+        g_free(filename);
+        return;
+    }
+    
+    g_free(filename);
+    
     gfile = g_file_new_for_commandline_arg (priv->filename);
 
     info = g_file_query_info (gfile, 
@@ -310,7 +325,7 @@ parole_file_class_init (ParoleFileClass *klass)
 							  "Content type", 
 							  "The content type of the file",
 							  NULL,
-							  G_PARAM_READABLE));
+  							  G_PARAM_READABLE));
 							  
 	/**
      * ParoleFile:directory:
@@ -394,10 +409,37 @@ ParoleFile *
 parole_file_new_with_display_name (const gchar *filename, const gchar *display_name)
 {
     ParoleFile *file = NULL;
+    
     file = g_object_new (PAROLE_TYPE_FILE, 
 			 "filename", filename, 
 			 "display-name", display_name, 
 			 NULL);
+
+    return file;
+}
+
+/**
+ * parole_file_new_cdda_track:
+ * @track_num: cd track number.
+ * 
+ * 
+ * 
+ * Returns: A new #ParoleFile object.
+ * 
+ * Since: 0.4
+ **/
+ParoleFile *
+parole_file_new_cdda_track (const gint track_num, const gchar *display_name)
+{
+    ParoleFile *file = NULL;
+    gchar *uri = g_strdup_printf("cdda://%i", track_num);
+
+    file = g_object_new (PAROLE_TYPE_FILE, 
+		 "filename", uri, 
+		 "display-name", display_name, 
+		 NULL);
+    
+    g_free(uri);
     return file;
 }
 
diff --git a/src/misc/parole-file.h b/src/misc/parole-file.h
index 7b55450..6fc5b9c 100644
--- a/src/misc/parole-file.h
+++ b/src/misc/parole-file.h
@@ -53,6 +53,8 @@ ParoleFile       	       *parole_file_new             	  (const gchar *filename)
 ParoleFile       	       *parole_file_new_with_display_name (const gchar *filename,
 								   const gchar *display_name);
 								   
+ParoleFile                 *parole_file_new_cdda_track (const gint track_num, const gchar *display_name);
+								   
 
 void parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi);
                                    
diff --git a/src/parole-medialist.c b/src/parole-medialist.c
index f898153..655d068 100644
--- a/src/parole-medialist.c
+++ b/src/parole-medialist.c
@@ -307,6 +307,22 @@ parole_media_list_files_open (ParoleMediaList *list, GSList *files, gboolean emi
     }
 }
 
+void
+parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks)
+{
+    GSList *files = NULL;
+    ParoleFile *file;
+    int i;
+    
+    for (i = 0; i < n_tracks; i++)
+    {
+        file = parole_file_new_cdda_track( i+1, g_strdup_printf( _("Track %i"), i+1) );
+        files = g_slist_append(files, file);
+    }
+    
+    parole_media_list_files_open(list, files, TRUE);
+}
+
 /* Callback to determine whether opened files should start playing immediately */
 static void
 parole_media_list_files_opened_cb (ParoleMediaChooser *chooser, 
diff --git a/src/parole-medialist.h b/src/parole-medialist.h
index 8b6253e..249008d 100644
--- a/src/parole-medialist.h
+++ b/src/parole-medialist.h
@@ -125,6 +125,8 @@ void			         parole_media_list_open_location    (ParoleMediaList *list);
 
 gboolean			 parole_media_list_add_files        (ParoleMediaList *list,
 								     gchar **filenames, gboolean enqueue);
+								     
+void                parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks);
 
 void				 parole_media_list_save_list	    (ParoleMediaList *list);
 
diff --git a/src/parole-player.c b/src/parole-player.c
index 9d40010..54c32c6 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -361,6 +361,8 @@ struct ParolePlayerPrivate
     gboolean             internal_range_change;
     gboolean		 buffering;
     
+    gboolean        wait_for_gst_disc_info;
+    
     GtkTreeRowReference *row;
         
 };
@@ -960,8 +962,10 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	{
 	    const gchar *sub = NULL;
 	    const gchar *uri;
+	    const gchar *directory = NULL;
 	    
 	    uri = parole_file_get_uri (file);
+	    directory = parole_file_get_directory(file);
 	    
 	    if ( g_str_has_prefix (uri, "file:/") )
 	    {
@@ -974,7 +978,7 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 		}
 	    }
 	    TRACE ("Trying to play media file %s", uri);
-	    TRACE ("File content type %s", parole_file_get_content_type (file));
+	    TRACE ("File content type %s", parole_file_get_content_type(file));
 	    
 	    
 	    parole_gst_play_uri (PAROLE_GST (player->priv->gst), 
@@ -982,7 +986,9 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 				 sub);
 	    
 	    gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
-		parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, parole_file_get_directory(file));
+	    
+	    if ( directory )
+		parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, directory);
 		
 
 	    g_object_unref (file);
@@ -996,6 +1002,9 @@ parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, const gchar
     parole_player_reset (player);
     parole_gst_play_device_uri (PAROLE_GST (player->priv->gst), uri, device);
     player->priv->current_media_type = parole_gst_get_current_stream_type (PAROLE_GST (player->priv->gst));
+    
+    if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+        player->priv->wait_for_gst_disc_info = TRUE;
 }
 
 static void
@@ -1224,6 +1233,12 @@ parole_player_playing (ParolePlayer *player, const ParoleStream *stream)
 		  "live", &live,
 		  NULL);
 		  
+    if (player->priv->wait_for_gst_disc_info == TRUE)
+    {
+        parole_media_list_add_cdda_tracks(player->priv->list, parole_gst_get_num_tracks(PAROLE_GST (player->priv->gst)));
+        player->priv->wait_for_gst_disc_info = FALSE;
+    }
+		  
     gtk_widget_set_sensitive (player->priv->play_pause, TRUE);
     
     parole_player_set_playpause_button_image (player->priv->play_pause, GTK_STOCK_MEDIA_PAUSE);
@@ -1341,14 +1356,10 @@ parole_player_play_next (ParolePlayer *player, gboolean allow_shuffle)
 {
 	gboolean repeat, shuffle;
     GtkTreeRowReference *row;
-
-	if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
-	 player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+    
+	if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
     {
-		if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
 		parole_gst_next_dvd_chapter (PAROLE_GST(player->priv->gst));
-		else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
-		parole_gst_next_cdda_track (PAROLE_GST(player->priv->gst));
 		return;
     }
     
@@ -1387,13 +1398,9 @@ parole_player_play_prev (ParolePlayer *player)
 {
 	GtkTreeRowReference *row;
 
-	if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
-	 player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+	if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
     {
-		if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
 		parole_gst_prev_dvd_chapter (PAROLE_GST(player->priv->gst));
-		else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
-		parole_gst_prev_cdda_track (PAROLE_GST(player->priv->gst));
 		return;
     }
     
@@ -1476,8 +1483,7 @@ parole_player_media_state_cb (ParoleGst *gst, const ParoleStream *stream, Parole
 #ifdef DEBUG
     TRACE ("***Playback about to finish***");
 #endif
-    if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
-        player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
+    if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
         parole_player_play_next (player, TRUE);
     }
     else if ( state == PAROLE_STATE_PLAYBACK_FINISHED )
@@ -2685,6 +2691,7 @@ parole_player_init (ParolePlayer *player)
     player->priv->full_screen = FALSE;
     player->priv->buffering = FALSE;
     player->priv->row = NULL;
+    player->priv->wait_for_gst_disc_info = FALSE;
     
     player->priv->recent = gtk_recent_manager_get_default ();
     


More information about the Xfce4-commits mailing list