[totem/wip/hadess/track-lists: 4/4] backend: Add subtitles/languages changed signals




commit 18a9e8538a6147602ee37bcb505643ee4c6a9517
Author: Bastien Nocera <hadess hadess net>
Date:   Fri Feb 11 13:44:01 2022 +0100

    backend: Add subtitles/languages changed signals
    
    This fixes the subtitles and languages menus being updated too often.

 src/backend/bacon-video-widget.c | 48 +++++++++++++++++++++++++++++++++++-----
 src/totem-object.c               | 12 ++++++----
 2 files changed, 50 insertions(+), 10 deletions(-)
---
diff --git a/src/backend/bacon-video-widget.c b/src/backend/bacon-video-widget.c
index d301c5ee1..e7d741990 100644
--- a/src/backend/bacon-video-widget.c
+++ b/src/backend/bacon-video-widget.c
@@ -118,6 +118,8 @@ enum
   SIGNAL_MISSING_PLUGINS,
   SIGNAL_DOWNLOAD_BUFFERING,
   SIGNAL_PLAY_STARTING,
+  SIGNAL_SUBTITLES_CHANGED,
+  SIGNAL_LANGUAGES_CHANGED,
   LAST_SIGNAL
 };
 
@@ -929,6 +931,34 @@ bacon_video_widget_class_init (BaconVideoWidgetClass * klass)
                   NULL, NULL,
                   g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
+  /**
+   * BaconVideoWidget::subtitles-changed:
+   * @bvw: the #BaconVideoWidget which received the signal
+   *
+   * Emitted when the list of subtitle tracks has changed.
+   **/
+  bvw_signals[SIGNAL_SUBTITLES_CHANGED] =
+    g_signal_new ("subtitles-changed",
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+  /**
+   * BaconVideoWidget::languages-changed:
+   * @bvw: the #BaconVideoWidget which received the signal
+   *
+   * Emitted when the list of languages/audio tracks has changed.
+   **/
+  bvw_signals[SIGNAL_LANGUAGES_CHANGED] =
+    g_signal_new ("languages-changed",
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
   g_resources_register (_bvw_get_resource ());
 
   default_theme = gtk_icon_theme_get_default ();
@@ -950,8 +980,10 @@ bvw_update_stream_info (BaconVideoWidget *bvw)
   parse_stream_info (bvw);
 
   g_signal_emit (bvw, bvw_signals[SIGNAL_GOT_METADATA], 0, NULL);
-  update_subtitles_tracks (bvw);
-  update_languages_tracks (bvw);
+  if (update_subtitles_tracks (bvw))
+    g_signal_emit (bvw, bvw_signals[SIGNAL_SUBTITLES_CHANGED], 0);
+  if (update_languages_tracks (bvw))
+    g_signal_emit (bvw, bvw_signals[SIGNAL_LANGUAGES_CHANGED], 0);
   g_signal_emit (bvw, bvw_signals[SIGNAL_CHANNELS_CHANGE], 0);
 }
 
@@ -2978,11 +3010,11 @@ bacon_video_widget_set_language (BaconVideoWidget * bvw, int language)
 
   g_signal_emit_by_name (G_OBJECT (bvw->play), "get-audio-tags", language, &tags);
   bvw_update_tags (bvw, tags, "audio");
-  update_languages_tracks (bvw);
+  if (update_languages_tracks (bvw))
+    g_signal_emit (bvw, bvw_signals[SIGNAL_LANGUAGES_CHANGED], 0);
 
   /* so it updates its metadata for the newly-selected stream */
   g_signal_emit (bvw, bvw_signals[SIGNAL_GOT_METADATA], 0, NULL);
-  g_signal_emit (bvw, bvw_signals[SIGNAL_CHANNELS_CHANGE], 0);
 }
 
 /**
@@ -3470,8 +3502,10 @@ bacon_video_widget_open (BaconVideoWidget *bvw,
 
   gst_element_set_state (bvw->play, GST_STATE_PAUSED);
 
-  update_subtitles_tracks (bvw);
-  update_languages_tracks (bvw);
+  if (update_subtitles_tracks (bvw))
+    g_signal_emit (bvw, bvw_signals[SIGNAL_SUBTITLES_CHANGED], 0);
+  if (update_languages_tracks (bvw))
+    g_signal_emit (bvw, bvw_signals[SIGNAL_LANGUAGES_CHANGED], 0);
   g_signal_emit (bvw, bvw_signals[SIGNAL_CHANNELS_CHANGE], 0);
 }
 
@@ -3822,6 +3856,8 @@ bacon_video_widget_close (BaconVideoWidget * bvw)
   g_clear_pointer (&bvw->videotags, gst_tag_list_unref);
 
   g_object_notify (G_OBJECT (bvw), "seekable");
+  g_signal_emit (bvw, bvw_signals[SIGNAL_SUBTITLES_CHANGED], 0);
+  g_signal_emit (bvw, bvw_signals[SIGNAL_LANGUAGES_CHANGED], 0);
   g_signal_emit (bvw, bvw_signals[SIGNAL_CHANNELS_CHANGE], 0);
   got_time_tick (GST_ELEMENT (bvw->play), 0, bvw);
 }
diff --git a/src/totem-object.c b/src/totem-object.c
index b68f68af1..3ad6de4c8 100644
--- a/src/totem-object.c
+++ b/src/totem-object.c
@@ -2510,8 +2510,6 @@ on_channels_change_event (BaconVideoWidget *bvw, TotemObject *totem)
 {
        gchar *name;
 
-       totem_subtitles_menu_update (totem);
-       totem_languages_menu_update (totem);
        update_media_menu_items (totem);
 
        /* updated stream info (new song) */
@@ -2550,8 +2548,6 @@ on_got_metadata_event (BaconVideoWidget *bvw, TotemObject *totem)
                g_free (name);
        }
 
-       totem_subtitles_menu_update (totem);
-       totem_languages_menu_update (totem);
        update_buttons (totem);
        on_playlist_change_name (TOTEM_PLAYLIST (totem->playlist), totem);
 }
@@ -4226,6 +4222,14 @@ video_widget_create (TotemObject *totem)
                        "channels-change",
                        G_CALLBACK (on_channels_change_event),
                        totem);
+       g_signal_connect_swapped (G_OBJECT (totem->bvw),
+                                 "subtitles-changed",
+                                 G_CALLBACK (totem_subtitles_menu_update),
+                                 totem);
+       g_signal_connect_swapped (G_OBJECT (totem->bvw),
+                                 "languages-changed",
+                                 G_CALLBACK (totem_languages_menu_update),
+                                 totem);
        g_signal_connect (G_OBJECT (totem->bvw),
                        "tick",
                        G_CALLBACK (update_current_time),


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