6 import util.misc as misc_utils
9 _moduleLogger = logging.getLogger(__name__)
12 class GSTStream(gobject.GObject):
14 # @bug Advertising state changes a bit early, should watch for GStreamer state change
22 gobject.SIGNAL_RUN_LAST,
24 (gobject.TYPE_STRING, ),
27 gobject.SIGNAL_RUN_LAST,
29 (gobject.TYPE_STRING, ),
32 gobject.SIGNAL_RUN_LAST,
34 (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT),
40 gobject.GObject.__init__(self)
47 self._player = gst.element_factory_make("playbin2", "player")
48 bus = self._player.get_bus()
49 bus.add_signal_watch()
50 bus.connect("message", self._on_message)
53 self._timeFormat = gst.Format(gst.FORMAT_TIME)
54 self._seekFlag = gst.SEEK_FLAG_FLUSH
58 return self.state == self.STATE_PLAY
62 return 0 < len(self._uri)
66 state = self._player.get_state()[1]
67 return self._translate_state(state)
69 def set_file(self, uri):
71 self._invalidate_cache()
72 if self.state != self.STATE_STOP:
76 self._player.set_property("uri", uri)
79 if self.state == self.STATE_PLAY:
80 _moduleLogger.info("Already play")
82 _moduleLogger.info("Play")
83 self._player.set_state(gst.STATE_PLAYING)
84 self.emit("state-change", self.STATE_PLAY)
87 if self.state == self.STATE_PAUSE:
88 _moduleLogger.info("Already pause")
90 _moduleLogger.info("Pause")
91 self._player.set_state(gst.STATE_PAUSED)
92 self.emit("state-change", self.STATE_PAUSE)
95 if self.state == self.STATE_STOP:
96 _moduleLogger.info("Already stop")
98 self._player.set_state(gst.STATE_NULL)
99 _moduleLogger.info("Stopped")
100 self.emit("state-change", self.STATE_STOP)
105 self._elapsed = self._player.query_position(self._timeFormat, None)[0]
113 self._duration = self._player.query_duration(self._timeFormat, None)[0]
115 _moduleLogger.exception("Query failed")
116 return self._duration
118 def seek_time(self, ns):
120 self._player.seek_simple(self._timeFormat, self._seekFlag, ns)
122 def _invalidate_cache(self):
126 def _translate_state(self, gstState):
128 gst.STATE_NULL: self.STATE_STOP,
129 gst.STATE_PAUSED: self.STATE_PAUSE,
130 gst.STATE_PLAYING: self.STATE_PLAY,
131 }.get(gstState, self.STATE_STOP)
133 @misc_utils.log_exception(_moduleLogger)
134 def _on_message(self, bus, message):
136 if t == gst.MESSAGE_EOS:
137 self._player.set_state(gst.STATE_NULL)
138 self.emit("eof", self._uri)
139 elif t == gst.MESSAGE_ERROR:
140 self._player.set_state(gst.STATE_NULL)
141 err, debug = message.parse_error()
142 _moduleLogger.error("Error: %s, (%s)" % (err, debug))
143 self.emit("error", err, debug)
146 gobject.type_register(GSTStream)