vidi/Player.py: use per message callbacks
[vidi-player.git] / vidi / Player.py
index bd826bc..d2eacef 100755 (executable)
@@ -30,9 +30,11 @@ GObject.threads_init()
 class Player(object):
     def __init__(self, pipeline):
         self.pipeline = pipeline
+
         bus = self.pipeline.get_bus()
         bus.add_signal_watch()
-        bus.connect("message", self.bus_message_cb)
+        bus.connect("message::eos", self.on_eos)
+        bus.connect('message::error', self.on_error)
 
         self.mainloop = GObject.MainLoop()
 
@@ -41,21 +43,18 @@ class Player(object):
         pipeline = Gst.parse_launch(pipeline_string)
         return Player(pipeline)
 
-    def quit(self):
-        self.mainloop.quit()
-        self.pipeline.set_state(Gst.State.NULL)
+    def on_eos(self, bus, message):
+        self.stop()
 
-    def bus_message_cb(self, unused_bus, message):
-        if message.type == Gst.MessageType.EOS:
-            self.quit()
+    def on_error(self, bus, msg):
+        (err, debug) = msg.parse_error()
+        print("Error: %s" % err)
+        self.stop()
 
     def play(self):
         self.pipeline.set_state(Gst.State.PLAYING)
+        self.mainloop.run()
 
-        try:
-            self.mainloop.run()
-        except KeyboardInterrupt:
-            self.quit()
-            return 1
-
-        return 0
+    def stop(self):
+        self.mainloop.quit()
+        self.pipeline.set_state(Gst.State.NULL)