[Xfce4-commits] <parole:master> Handle correctly source messages, for now only for removable media

Ali Abdallah aliov at xfce.org
Thu Aug 13 23:34:02 CEST 2009


Updating branch refs/heads/master
         to e2d7e6f62fdf6c528e08de2ecf331d45680fd441 (commit)
       from b5593091bc3bfcdcf6f913a7eb76158150a0bf06 (commit)

commit e2d7e6f62fdf6c528e08de2ecf331d45680fd441
Author: Ali Abdallah <aliov at xfce.org>
Date:   Thu Aug 13 23:01:47 2009 +0200

    Handle correctly source messages, for now only for removable media

 parole/gmarshal.list   |    1 +
 parole/parole-disc.c   |   78 +++++++++++++++++++++++++++++++++---------------
 parole/parole-disc.h   |    3 +-
 parole/parole-gst.c    |   44 +++++++++++++++++++++++++++
 parole/parole-gst.h    |    4 ++
 parole/parole-player.c |    7 ++--
 6 files changed, 109 insertions(+), 28 deletions(-)

diff --git a/parole/gmarshal.list b/parole/gmarshal.list
index 3747a11..05faeae 100644
--- a/parole/gmarshal.list
+++ b/parole/gmarshal.list
@@ -1,3 +1,4 @@
 VOID:OBJECT,ENUM
 VOID:OBJECT,DOUBLE
 VOID:OBJECT,INT
+VOID:STRING,STRING
diff --git a/parole/parole-disc.c b/parole/parole-disc.c
index 9627716..2e997e3 100644
--- a/parole/parole-disc.c
+++ b/parole/parole-disc.c
@@ -42,6 +42,7 @@
 
 #include "parole-disc.h"
 #include "parole-builder.h"
+#include "gmarshal.h"
 
 static void parole_disc_finalize   (GObject *object);
 
@@ -71,29 +72,53 @@ typedef struct
 {
     GtkWidget      *mi;
     gchar          *uri; /*Freed in (GDestroyNotify) in the data set below*/
+    gchar          *device;
     ParoleDiscKind  kind;
     
 } MountData;
 
 static void
+free_mount_data (gpointer data)
+{
+    MountData *mount;
+    
+    mount = (MountData *) data;
+    
+    if ( mount->uri )
+	g_free (mount->uri);
+	
+    if ( mount->device )
+	g_free (mount->device);
+	
+    g_free (mount);
+}
+
+static void
 parole_disc_media_activate_cb (GtkWidget *widget, ParoleDisc *disc)
 {
-    gchar *uri ;
+    MountData *data;
     
-    uri = g_object_get_data (G_OBJECT (widget), "uri");
+    data = g_object_get_data (G_OBJECT (widget), "mount-data");
     
-    g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, uri);
+    g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, data->uri, data->device);
 }
 
 static MountData *
-parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *uri, ParoleDiscKind kind)
+parole_disc_get_mount_data (ParoleDisc *disc, 
+			    const gchar *label, 
+			    const gchar *uri, 
+			    const gchar *device,
+			    ParoleDiscKind kind)
 {
     MountData *data;
     GtkWidget *img;
     
     data = g_new0 (MountData, 1);
+    
     data->kind = kind;
+    data->uri = data->device = NULL;
     data->uri = g_strdup (uri);
+    data->device = g_strdup (device);
 	
     data->mi = gtk_image_menu_item_new_with_label (label);
 	
@@ -104,17 +129,18 @@ parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *u
     gtk_widget_show (img);
 	
     g_object_set_data_full (G_OBJECT (data->mi),
-			    "uri", data->uri,
-			    (GDestroyNotify) g_free);
+			    "mount-data", data,
+			    (GDestroyNotify) free_mount_data);
 	
     gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 2);
+    
     g_signal_connect (data->mi, "activate",
 		      G_CALLBACK (parole_disc_media_activate_cb), disc);
     return data;
 }
 
 static void
-parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount)
+parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount, const gchar *device)
 {
     GFile *file;
     gchar **content_type;
@@ -176,7 +202,7 @@ got_cdda:
 	name = g_mount_get_name (mount);
 	label = g_strdup_printf ("%s %s", _("Play Disc"), name);
 	
-	data = parole_disc_get_mount_data (disc, label, uri, kind);
+	data = parole_disc_get_mount_data (disc, label, uri, device, kind);
 	g_free (uri);
 	
 	g_ptr_array_add (disc->priv->array, data);
@@ -188,14 +214,12 @@ got_cdda:
 }
 
 static void
-parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume)
+parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume, const gchar *device)
 {
 #if defined(__linux__)
     gint fd;
-    gchar *device;
     gint drive;
-    
-    device = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+
     TRACE ("device : %s", device);
     
     if ( (fd = open (device, O_RDONLY)) < 0 )
@@ -211,16 +235,15 @@ parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume)
 	{
 	    g_print ("Drive :%s is not yet ready\n", device);
 	    disc->priv->needs_update = TRUE;
-	    goto out;
 	}
-	if ( drive == CDS_DISC_OK )
+	else if ( drive == CDS_DISC_OK )
 	{
 	    if ( (drive = ioctl (fd, CDROM_DISC_STATUS, NULL)) > 0 )
 	    {
 		if ( drive == CDS_AUDIO || drive == CDS_MIXED )
 		{
 		    MountData *data;
-		    data = parole_disc_get_mount_data (disc, g_volume_get_name (volume), "cdda:/", PAROLE_DISC_CDDA);
+		    data = parole_disc_get_mount_data (disc, g_volume_get_name (volume), "cdda:/", device, PAROLE_DISC_CDDA);
 		    g_ptr_array_add (disc->priv->array, data);
 		}
 	    }
@@ -229,13 +252,12 @@ parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume)
     
     close (fd);
 out:
-    g_free (device);
-    
+    ;
 #endif /* if defined(__linux__) */
 }
 
 static void
-parole_disc_add_drive (ParoleDisc *disc, GDrive *drive)
+parole_disc_add_drive (ParoleDisc *disc, GDrive *drive, const gchar *device)
 {
     GList *list;
     guint len;
@@ -256,13 +278,13 @@ parole_disc_add_drive (ParoleDisc *disc, GDrive *drive)
 	if ( mount )
 	{
 	    TRACE ("Mount name : %s", g_mount_get_name (mount));
-	    parole_disc_add_mount_to_menu (disc, mount);
+	    parole_disc_add_mount_to_menu (disc, mount, device);
 	    g_object_unref (mount);
 	}
 	else
 	{
 	    /* Could be a cdda?*/
-	    parole_disc_check_cdrom (disc, volume);
+	    parole_disc_check_cdrom (disc, volume, device);
 	}
     }
     
@@ -290,10 +312,17 @@ parole_disc_get_drives (ParoleDisc *disc)
     for ( i = 0; i < len; i++)
     {
 	GDrive *drive;
+	gchar *device = NULL;
+	
 	drive = g_list_nth_data (list, i);
 	
 	if ( g_drive_can_eject (drive) && g_drive_has_media (drive) )
-	    parole_disc_add_drive (disc, drive);
+	{
+	    device = g_drive_get_identifier (drive, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+	    parole_disc_add_drive (disc, drive, device);
+	    if ( device )
+		g_free (device);
+	}
     }
     
     g_list_foreach (list, (GFunc) g_object_unref, NULL);
@@ -337,8 +366,9 @@ parole_disc_class_init (ParoleDiscClass *klass)
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (ParoleDiscClass, disc_selected),
                       NULL, NULL,
-		      g_cclosure_marshal_VOID__STRING,
-                      G_TYPE_NONE, 1, G_TYPE_STRING);
+		      _gmarshal_VOID__STRING_STRING,
+                      G_TYPE_NONE, 2, 
+		      G_TYPE_STRING, G_TYPE_STRING);
 		      
     object_class->finalize = parole_disc_finalize;
 
@@ -394,7 +424,7 @@ parole_disc_finalize (GObject *object)
     
     g_object_unref (disc->priv->monitor);
     
-    g_ptr_array_foreach (disc->priv->array, (GFunc) g_free, NULL);
+    g_ptr_array_foreach (disc->priv->array, (GFunc) free_mount_data, NULL);
     g_ptr_array_free (disc->priv->array, TRUE);
 
     G_OBJECT_CLASS (parole_disc_parent_class)->finalize (object);
diff --git a/parole/parole-disc.h b/parole/parole-disc.h
index 115fa00..23adbc2 100644
--- a/parole/parole-disc.h
+++ b/parole/parole-disc.h
@@ -53,7 +53,8 @@ typedef struct
     GObjectClass 	   parent_class;
     
     void		   (*disc_selected)	       (ParoleDisc *disc,
-							const gchar *uri);
+							const gchar *uri,
+							const gchar *device);
     
 } ParoleDiscClass;
 
diff --git a/parole/parole-gst.c b/parole/parole-gst.c
index fc954d8..b186cf2 100644
--- a/parole/parole-gst.c
+++ b/parole/parole-gst.c
@@ -77,6 +77,7 @@ struct ParoleGstPrivate
     ParoleStream *stream;
     gulong	  tick_id;
     GdkPixbuf    *logo;
+    gchar        *device;
     GTimer	 *hidecursor_timer;
     
     ParoleConf   *conf;
@@ -128,6 +129,9 @@ parole_gst_finalize (GObject *object)
     g_object_unref (gst->priv->conf);
     g_object_unref (gst->priv->logo);
     
+    if ( gst->priv->device )
+	g_free (gst->priv->device);
+    
     g_mutex_free (gst->priv->lock);
 
     G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object);
@@ -1216,6 +1220,27 @@ parole_gst_stream_info_notify_cb (GObject * obj, GParamSpec * pspec, ParoleGst *
 }
 
 static void
+parole_gst_source_notify_cb (GObject *obj, GParamSpec *pspec, ParoleGst *gst)
+{
+    GObject *source;
+    
+    g_object_get (obj, 
+		  "source", &source,
+		  NULL);
+
+    if ( source )
+    {
+	if ( G_LIKELY (gst->priv->device) )
+	{
+	    g_object_set (source, 
+			  "device", gst->priv->device,
+			  NULL);
+	}
+	g_object_unref (source);
+    }
+}
+
+static void
 parole_gst_play_file_internal (ParoleGst *gst)
 {
     gchar *uri;
@@ -1306,6 +1331,10 @@ parole_gst_construct (GObject *object)
     g_signal_connect (gst->priv->playbin, "notify::stream-info",
 		      G_CALLBACK (parole_gst_stream_info_notify_cb), gst);
       
+      
+    g_signal_connect (gst->priv->playbin, "notify::source",
+		      G_CALLBACK (parole_gst_source_notify_cb), gst);
+
     parole_gst_load_logo (gst);
     parole_gst_set_subtitle_encoding (gst);
     parole_gst_set_subtitle_font (gst);
@@ -1628,6 +1657,7 @@ parole_gst_init (ParoleGst *gst)
     gst->priv->buffering = FALSE;
     gst->priv->update_color_balance = TRUE;
     gst->priv->state_change_id = 0;
+    gst->priv->device = NULL;
     
     gst->priv->conf = parole_conf_new ();
     
@@ -1705,7 +1735,21 @@ void parole_gst_play_uri (ParoleGst *gst, const gchar *uri)
     parole_window_busy_cursor (GTK_WIDGET (gst)->window);
 
     g_idle_add ((GSourceFunc) parole_gst_play_idle, gst);
+}
+
+void parole_gst_play_device_uri (ParoleGst *gst, const gchar *uri, const gchar *device)
+{
+    TRACE ("device : %s", device);
+    
+    if ( gst->priv->device )
+    {
+	g_free (gst->priv->device);
+	gst->priv->device = NULL;
+    }
+    
+    gst->priv->device = g_strdup (device);
     
+    parole_gst_play_uri (gst, uri);
 }
 
 void parole_gst_pause (ParoleGst *gst)
diff --git a/parole/parole-gst.h b/parole/parole-gst.h
index 851c9a3..7fa10e5 100644
--- a/parole/parole-gst.h
+++ b/parole/parole-gst.h
@@ -86,6 +86,10 @@ GtkWidget      	       *parole_gst_new             	(void);
 void		        parole_gst_play_uri        	(ParoleGst *gst,
 							 const gchar *uri);
 
+void		        parole_gst_play_device_uri     	(ParoleGst *gst,
+							 const gchar *uri,
+							 const gchar *device);
+
 void			parole_gst_pause           	(ParoleGst *gst);
 
 void			parole_gst_resume          	(ParoleGst *gst);
diff --git a/parole/parole-player.c b/parole/parole-player.c
index 2f6fd58..b66a287 100644
--- a/parole/parole-player.c
+++ b/parole/parole-player.c
@@ -347,11 +347,12 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 }
 
 static void
-parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, ParolePlayer *player)
+parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, const gchar *device, ParolePlayer *player)
 {
     parole_player_reset (player);
     gtk_widget_set_sensitive (player->priv->stop, TRUE);
-    parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri);
+    
+    parole_gst_play_device_uri (PAROLE_GST (player->priv->gst), uri, device);
 }
 
 static void
@@ -1545,7 +1546,7 @@ ParoleMediaList	*parole_player_get_media_list (ParolePlayer *player)
 
 void parole_player_play_uri_disc (ParolePlayer *player, const gchar *uri)
 {
-    parole_player_disc_selected_cb (NULL, uri, player);
+    parole_player_disc_selected_cb (NULL, uri, NULL, player);
 }
 
 void parole_player_terminate (ParolePlayer *player)



More information about the Xfce4-commits mailing list