Commit 56fccc98 authored by Canek Peláez's avatar Canek Peláez
Browse files

Player: Use Gstreamer states and handle change between them correctly.

parent e71c4f3f
Loading
Loading
Loading
Loading
+30 −26
Original line number Original line Diff line number Diff line
@@ -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() {
@@ -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");
            }
            }
        }
        }


@@ -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;
            }
            }
@@ -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) {
@@ -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;
       }
    }
    }
}
}