X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fplayer.py;h=1b1494e4c3ae714b8a5fc72d8bac12a3d160a9ac;hb=931dd9aff7465689840d1699edb02590339c5886;hp=9288470eb394ce1e44c4f287892736c86439fc7e;hpb=ae0d1937085329138f391a9c9d70e4be85d59251;p=watersofshiloah diff --git a/src/player.py b/src/player.py index 9288470..1b1494e 100644 --- a/src/player.py +++ b/src/player.py @@ -4,6 +4,8 @@ import gobject import util.misc as misc_utils import stream +import stream_index +import call_monitor _moduleLogger = logging.getLogger(__name__) @@ -37,20 +39,18 @@ class Player(gobject.GObject): gobject.GObject.__init__(self) self._index = index self._node = None + self._nextSearch = None + + self._calls = call_monitor.CallMonitor() + self._calls.connect("call_start", self._on_call_start) + self._stream = stream.GSTStream() self._stream.connect("state-change", self._on_stream_state) self._stream.connect("eof", self._on_stream_eof) self._stream.connect("error", self._on_stream_error) def set_piece_by_node(self, node): - assert node is None or node.is_leaf(), node - if self._node is node: - return - self._node = node - if self._node is not None: - self._stream.set_file(self._node.uri) - _moduleLogger.info("New node %r" % self._node) - self.emit("title_change", self._node) + self._set_piece_by_node(node) @property def node(self): @@ -82,6 +82,8 @@ class Player(gobject.GObject): _moduleLogger.info("play") self._stream.play() + self._calls.start() + def pause(self): _moduleLogger.info("pause") self._stream.pause() @@ -91,11 +93,61 @@ class Player(gobject.GObject): self._stream.stop() self.set_piece_by_node(None) - def back(self): - _moduleLogger.info("back") + self._calls.stop() - def next(self): + def back(self, forcePlay = False): + _moduleLogger.info("back") + assert self._nextSearch is None + self._nextSearch = stream_index.AsyncWalker(stream_index.get_previous) + self._nextSearch.start( + self.node, + lambda node: self._on_next_node(node, forcePlay), + self._on_node_search_error + ) + + def next(self, forcePlay = False): _moduleLogger.info("next") + assert self._nextSearch is None + self._nextSearch = stream_index.AsyncWalker(stream_index.get_next) + self._nextSearch.start( + self.node, + lambda node: self._on_next_node(node, forcePlay), + self._on_node_search_error + ) + + def seek(self, percent): + target = percent * self._stream.duration + self._stream.seek_time(target) + + @property + def percent_elapsed(self): + percent = float(self._stream.elapsed) / float(self._stream.duration) + return percent + + def _set_piece_by_node(self, node): + assert node is None or node.is_leaf(), node + if self._node is node: + _moduleLogger.info("Already set to %r" % node) + return + self._node = node + if self._node is not None: + self._stream.set_file(self._node.uri) + _moduleLogger.info("New node %r" % self._node) + self.emit("title_change", self._node) + + @misc_utils.log_exception(_moduleLogger) + def _on_next_node(self, node, forcePlay): + self._nextSearch = None + + restart = self.state == self.STATE_PLAY + self._set_piece_by_node(node) + if restart or forcePlay: + self.play() + + @misc_utils.log_exception(_moduleLogger) + def _on_node_search_error(self, e): + self._nextSearch = None + self.emit("error", e, "") @misc_utils.log_exception(_moduleLogger) def _on_stream_state(self, s, state): @@ -105,12 +157,17 @@ class Player(gobject.GObject): @misc_utils.log_exception(_moduleLogger) def _on_stream_eof(self, s, uri): _moduleLogger.info("EOF %s" % uri) - self.next() + self.next(forcePlay = True) @misc_utils.log_exception(_moduleLogger) def _on_stream_error(self, s, error, debug): _moduleLogger.info("Error %s %s" % (error, debug)) self.emit("error", error, debug) + @misc_utils.log_exception(_moduleLogger) + def _on_call_start(self, monitor): + _moduleLogger.info("Call in progress, pausing") + self.pause() + gobject.type_register(Player)