From 50e8ff04b3fe6718e394567dd785fba58ec20768 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 23 Dec 2012 12:38:37 +0100 Subject: [PATCH] spotify: Only push audio data when GStreamer wants more --- mopidy/backends/spotify/playback.py | 23 +++++++++++++++++++++- mopidy/backends/spotify/session_manager.py | 5 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d80ef543..9855e124 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -11,6 +11,16 @@ from mopidy.backends import base logger = logging.getLogger('mopidy.backends.spotify') +def need_data_callback(spotify_backend, length_hint): + logger.debug('need_data_callback(%d) called', length_hint) + spotify_backend.playback.on_need_data(length_hint) + + +def enough_data_callback(spotify_backend): + logger.debug('enough_data_callback() called') + spotify_backend.playback.on_enough_data() + + def seek_data_callback(spotify_backend, time_position): logger.debug('seek_data_callback(%d) called', time_position) spotify_backend.playback.on_seek_data(time_position) @@ -31,7 +41,10 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.play(1) self.audio.prepare_change() - self.audio.set_appsrc(seek_data=seek_data_callback_bound) + self.audio.set_appsrc( + need_data=None, + enough_data=None, + seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) @@ -44,6 +57,14 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.play(0) return super(SpotifyPlaybackProvider, self).stop() + def on_need_data(self, length_hint): + logger.debug('playback.on_need_data(%d) called', length_hint) + self.backend.spotify.push_audio_data = True + + def on_enough_data(self): + logger.debug('playback.on_enough_data() called') + self.backend.spotify.push_audio_data = False + def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) self.backend.spotify.next_buffer_timestamp = time_position diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 0eed9939..a9c0884e 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,6 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() + self.push_audio_data = True self.next_buffer_timestamp = None self.container_manager = None @@ -107,6 +108,10 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): """Callback used by pyspotify""" # pylint: disable = R0913 # Too many arguments (8/5) + + if not self.push_audio_data: + return 0 + assert sample_type == 0, 'Expects 16-bit signed integer samples' capabilites = """ audio/x-raw-int,