Loading src/application/player.vala +30 −26 Original line number Original line Diff line number Diff line Loading @@ -24,21 +24,17 @@ namespace MLM { public class Player : Media { public class Player : Media { public enum Status { public signal void state_changed(Gst.State state); RESET, PLAYING, PAUSED; } public signal void status_changed(Player.Status status); public Gst.State state { get { return obtain_state(); } } private Gst.State last_state; public Player(string filename) { public Player(string filename) { base(); base(); var src = pipe.get_by_name("src"); var src = pipe.get_by_name("src"); src.set_property("location", filename); src.set_property("location", filename); pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); last_state = Gst.State.PAUSED; } } protected override void set_pipeline() { protected override void set_pipeline() { Loading @@ -49,7 +45,7 @@ namespace MLM { "decodebin ! " + "decodebin ! " + "autoaudiosink"); "autoaudiosink"); } catch (GLib.Error e) { } catch (GLib.Error e) { stderr.printf("There was an error while creating the play pipeline.\n"); stderr.printf("Error while creating the play pipeline.\n"); } } } } Loading @@ -58,27 +54,25 @@ namespace MLM { case Gst.MessageType.EOS: case Gst.MessageType.EOS: pipe.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0); pipe.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0); pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); status_changed(Status.RESET); break; break; case Gst.MessageType.STATE_CHANGED: case Gst.MessageType.STATE_CHANGED: var state = Gst.State.NULL; var new_state = Gst.State.NULL; var pending = Gst.State.NULL; var pending = Gst.State.NULL; pipe.get_state(out state, out pending, 100); pipe.get_state(out new_state, out pending, 100); switch (state) { if (last_state != new_state) { case Gst.State.VOID_PENDING: state_changed(new_state); break; last_state = new_state; case Gst.State.NULL: } break; if (new_state == Gst.State.PAUSED && case Gst.State.READY: pending == Gst.State.VOID_PENDING) { working = false; break; case Gst.State.PAUSED: working = false; working = false; break; } else if (new_state == Gst.State.PLAYING && case Gst.State.PLAYING: pending == Gst.State.VOID_PENDING) { status_changed(Status.PLAYING); working = true; working = true; break; } else if (new_state == Gst.State.READY && pending == Gst.State.VOID_PENDING) { pipe.set_state(Gst.State.NULL); working = false; } } break; break; } } Loading @@ -90,7 +84,10 @@ namespace MLM { public void pause() { public void pause() { pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); working = false; } public void finish() { pipe.set_state(Gst.State.READY); } } public bool seek(double percentage) { public bool seek(double percentage) { Loading @@ -105,5 +102,12 @@ namespace MLM { nsecs); nsecs); return true; return true; } } private Gst.State obtain_state() { var new_state = Gst.State.NULL; var pending = Gst.State.NULL; pipe.get_state(out new_state, out pending, 100); return new_state; } } } } } Loading
src/application/player.vala +30 −26 Original line number Original line Diff line number Diff line Loading @@ -24,21 +24,17 @@ namespace MLM { public class Player : Media { public class Player : Media { public enum Status { public signal void state_changed(Gst.State state); RESET, PLAYING, PAUSED; } public signal void status_changed(Player.Status status); public Gst.State state { get { return obtain_state(); } } private Gst.State last_state; public Player(string filename) { public Player(string filename) { base(); base(); var src = pipe.get_by_name("src"); var src = pipe.get_by_name("src"); src.set_property("location", filename); src.set_property("location", filename); pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); last_state = Gst.State.PAUSED; } } protected override void set_pipeline() { protected override void set_pipeline() { Loading @@ -49,7 +45,7 @@ namespace MLM { "decodebin ! " + "decodebin ! " + "autoaudiosink"); "autoaudiosink"); } catch (GLib.Error e) { } catch (GLib.Error e) { stderr.printf("There was an error while creating the play pipeline.\n"); stderr.printf("Error while creating the play pipeline.\n"); } } } } Loading @@ -58,27 +54,25 @@ namespace MLM { case Gst.MessageType.EOS: case Gst.MessageType.EOS: pipe.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0); pipe.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0); pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); status_changed(Status.RESET); break; break; case Gst.MessageType.STATE_CHANGED: case Gst.MessageType.STATE_CHANGED: var state = Gst.State.NULL; var new_state = Gst.State.NULL; var pending = Gst.State.NULL; var pending = Gst.State.NULL; pipe.get_state(out state, out pending, 100); pipe.get_state(out new_state, out pending, 100); switch (state) { if (last_state != new_state) { case Gst.State.VOID_PENDING: state_changed(new_state); break; last_state = new_state; case Gst.State.NULL: } break; if (new_state == Gst.State.PAUSED && case Gst.State.READY: pending == Gst.State.VOID_PENDING) { working = false; break; case Gst.State.PAUSED: working = false; working = false; break; } else if (new_state == Gst.State.PLAYING && case Gst.State.PLAYING: pending == Gst.State.VOID_PENDING) { status_changed(Status.PLAYING); working = true; working = true; break; } else if (new_state == Gst.State.READY && pending == Gst.State.VOID_PENDING) { pipe.set_state(Gst.State.NULL); working = false; } } break; break; } } Loading @@ -90,7 +84,10 @@ namespace MLM { public void pause() { public void pause() { pipe.set_state(Gst.State.PAUSED); pipe.set_state(Gst.State.PAUSED); working = false; } public void finish() { pipe.set_state(Gst.State.READY); } } public bool seek(double percentage) { public bool seek(double percentage) { Loading @@ -105,5 +102,12 @@ namespace MLM { nsecs); nsecs); return true; return true; } } private Gst.State obtain_state() { var new_state = Gst.State.NULL; var pending = Gst.State.NULL; pipe.get_state(out new_state, out pending, 100); return new_state; } } } } }