self.volume_multiplier = 1.
self.volume_property = None
self.eos_callback = lambda: self.stop()
- postoffice.connect('settings-changed', self.on_settings_changed)
+ postoffice.connect('settings-changed', self, self.on_settings_changed)
def on_settings_changed(self, key, value):
if key == 'volume':
self._set_volume_level(value)
- #postoffice.disconnect(self.on_settings_changed)
+ #postoffice.disconnect(self)
def play_url(self, filetype, uri):
return self.STATES.get(state, 'none')
return 'none'
- def _get_position_duration(self):
+ def get_position_duration(self):
try:
pos_int = self.player.query_position(self.time_format, None)[0]
dur_int = self.player.query_duration(self.time_format, None)[0]
def play(self):
if self.player:
- log.debug("playing")
self.player.set_state(gst.STATE_PLAYING)
def pause(self):
if self.player:
self.player.set_state(gst.STATE_PAUSED)
- def stop(self):
+ def stop(self, reset = True):
if self.player:
self.player.set_state(gst.STATE_NULL)
- self.player = None
+ if reset:
+ self.player = None
def _maemo_setup_playbin2_player(self, url):
self.player = gst.parse_launch("playbin2 uri=%s" % (url,))
# Sets the right property depending on the platform of self.filesrc
if self.player is not None:
self.filesrc.set_property(self.filesrc_property, uri)
+ log.info("%s", uri)
def _on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
- log.info("End of stream")
+ log.debug("Gstreamer: End of stream")
self.eos_callback()
elif t == gst.MESSAGE_STATE_CHANGED:
if (message.src == self.player and
message.structure['new-state'] == gst.STATE_PLAYING):
- log.info("State changed to playing")
+ log.debug("gstreamer: state -> playing")
elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error()
log.critical( 'Error: %s %s', err, debug )
class Playlist(object):
def __init__(self, items = []):
+ self.radio_mode = False
+ self.radio_id = None
+ self.radio_name = None
if items is None:
items = []
for item in items:
return self.items[self._current]
return None
+ def jump_to(self, item_id):
+ for c, i in enumerate(self.items):
+ if i.ID == item_id:
+ self._current = c
+
def current_index(self):
return self._current
return len(self.items)
def __repr__(self):
- return "Playlist(%s)"%(", ".join([str(item.ID) for item in self.items]))
+ return "Playlist(%d of %s)"%(self._current, ", ".join([str(item.ID) for item in self.items]))
class Player(object):
def __init__(self):
self.backend = PlayerBackend()
self.backend.set_eos_callback(self._on_eos)
self.playlist = Playlist()
+ self.__in_end_notify = False # ugly...
+
+ def get_position_duration(self):
+ return self.backend.get_position_duration()
def play(self, playlist = None):
if playlist:
elif self.playlist is None:
self.playlist = Playlist()
if self.playlist.size():
- if self.playlist.has_next():
- entry = self.playlist.next()
+ if self.playlist.current():
+ entry = self.playlist.current()
+ self.backend.play_url('mp3', entry.mp3_url())
log.debug("playing %s", entry)
+ elif self.playlist.has_next():
+ entry = self.playlist.next()
self.backend.play_url('mp3', entry.mp3_url())
+ log.debug("playing %s", entry)
+ postoffice.notify('play', entry)
def pause(self):
self.backend.pause()
+ postoffice.notify('pause', self.playlist.current())
def stop(self):
self.backend.stop()
+ postoffice.notify('stop', self.playlist.current())
def playing(self):
return self.backend.playing()
def next(self):
if self.playlist.has_next():
- self.stop()
- self.play()
- else:
- self.stop()
+ self.backend.stop(reset=False)
+ entry = self.playlist.next()
+ self.backend.play_url('mp3', entry.mp3_url())
+ log.debug("playing %s", entry)
+ postoffice.notify('next', entry)
+ elif not self.__in_end_notify:
+ self.__in_end_notify = True
+ postoffice.notify('playlist-end', self.playlist)
+ self.__in_end_notify = False
+ # if the notification refills the playlist,
+ # we do nothing after this point so we don't
+ # mess things up
+ if not self.playlist.has_next():
+ self.stop()
def prev(self):
if self.playlist.has_prev():
+ self.backend.stop(reset=False)
entry = self.playlist.prev()
- log.debug("playing %s", entry)
self.backend.play_url('mp3', entry.mp3_url())
+ log.debug("playing %s", entry)
+ postoffice.notify('prev', entry)
def _on_eos(self):
- log.debug("EOS!")
self.next()
the_player = Player() # the player instance