[Xfce4-commits] <parole:master> Added infobar for selecting audio tracks and subtitles.

Sean Davis noreply at xfce.org
Mon Jul 23 01:25:04 CEST 2012


Updating branch refs/heads/master
         to 5179af3df5d83b5717517de35cb8e1db21b6aeae (commit)
       from 7bc533582532cd3b4b3a0afc202eea748c1ca855 (commit)

commit 5179af3df5d83b5717517de35cb8e1db21b6aeae
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Jul 18 23:18:02 2012 -0400

    Added infobar for selecting audio tracks and subtitles.

 data/interfaces/parole.ui |  113 ++++++++++++++++++++++++++++-
 src/gst/parole-gst.c      |   78 ++++++++++++++++++++
 src/gst/parole-gst.h      |    2 +
 src/parole-player.c       |  174 ++++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 363 insertions(+), 4 deletions(-)

diff --git a/data/interfaces/parole.ui b/data/interfaces/parole.ui
index fdbfa79..bf8e023 100644
--- a/data/interfaces/parole.ui
+++ b/data/interfaces/parole.ui
@@ -111,6 +111,18 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-media-forward</property>
   </object>
+  <object class="GtkListStore" id="liststore_audiotrack">
+    <columns>
+      <!-- column-name track_title -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="liststore_subtitles">
+    <columns>
+      <!-- column-name subtitle_name -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkWindow" id="main-window">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">Parole Media Player</property>
@@ -560,6 +572,103 @@
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <child>
+                                  <object class="GtkHBox" id="hbox_infobar">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <object class="GtkHBox" id="infobar_contents">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="spacing">12</property>
+                                        <child>
+                                          <object class="GtkHBox" id="hbox3">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkLabel" id="label1">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">1</property>
+                                                <property name="label" translatable="yes">Audio Track:</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">0</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkComboBox" id="combobox_audiotrack">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="model">liststore_audiotrack</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkHBox" id="hbox4">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkLabel" id="label2">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">1</property>
+                                                <property name="label" translatable="yes">Subtitles:</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">0</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkComboBox" id="combobox_subtitles">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="model">liststore_subtitles</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
                                   <object class="GtkHBox" id="output">
                                     <property name="visible">True</property>
                                     <property name="app_paintable">True</property>
@@ -571,7 +680,7 @@
                                   <packing>
                                     <property name="expand">True</property>
                                     <property name="fill">True</property>
-                                    <property name="position">0</property>
+                                    <property name="position">1</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -809,7 +918,7 @@ audio-volume-medium</property>
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">True</property>
-                                    <property name="position">1</property>
+                                    <property name="position">2</property>
                                   </packing>
                                 </child>
                               </object>
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index 344869e..b3948dd 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -2188,6 +2188,84 @@ parole_gst_set_cursor_visible (ParoleGst *gst, gboolean visible)
 	parole_window_invisible_cursor (GTK_WIDGET (gst)->window);
 }
 
+GList *
+gst_get_lang_list_for_type (ParoleGst * gst, const gchar * type_name)
+{
+  GList *ret = NULL;
+  gint num = 1;
+
+  if (g_str_equal (type_name, "AUDIO")) {
+    gint i, n;
+
+    g_object_get (G_OBJECT (gst->priv->playbin), "n-audio", &n, NULL);
+    if (n == 0)
+      return NULL;
+
+    for (i = 0; i < n; i++) {
+      GstTagList *tags = NULL;
+
+      g_signal_emit_by_name (G_OBJECT (gst->priv->playbin), "get-audio-tags",
+          i, &tags);
+
+      if (tags) {
+        gchar *lc = NULL, *cd = NULL;
+
+	gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
+	gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
+
+        if (lc) {
+	  ret = g_list_prepend (ret, lc);
+	  g_free (cd);
+	} else if (cd) {
+	  ret = g_list_prepend (ret, cd);
+	} else {
+	  ret = g_list_prepend (ret, g_strdup_printf (_("Audio Track #%d"), num++));
+	}
+	gst_tag_list_free (tags);
+      } else {
+	ret = g_list_prepend (ret, g_strdup_printf (_("Audio Track #%d"), num++));
+      }
+    }
+  } else if (g_str_equal (type_name, "TEXT")) {
+    gint i, n = 0;
+
+    g_object_get (G_OBJECT (gst->priv->playbin), "n-text", &n, NULL);
+    if (n == 0)
+      return NULL;
+
+    for (i = 0; i < n; i++) {
+      GstTagList *tags = NULL;
+
+      g_signal_emit_by_name (G_OBJECT (gst->priv->playbin), "get-text-tags",
+          i, &tags);
+
+      if (tags) {
+        gchar *lc = NULL, *cd = NULL;
+
+	gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
+	gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
+
+        if (lc) {
+	  ret = g_list_prepend (ret, lc);
+	  g_free (cd);
+	} else if (cd) {
+	  ret = g_list_prepend (ret, cd);
+	} else {
+	  ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
+	}
+	gst_tag_list_free (tags);
+      } else {
+	ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
+      }
+    }
+  } else {
+    g_critical ("Invalid stream type '%s'", type_name);
+    return NULL;
+  }
+
+  return g_list_reverse (ret);
+}
+
 const ParoleStream     *parole_gst_get_stream 		(ParoleGst *gst)
 {
     g_return_val_if_fail (PAROLE_IS_GST (gst), NULL);
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index 12e009c..0f3e9f1 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -139,6 +139,8 @@ gboolean		parole_gst_get_is_xvimage_sink  (ParoleGst *gst);
 
 void 			parole_gst_set_cursor_visible 	(ParoleGst *gst, 
 							 gboolean visible);
+							 
+GList *			gst_get_lang_list_for_type (ParoleGst * gst, const gchar * type_name);
 
 const ParoleStream     *parole_gst_get_stream 		(ParoleGst *gst);
 							 
diff --git a/src/parole-player.c b/src/parole-player.c
index 7b92213..9b8d10c 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -279,6 +279,15 @@ struct ParolePlayerPrivate
     GtkWidget		*go_fs;
     GtkWidget		*leave_fs;
     
+    GtkWidget		*hbox_infobar;
+    GtkWidget		*infobar;
+    GtkWidget		*combobox_audiotrack;
+    GtkWidget		*combobox_subtitles;
+    GtkListStore	*liststore_audiotrack;
+    GtkListStore	*liststore_subtitles;
+    GList			*audio_list;
+    GList			*subtitle_list;
+    
     GtkWidget		*main_box;
     
     GtkWidget		*volume;
@@ -484,6 +493,132 @@ parole_player_reset (ParolePlayer *player)
     }
 }
 
+static gboolean
+parole_sublang_equal_lists (GList *orig, GList *new)
+{
+	GList *o, *n;
+	gboolean retval;
+
+	if ((orig == NULL && new != NULL) || (orig != NULL && new == NULL))
+		return FALSE;
+	if (orig == NULL && new == NULL)
+		return TRUE;
+
+	if (g_list_length (orig) != g_list_length (new))
+		return FALSE;
+
+	retval = TRUE;
+	o = orig;
+	n = new;
+	while (o != NULL && n != NULL && retval != FALSE)
+	{
+		if (g_str_equal (o->data, n->data) == FALSE)
+			retval = FALSE;
+                o = g_list_next (o);
+                n = g_list_next (n);
+	}
+
+	return retval;
+}
+
+static void
+parole_player_update_audio_tracks (ParolePlayer *player, ParoleGst *gst)
+{
+	GList * list = gst_get_lang_list_for_type (gst, "AUDIO");
+	GList *l;
+	gchar* language;
+	
+	if (parole_sublang_equal_lists (player->priv->audio_list, list) == TRUE)
+	{
+		return;
+	}
+	
+	player->priv->audio_list = list;
+	gtk_list_store_clear(player->priv->liststore_audiotrack);
+	
+	for (l = list; l != NULL; l = l->next)
+	{
+		language = g_strdup (l->data);
+	
+		GtkTreeIter iter;
+		gtk_list_store_append(GTK_LIST_STORE(player->priv->liststore_audiotrack), &iter);
+		gtk_list_store_set(GTK_LIST_STORE(player->priv->liststore_audiotrack), &iter, 0, language, -1);
+		g_free (language);
+	}
+	
+	gtk_combo_box_set_active( GTK_COMBO_BOX(player->priv->combobox_audiotrack), 0 );
+	
+	if (g_list_length (list) <= 1) {
+	gtk_widget_set_sensitive( GTK_WIDGET( player->priv->combobox_audiotrack ), FALSE );
+    g_free (list->data);
+    g_list_free (list);
+    list = NULL;
+  	}
+  	else
+  	{
+  		gtk_widget_set_sensitive( GTK_WIDGET( player->priv->combobox_audiotrack ), TRUE );
+  		gtk_widget_show(player->priv->infobar);
+  	}
+}
+
+static void
+parole_player_update_subtitles (ParolePlayer *player, ParoleGst *gst)
+{
+	GList * list = gst_get_lang_list_for_type (gst, "TEXT");
+	GList *l;
+	gchar* language;
+	
+	if (parole_sublang_equal_lists (player->priv->subtitle_list, list) == TRUE)
+	{
+		if (g_list_length (list) == 0)
+		{
+			gtk_list_store_clear(player->priv->liststore_subtitles);
+			GtkTreeIter iter;
+			gtk_list_store_append(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter);
+			gtk_list_store_set(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter, 0, "None", -1);
+			gtk_combo_box_set_active( GTK_COMBO_BOX(player->priv->combobox_subtitles), 0 );
+		}
+		return;
+	}
+	
+	player->priv->subtitle_list = list;
+	gtk_list_store_clear(player->priv->liststore_subtitles);
+	
+	
+	GtkTreeIter iter;
+	gtk_list_store_append(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter);
+	gtk_list_store_set(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter, 0, "None", -1);
+	
+	for (l = list; l != NULL; l = l->next)
+	{
+		language = g_strdup (l->data);
+	
+		GtkTreeIter iter;
+		gtk_list_store_append(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter);
+		gtk_list_store_set(GTK_LIST_STORE(player->priv->liststore_subtitles), &iter, 0, language, -1);
+		g_free (language);
+	}
+	
+	gtk_combo_box_set_active( GTK_COMBO_BOX(player->priv->combobox_subtitles), 0 );
+	
+	if (g_list_length (list) == 1) {
+    g_free (list->data);
+    g_list_free (list);
+    list = NULL;
+  	}
+  	else
+  	{
+  		gtk_widget_show(player->priv->infobar);
+  	}
+}
+
+static void
+parole_player_update_languages (ParolePlayer *player, ParoleGst *gst)
+{
+	parole_player_update_audio_tracks(player, gst);
+	parole_player_update_subtitles(player, gst);
+}
+
 static void
 parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *row, ParolePlayer *player)
 {
@@ -523,8 +658,9 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 				 sub);
 	    g_free (sub);
 	    
-	    gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
-	    
+	    //gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
+		
+
 	    g_object_unref (file);
 	}
     }
@@ -737,6 +873,7 @@ parole_player_playing (ParolePlayer *player, const ParoleStream *stream)
     parole_player_save_uri (player, stream);
     parole_media_list_select_row (player->priv->list, player->priv->row);
     gtk_widget_grab_focus (player->priv->gst);
+    parole_player_update_languages (player, PAROLE_GST(player->priv->gst));
 }
 
 static void
@@ -2090,6 +2227,39 @@ parole_player_init (ParolePlayer *player)
     
     gtk_box_set_child_packing( GTK_BOX(player->priv->control), GTK_WIDGET(player->priv->play_box), TRUE, TRUE, 4, GTK_PACK_START );
     
+    player->priv->hbox_infobar = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_infobar"));
+    player->priv->combobox_audiotrack = GTK_WIDGET (gtk_builder_get_object (builder, "combobox_audiotrack"));
+    player->priv->combobox_subtitles = GTK_WIDGET (gtk_builder_get_object (builder, "combobox_subtitles"));
+    player->priv->liststore_audiotrack = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore_audiotrack"));
+    player->priv->liststore_subtitles = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore_subtitles"));
+    player->priv->audio_list = NULL;
+    player->priv->subtitle_list = NULL;
+    GtkWidget *infobar_contents = GTK_WIDGET (gtk_builder_get_object( builder, "infobar_contents"));
+    
+    GtkCellRenderer * cell = gtk_cell_renderer_text_new();
+	gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( player->priv->combobox_audiotrack ), cell, TRUE );
+	gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( player->priv->combobox_audiotrack ), cell, "text", 0, NULL );
+	
+	GtkCellRenderer * sub_cell = gtk_cell_renderer_text_new();
+	gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( player->priv->combobox_subtitles ), sub_cell, TRUE );
+	gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( player->priv->combobox_subtitles ), sub_cell, "text", 0, NULL );
+	
+    /* set up info bar */
+	player->priv->infobar = gtk_info_bar_new ();
+	gtk_widget_set_no_show_all (player->priv->infobar, TRUE);
+
+	GtkWidget *content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (player->priv->infobar));
+	gtk_widget_reparent (infobar_contents, content_area);
+	gtk_info_bar_add_button (GTK_INFO_BAR (player->priv->infobar),
+		                     GTK_STOCK_CLOSE, GTK_RESPONSE_OK);
+	g_signal_connect (player->priv->infobar, "response",
+		              G_CALLBACK (gtk_widget_hide), NULL);
+		              
+	gtk_info_bar_set_message_type (GTK_INFO_BAR (player->priv->infobar),
+                               GTK_MESSAGE_QUESTION);
+                               
+	gtk_box_pack_start( GTK_BOX( player->priv->hbox_infobar ), player->priv->infobar, TRUE, TRUE, 0);
+	
     gtk_scale_button_set_value (GTK_SCALE_BUTTON (player->priv->volume), 
 			 (gdouble) (parole_rc_read_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, 100)/100.));
     /*


More information about the Xfce4-commits mailing list