6 import util.misc as misc_utils
9 _moduleLogger = logging.getLogger(__name__)
12 class Stream(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),
39 gobject.GObject.__init__(self)
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()
71 if self.state != self.STATE_STOP:
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):
119 self._player.seek_simple(self._timeFormat, self._seekFlag, ns)
121 def _invalidate_cache(self):
125 def _translate_state(self, gstState):
127 gst.STATE_NULL: self.STATE_STOP,
128 gst.STATE_PAUSED: self.STATE_PAUSE,
129 gst.STATE_PLAYING: self.STATE_PLAY,
130 }.get(gstState, self.STATE_STOP)
132 @misc_utils.log_exception(_moduleLogger)
133 def _on_message(self, bus, message):
135 if t == gst.MESSAGE_EOS:
136 self._player.set_state(gst.STATE_NULL)
137 self.emit("eof", self._uri)
138 elif t == gst.MESSAGE_ERROR:
139 self._player.set_state(gst.STATE_NULL)
140 err, debug = message.parse_error()
141 _moduleLogger.error("Error: %s, (%s)" % (err, debug))
142 self.emit("error", err, debug)
145 gobject.type_register(Stream)