[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