6 import util.misc as misc_utils
9 _moduleLogger = logging.getLogger(__name__)
12 class GSTStream(gobject.GObject):
20 gobject.SIGNAL_RUN_LAST,
22 (gobject.TYPE_STRING, ),
25 gobject.SIGNAL_RUN_LAST,
27 (gobject.TYPE_STRING, ),
30 gobject.SIGNAL_RUN_LAST,
32 (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT),
38 gobject.GObject.__init__(self)
40 self._state = self.STATE_STOP
46 self._player = gst.element_factory_make("playbin2", "player")
47 bus = self._player.get_bus()
48 bus.add_signal_watch()
49 bus.connect("message", self._on_message)
52 self._timeFormat = gst.Format(gst.FORMAT_TIME)
53 self._seekFlag = gst.SEEK_FLAG_FLUSH
57 return self.state == self.STATE_PLAY
61 return 0 < len(self._uri)
65 state = self._player.get_state()[1]
66 return self._translate_state(state)
68 def set_file(self, uri):
70 self._invalidate_cache()
75 self._player.set_property("uri", uri)
78 if self.state == self.STATE_PLAY:
79 _moduleLogger.info("Already play")
81 _moduleLogger.info("Play")
82 self._player.set_state(gst.STATE_PLAYING)
83 self.emit("state-change", self.STATE_PLAY)
86 if self.state == self.STATE_PAUSE:
87 _moduleLogger.info("Already pause")
89 _moduleLogger.info("Pause")
90 self._player.set_state(gst.STATE_PAUSED)
91 self.emit("state-change", self.STATE_PAUSE)
94 if self.state == self.STATE_STOP:
95 _moduleLogger.info("Already stop")
97 self._player.set_state(gst.STATE_NULL)
98 _moduleLogger.info("Stopped")
99 self.emit("state-change", self.STATE_STOP)
104 self._elapsed = self._player.query_position(self._timeFormat, None)[0]
112 self._duration = self._player.query_duration(self._timeFormat, None)[0]
114 _moduleLogger.exception("Query failed")
115 return self._duration
117 def seek_time(self, ns):
118 _moduleLogger.debug("Seeking to: %s", 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)