[quadrapassel/play_music] Initial code for GStreamer music




commit 943f52306741c267bd4ea46f9a823c29bfa23b14
Author: John Ward <john johnward net>
Date:   Tue Jan 26 08:14:52 2021 +0000

    Initial code for GStreamer music

 meson.build            |  2 ++
 src/game-view.vala     | 37 ++++++++++++++++++++++
 src/meson.build        |  6 ++--
 src/stream-player.vala | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 126 insertions(+), 2 deletions(-)
---
diff --git a/meson.build b/meson.build
index 0098583..c57934d 100644
--- a/meson.build
+++ b/meson.build
@@ -23,6 +23,8 @@ pango_cairo_dependency = dependency('pangocairo')
 posix_dependency = meson.get_compiler('vala').find_library('posix')
 rsvg_dependency = dependency('librsvg-2.0', version: '>= 2.32.0')
 libm_dependency = cc.find_library('m', required : true)
+gstreamer_dependency = dependency('gstreamer-1.0', version: '>= 1.0')
+
         
 # Set gettext package name
 add_global_arguments('-DGETTEXT_PACKAGE="@0@"'.format (meson.project_name()), language: 'c')
diff --git a/src/game-view.vala b/src/game-view.vala
index 0564b01..a241ad8 100644
--- a/src/game-view.vala
+++ b/src/game-view.vala
@@ -396,6 +396,43 @@ public class GameView : GtkClutter.Embed
             warning (e.message);
         }
     }
+
+
+    /* Play Music */
+
+    private StreamPlayer streamPlayer;
+
+    public void play_game_music()
+    {   
+        if (streamPlayer == null) 
+            streamPlayer = new StreamPlayer();
+
+        streamPlayer.stop();
+
+        streamPlayer.play("play.mp3");
+    }
+
+    public void play_menu_music()
+    {   
+        if (streamPlayer == null) 
+            streamPlayer = new StreamPlayer();
+
+        streamPlayer.stop();
+
+        streamPlayer.play("menu.mp3");
+    }
+
+    public void stop_music()
+    {
+        streamPlayer.stop();
+    }
+
+
+    //  private static void _play_music (string _name, StreamPlayer streamPlayer)
+    //  {
+    //      streamPlayer.play("play.mp3");
+    //      //_controller.didUpdatePlayerState.connect( play_callback );
+    //  }
 }
 
 private class BlockActor : Clutter.Clone
diff --git a/src/meson.build b/src/meson.build
index 0ab019f..6ab8437 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -7,7 +7,8 @@ executable(meson.project_name(),
         'history.vala',
         'preview.vala',
         'quadrapassel.vala',
-        'score-dialog.vala'
+        'score-dialog.vala',
+        'stream-player.vala'
     ],
     install: true,
     c_args: [
@@ -28,6 +29,7 @@ executable(meson.project_name(),
         pango_cairo_dependency,
         posix_dependency,
         rsvg_dependency,
-        libm_dependency
+        libm_dependency,
+        gstreamer_dependency
     ]
 )
diff --git a/src/stream-player.vala b/src/stream-player.vala
new file mode 100644
index 0000000..5fc26fa
--- /dev/null
+++ b/src/stream-player.vala
@@ -0,0 +1,83 @@
+using Gst;
+
+public class StreamPlayer {
+
+    // thread to play the music
+    private MainLoop loop = new MainLoop ();
+    
+    // Player element
+    private dynamic Element player;
+    
+
+    private void foreach_tag (Gst.TagList list, string tag) {
+        switch (tag) {
+        case "title":
+            string tag_string;
+            list.get_string (tag, out tag_string);
+            stdout.printf ("tag: %s = %s\n", tag, tag_string);
+            break;
+        default:
+            break;
+        }
+    }
+
+    private bool bus_callback (Gst.Bus bus, Gst.Message message) {
+        switch (message.type) {
+        case MessageType.ERROR:
+            GLib.Error err;
+            string debug;
+            message.parse_error (out err, out debug);
+            stdout.printf ("Error: %s\n", err.message);
+            loop.quit ();
+            break;
+        case MessageType.EOS:
+            stdout.printf ("end of stream\n");
+            break;
+        case MessageType.STATE_CHANGED:
+            Gst.State oldstate;
+            Gst.State newstate;
+            Gst.State pending;
+            message.parse_state_changed (out oldstate, out newstate,
+                                         out pending);
+            stdout.printf ("state changed: %s->%s:%s\n",
+                           oldstate.to_string (), newstate.to_string (),
+                           pending.to_string ());
+            break;
+        case MessageType.TAG:
+            Gst.TagList tag_list;
+            stdout.printf ("taglist found\n");
+            message.parse_tag (out tag_list);
+            tag_list.foreach ((TagForeachFunc) foreach_tag);
+            break;
+        default:
+            break;
+        }
+
+        return true;
+    }
+
+    public void stop() {
+        player.set_state(State.READY);
+        loop.quit();
+    }
+
+    public void play (string filename) {
+
+        var path = GLib.Path.build_filename (SOUND_DIRECTORY, filename);
+        path = "file:" + path;
+        stdout.printf ("Path: %s\n", path);
+
+        player = ElementFactory.make ("playbin", "play");
+
+        //string cur_dir = GLib.Environment.get_current_dir();
+
+        player.uri = path;
+
+        Gst.Bus bus = player.get_bus ();
+        bus.add_watch (0, bus_callback);
+
+        player.set_state (State.PLAYING);
+
+        loop.run ();
+    }
+}
\ No newline at end of file


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