audio: Refactor message handling to delegate work more.

This should allow for easier testing since we can send the parsed result of the
messages for all message types.
This commit is contained in:
Thomas Adamcik 2014-06-20 23:37:55 +02:00
parent e7d3837840
commit e0e6e390bd

View File

@ -294,31 +294,17 @@ class Audio(pykka.ThreadingActor):
self._disconnect(bus, 'message') self._disconnect(bus, 'message')
bus.remove_signal_watch() bus.remove_signal_watch()
def _on_message(self, bus, message): def _on_message(self, bus, msg):
if (message.type == gst.MESSAGE_STATE_CHANGED if msg.type == gst.MESSAGE_STATE_CHANGED and msg.src == self._playbin:
and message.src == self._playbin): self._on_playbin_state_changed(*msg.parse_state_changed())
old_state, new_state, pending_state = message.parse_state_changed() elif msg.type == gst.MESSAGE_BUFFERING:
self._on_playbin_state_changed(old_state, new_state, pending_state) self._on_buffering(msg.parse_buffering())
elif message.type == gst.MESSAGE_BUFFERING: elif msg.type == gst.MESSAGE_EOS:
percent = message.parse_buffering()
if percent < 10:
self._playbin.set_state(gst.STATE_PAUSED)
if percent == 100 and self._target_state == gst.STATE_PLAYING:
self._playbin.set_state(gst.STATE_PLAYING)
logger.debug('Buffer %d%% full', percent)
elif message.type == gst.MESSAGE_EOS:
self._on_end_of_stream() self._on_end_of_stream()
elif message.type == gst.MESSAGE_ERROR: elif msg.type == gst.MESSAGE_ERROR:
error, debug = message.parse_error() self._on_error(*msg.parse_error())
logger.error( elif msg.type == gst.MESSAGE_WARNING:
'%s Debug message: %s', self._on_warning(*msg.parse_warning())
str(error).decode('utf-8'), debug.decode('utf-8') or 'None')
self.stop_playback()
elif message.type == gst.MESSAGE_WARNING:
error, debug = message.parse_warning()
logger.warning(
'%s Debug message: %s',
str(error).decode('utf-8'), debug.decode('utf-8') or 'None')
def _on_playbin_state_changed(self, old_state, new_state, pending_state): def _on_playbin_state_changed(self, old_state, new_state, pending_state):
if new_state == gst.STATE_READY and pending_state == gst.STATE_NULL: if new_state == gst.STATE_READY and pending_state == gst.STATE_NULL:
@ -349,10 +335,29 @@ class Audio(pykka.ThreadingActor):
AudioListener.send( AudioListener.send(
'state_changed', old_state=old_state, new_state=new_state) 'state_changed', old_state=old_state, new_state=new_state)
def _on_buffering(self, percent):
if percent < 10:
self._playbin.set_state(gst.STATE_PAUSED)
if percent == 100 and self._target_state == gst.STATE_PLAYING:
self._playbin.set_state(gst.STATE_PLAYING)
logger.debug('Buffer %d%% full', percent)
def _on_end_of_stream(self): def _on_end_of_stream(self):
logger.debug('Triggering reached_end_of_stream event') logger.debug('Triggering reached_end_of_stream event')
AudioListener.send('reached_end_of_stream') AudioListener.send('reached_end_of_stream')
def _on_error(self, error, debug):
logger.error(
'%s Debug message: %s',
str(error).decode('utf-8'), debug.decode('utf-8') or 'None')
self.stop_playback()
def _on_warning(self, error, debug):
logger.warning(
'%s Debug message: %s',
str(error).decode('utf-8'), debug.decode('utf-8') or 'None')
def set_uri(self, uri): def set_uri(self, uri):
""" """
Set URI of audio to be played. Set URI of audio to be played.