]> ToastFreeware Gitweb - gregoa/zavai.git/blobdiff - src/audio.vala
Implement looping
[gregoa/zavai.git] / src / audio.vala
index e6dba6208b60b13d5aae2f52c6ea684d19d9efc5..6352974412e2e6af066a03689ebc19c498777d2e 100644 (file)
@@ -112,6 +112,8 @@ public class Player: zavai.Resource, Object
     protected bool playing;
     protected Player slave;
     protected Player master;
+    protected bool loop;
+    protected string uri;
 
     public Player()
     {
@@ -119,6 +121,7 @@ public class Player: zavai.Resource, Object
         master = null;
         player = Gst.ElementFactory.make("playbin", null);
         playing = false;
+        loop = false;
         var bus = player.get_bus();
         bus.add_signal_watch();
         bus.message += on_message;
@@ -130,14 +133,17 @@ public class Player: zavai.Resource, Object
         slave.master = this;
     }
 
-    public void play(string uri)
+    public void play(string uri, bool loop = false)
     {
+        this.uri = uri;
+
         if (slave != null && slave.playing)
             slave.pause();
 
         player.set_property("uri", uri);
         player.set_state(master != null && master.playing ? Gst.State.PAUSED : Gst.State.PLAYING);
         playing = true;
+        this.loop = loop;
     }
 
     public void pause()
@@ -150,6 +156,12 @@ public class Player: zavai.Resource, Object
         player.set_state(Gst.State.PLAYING);
     }
 
+    public void restart()
+    {
+        player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0);
+        player.set_state(Gst.State.PLAYING);
+    }
+
     public void stop()
     {
         playing = false;
@@ -163,7 +175,12 @@ public class Player: zavai.Resource, Object
     protected void on_message(Gst.Message message)
     {
         if (message.type == Gst.MessageType.EOS)
-            stop();
+        {
+            if (loop)
+                restart();
+            else
+                stop();
+        }
     }
 
     public void shutdown()