[sushi] audio: move tag discovery code to JS



commit 5acbf79018af55e8bf8337c6981c59ca5d63e224
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Wed Jun 19 10:01:39 2019 -0700

    audio: move tag discovery code to JS
    
    We don't need to do this from C, and it causes problems with
    introspection on certain configurations.
    
    https://gitlab.gnome.org/GNOME/sushi/issues/13

 src/libsushi/meson.build          |  1 -
 src/libsushi/sushi-sound-player.c | 93 ---------------------------------------
 src/ui/main.js                    |  1 +
 src/viewers/audio.js              | 27 +++++++++---
 4 files changed, 23 insertions(+), 99 deletions(-)
---
diff --git a/src/libsushi/meson.build b/src/libsushi/meson.build
index a1b08ae..8986fc4 100644
--- a/src/libsushi/meson.build
+++ b/src/libsushi/meson.build
@@ -52,7 +52,6 @@ gnome.generate_gir(
   symbol_prefix: 'sushi',
   identifier_prefix: 'Sushi',
   includes: [
-    'GstPbutils-1.0',
     'GstTag-1.0',
     'GdkPixbuf-2.0',
     'Gtk-3.0',
diff --git a/src/libsushi/sushi-sound-player.c b/src/libsushi/sushi-sound-player.c
index 18db6a2..cd30787 100644
--- a/src/libsushi/sushi-sound-player.c
+++ b/src/libsushi/sushi-sound-player.c
@@ -27,7 +27,6 @@
 #include <glib-object.h>
 
 #include <gst/gst.h>
-#include <gst/pbutils/pbutils.h>
 
 #include "sushi-enum-types.h"
 #include "sushi-sound-player.h"
@@ -48,7 +47,6 @@ enum
   PROP_PROGRESS,
   PROP_DURATION,
   PROP_URI,
-  PROP_TAGLIST
 };
 
 struct _SushiSoundPlayerPrivate
@@ -64,9 +62,6 @@ struct _SushiSoundPlayerPrivate
   gdouble                duration;
   guint                  tick_timeout_id;
 
-  GstDiscoverer         *discoverer;
-  GstTagList            *taglist;
-
   guint                  in_seek : 1;
 };
 
@@ -91,76 +86,6 @@ sushi_sound_player_set_state (SushiSoundPlayer      *player,
   g_object_notify (G_OBJECT (player), "state");
 }
 
-
-static void
-sushi_sound_player_destroy_discoverer (SushiSoundPlayer *player)
-{
-  SushiSoundPlayerPrivate *priv = SUSHI_SOUND_PLAYER_GET_PRIVATE (player);
-
-  if (priv->discoverer == NULL)
-    return;
-
-  if (priv->taglist != NULL) {
-    gst_tag_list_free (priv->taglist);
-    priv->taglist = NULL;
-  }
-
-  gst_discoverer_stop (priv->discoverer);
-  gst_object_unref (priv->discoverer);
-  priv->discoverer = NULL;
-
-  g_object_notify (G_OBJECT (player), "taglist");
-
-  g_clear_object (&priv->taglist);
-}
-
-static void
-discoverer_discovered_cb (GstDiscoverer *disco,
-                          GstDiscovererInfo *info,
-                          GError *error,
-                          gpointer user_data)
-{
-  SushiSoundPlayer *player = user_data;
-  SushiSoundPlayerPrivate *priv;
-  const GstTagList *taglist;
-
-  priv = SUSHI_SOUND_PLAYER_GET_PRIVATE (player);
-
-  if (error != NULL)
-    return;
-
-  taglist = gst_discoverer_info_get_tags (info);
-
-  if (taglist)
-    {
-      priv->taglist = gst_tag_list_copy (taglist);
-      g_object_notify (G_OBJECT (player), "taglist");
-    }
-}
-
-static gboolean
-sushi_sound_player_ensure_discoverer (SushiSoundPlayer *player)
-{
-  SushiSoundPlayerPrivate *priv;
-  priv = SUSHI_SOUND_PLAYER_GET_PRIVATE (player);
-
-  if (priv->discoverer)
-    return TRUE;
-
-  priv->discoverer = gst_discoverer_new (GST_SECOND * 60,
-                                         NULL);
-
-  if (priv->discoverer == NULL)
-    return FALSE;
-
-  g_signal_connect (priv->discoverer, "discovered",
-                    G_CALLBACK (discoverer_discovered_cb), player);
-  gst_discoverer_start (priv->discoverer);
-  gst_discoverer_discover_uri_async (priv->discoverer, priv->uri);
-
-  return TRUE;
-}
-
 static void
 sushi_sound_player_set_uri (SushiSoundPlayer *player,
                             const char    *uri)
@@ -180,11 +105,7 @@ sushi_sound_player_set_uri (SushiSoundPlayer *player,
   if (priv->pipeline)
     sushi_sound_player_destroy_pipeline (player);
 
-  if (priv->discoverer)
-    sushi_sound_player_destroy_discoverer (player);
-
   sushi_sound_player_ensure_pipeline (player);
-  sushi_sound_player_ensure_discoverer (player);
 
   g_object_notify (G_OBJECT (player), "uri");
 }
@@ -638,7 +559,6 @@ static void
 sushi_sound_player_dispose (GObject *gobject)
 {
   sushi_sound_player_destroy_pipeline (SUSHI_SOUND_PLAYER (gobject));
-  sushi_sound_player_destroy_discoverer (SUSHI_SOUND_PLAYER (gobject));
 
   G_OBJECT_CLASS (sushi_sound_player_parent_class)->dispose (gobject);
 }
@@ -679,10 +599,6 @@ sushi_sound_player_get_property (GObject    *gobject,
       g_value_set_string (value, priv->uri);
       break;
 
-    case PROP_TAGLIST:
-      g_value_set_boxed (value, priv->taglist);
-      break;
-
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
       break;
@@ -782,15 +698,6 @@ sushi_sound_player_class_init (SushiSoundPlayerClass *klass)
                                        NULL,
                                        G_PARAM_READWRITE |
                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property
-    (gobject_class,
-     PROP_TAGLIST,
-     g_param_spec_boxed ("taglist",
-                         "Taglist",
-                         "Taglist for the current URI",
-                         GST_TYPE_TAG_LIST,
-                         G_PARAM_READABLE));
 }
 
 static void
diff --git a/src/ui/main.js b/src/ui/main.js
index 91e8174..88a4622 100644
--- a/src/ui/main.js
+++ b/src/ui/main.js
@@ -34,6 +34,7 @@ pkg.require({
     GLib: '2.0',
     GObject: '2.0',
     Gst: '1.0',
+    GstPbutils: '1.0',
     GstTag: '1.0',
     Gtk: '3.0',
     GtkSource: '4',
diff --git a/src/viewers/audio.js b/src/viewers/audio.js
index 1044048..f6fee26 100644
--- a/src/viewers/audio.js
+++ b/src/viewers/audio.js
@@ -23,7 +23,7 @@
  *
  */
 
-const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gst, GstTag, Gtk, Soup, Sushi} = imports.gi;
+const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gst, GstPbutils, GstTag, Gtk, Soup, Sushi} = imports.gi;
 
 const Constants = imports.util.constants;
 const Renderer = imports.ui.renderer;
@@ -234,6 +234,7 @@ var Klass = GObject.registerClass({
         super._init({ orientation: Gtk.Orientation.HORIZONTAL,
                       spacing: 6 });
 
+        this._discoverAudioTags(file);
         this._createPlayer(file);
 
         this._image = new Gtk.Image({ icon_name: 'media-optical-symbolic',
@@ -263,6 +264,22 @@ var Klass = GObject.registerClass({
         this.isReady();
     }
 
+    _discoverAudioTags(file) {
+        this._discoverer = new GstPbutils.Discoverer();
+        this._discoverer.connect('discovered', (d, info, err) => {
+            if (err) {
+                logError(err, `Unable to discover audio tags for ${file.get_uri()}`);
+                return;
+            }
+
+            let tags = info.get_tags();
+            if (tags)
+                this._updateFromTags(tags);
+        });
+        this._discoverer.start();
+        this._discoverer.discover_uri_async(file.get_uri());
+    }
+
     _createPlayer(file) {
         this._playerNotifies = [];
 
@@ -275,11 +292,12 @@ var Klass = GObject.registerClass({
             this._player.connect('notify::duration', this._onPlayerDurationChanged.bind(this)));
         this._playerNotifies.push(
             this._player.connect('notify::state', this._onPlayerStateChanged.bind(this)));
-        this._playerNotifies.push(
-            this._player.connect('notify::taglist', this._onTagListChanged.bind(this)));
     }
 
     _onDestroy() {
+        this._discoverer.stop();
+        this._discoverer = null;
+
         this._playerNotifies.forEach((id) => this._player.disconnect(id));
         this._playerNotifies = [];
         this._player.playing = false;
@@ -314,8 +332,7 @@ var Klass = GObject.registerClass({
         this._setCover(cover);
     }
 
-    _onTagListChanged() {
-        let tags = this._player.taglist;
+    _updateFromTags(tags) {
         let albumName = tags.get_string('album')[1];
         let artistName = tags.get_string('artist')[1];
         let titleName = tags.get_string('title')[1];


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