=== modified file 'elisa-plugins/elisa/plugins/poblesec/dbus_player.py' --- elisa-plugins/elisa/plugins/poblesec/dbus_player.py 2009-05-14 14:35:55 +0000 +++ elisa-plugins/elisa/plugins/poblesec/dbus_player.py 2009-08-29 16:21:35 +0000 @@ -221,7 +221,7 @@ interface = 'com.fluendo.Elisa.Plugins.Poblesec.AudioPlayer' # FIXME: what is this weird 'PLAY' ? - status = ['stopped', 'playing', 'paused', 'buffering'] + status = ['stopped', 'playing', 'paused', 'buffering', 'prerolling'] def __init__(self, poblesec_controller, *args, **kw): dbus.service.Object.__init__(self, *args, **kw) === modified file 'elisa-plugins/elisa/plugins/poblesec/player_video.py' --- elisa-plugins/elisa/plugins/poblesec/player_video.py 2009-08-26 09:42:22 +0000 +++ elisa-plugins/elisa/plugins/poblesec/player_video.py 2009-08-31 20:19:08 +0000 @@ -432,6 +432,7 @@ PLAYING = 1 PAUSED = 2 BUFFERING = 3 + PREROLLING = 4 __gsignals__ = {'status-changed': (gobject.SIGNAL_RUN_LAST, @@ -492,6 +493,7 @@ self.pipeline.set_property('video-sink', self.pgm_sink) self.status = self.STOPPED + self.target_status = self.STOPPED self.last_error = None self.filename = None self.image = None @@ -506,6 +508,7 @@ self.set_playlist(PlaylistModel()) self._video_size = None + self._cbuffering = -1 # These are used to keep track of what interesting streams are # available @@ -527,6 +530,7 @@ pbus.connect('message::buffering', self._message_buffering_cb) pbus.connect('message::element', self._message_element_cb) pbus.connect('message::tag', self._message_tag_cb) + pbus.connect('message::clock-lost', self._message_clock_lost_cb) pbus.add_signal_watch() @@ -579,60 +583,69 @@ def _message_eos_cb(self, bus, message): self.pipeline.set_state(gst.STATE_NULL) self.status = self.STOPPED + self.target_status = self.STOPPED self.emit('status-changed', self.status) self.play_next() def _message_buffering_cb(self, bus, message): - if self.status == self.BUFFERING: - # yet another buffering message. ignore it - return - self.status = self.BUFFERING - self.emit('status-changed', self.status) + percent = message.parse_buffering() + + if math.floor(percent/5) > self._cbuffering: + self._cbuffering = math.floor(percent/5) + self.info("buffering %s" % percent) + + if percent == 100: + if self.target_status == self.PLAYING: + self.info("buffering done going to play") + self.status = self.target_status + self.pipeline.set_state(gst.STATE_PLAYING) + self.emit('status-changed', self.status) + self._cbuffering = -1 + elif self.status != self.BUFFERING: + if self.status == self.PLAYING: + self.pipeline.set_state(gst.STATE_PAUSED) + + self.status = self.BUFFERING + self.emit('status-changed', self.status) def _message_error_cb(self, bus, message): err, msg = message.parse_error() + code = message.structure['gerror'].code self.last_error = (err, msg) self.warning("Gstreamer %s:%s" % (err, msg)) self.pipeline.set_state(gst.STATE_NULL) - code = message.structure['gerror'].code + self.status = self.STOPPED + self.target_status = self.status + self.emit('status-changed', self.status) + if code == gst.STREAM_ERROR_CODEC_NOT_FOUND: self.emit('player-codec-error') else: - self.status = self.STOPPED - self.emit('status-changed', self.status) - if code != gst.STREAM_ERROR_FAILED: - self.emit('player-unknown-error', err) - else: - self.emit('player-codec-error') + self.emit('player-unknown-error', err) + def _message_clock_lost_cb(self, bus, message): + self.debug("clock-lost message received") + self.pipeline.set_state(gst.STATE_PAUSED) + self.pipeline.set_state(gst.STATE_PLAYING) + def _message_state_changed_cb(self, bus, message): if message.src != self.pipeline: return old_state, new_state, pending = message.parse_state_changed() - - if new_state == gst.STATE_READY and old_state == gst.STATE_NULL: - # pipeline is prerolling, we handle this as buffering - self.status = self.BUFFERING - self.emit('status-changed', self.status) - - elif new_state == gst.STATE_PLAYING: + self.info ("old %s current %s pending %s status %s target status %s" % \ + (old_state, new_state, pending, self.status, self.target_status)) + if new_state == gst.STATE_PLAYING: if self.status != self.PLAYING: self.status = self.PLAYING self.emit('status-changed', self.status) elif new_state == gst.STATE_PAUSED: - if old_state == gst.STATE_READY: - # pipeline is still prerolling, we want to continue to - # handle this as buffering - self.status = self.BUFFERING - self.emit('status-changed', self.status) - - elif self.status != self.PAUSED: - self.status = self.PAUSED - self.emit('status-changed', self.status) - elif self.status != self.STOPPED: - self.status = self.STOPPED - self.emit('status-changed', self.status) + if self.status != self.BUFFERING: + if self.target_status == self.PLAYING: + self.pipeline.set_state(gst.STATE_PLAYING) + else: + self.status = self.PAUSED + self.emit('status-changed', self.status) def _message_element_cb(self, bus, message): if pbutils.is_missing_plugin_message(message): @@ -642,6 +655,7 @@ decoder = pbutils.get_decoder_description(mimetype) self.emit('player-missing-decoder', mimetype, decoder) elif message.structure.get_name() == 'redirect': + self.info("redirect") # we got a new location for current uri. Only the filename # of the uri is concerned. So we build a new uri with # updated filename and reset the pipeline state. @@ -822,12 +836,12 @@ self.pipeline.set_property('audio-sink', self.audio_sink) def stop(self): - current = self.pipeline.get_state(0)[1] self.pipeline.set_state(gst.STATE_NULL) # when setting the state to gst.STATE_NULL the pipeline doesn't emit a # "message::state-changed" signal. - if current != gst.STATE_NULL: + if self.status != self.STOPPED: self.status = self.STOPPED + self.target_status = self.status self.emit('status-changed', self.status) def do_status_changed(self, value): @@ -837,9 +851,11 @@ def pause(self): if self.playlist.current_playable_model.allow_pause: + self.target_status = self.PAUSED self.pipeline.set_state(gst.STATE_PAUSED) def play(self): + self.target_status = self.PLAYING model = self.playlist.current_playable_model if model != None: if self.status == self.STOPPED: @@ -855,11 +871,12 @@ def _do_pipeline_play(self): current = self.pipeline.get_state(0)[1] - if current != gst.STATE_PLAYING: - if current != gst.STATE_PAUSED: - self.status = self.BUFFERING - self.emit('status-changed', self.status) + if current == gst.STATE_PAUSED: self.pipeline.set_state(gst.STATE_PLAYING) + elif current != gst.STATE_PLAYING : + self.status = self.PREROLLING + self.emit('status-changed', self.status) + self.pipeline.set_state(gst.STATE_PAUSED) def get_position(self): try: @@ -1318,7 +1335,7 @@ osd_details.details.label = "%s %s" % (duration_in_min, _('min')) # show buffering even if focus is not set - if status == player.BUFFERING: + if status == player.BUFFERING or status == player.PREROLLING: pbc = self.player_osd.status.status_display_details.progress_bars pbc.set_visible_bar(BARS.BUFFERING_BAR) # during buffering, we want to show the cover art we also