diff --git a/mopidy/audio/__init__.py b/mopidy/audio/__init__.py index 7cf1dcee..5adb333c 100644 --- a/mopidy/audio/__init__.py +++ b/mopidy/audio/__init__.py @@ -4,3 +4,5 @@ from __future__ import unicode_literals from .actor import Audio from .listener import AudioListener from .constants import PlaybackState +from .utils import (calculate_duration, create_buffer, millisecond_to_clocktime, + supported_uri_schemes) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index e9eac9f8..af80b3ab 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -5,6 +5,33 @@ pygst.require('0.10') import gst +def calculate_duration(num_samples, sample_rate): + """Determine duration of samples using a gst helper for preciese math.""" + return gst.util_uint64_scale(num_samples, gst.SECOND, sample_rate) + + +def create_buffer(data, capabilites=None, timestamp=None, duration=None): + """Create a new gstreamer buffer based on provided data. + + Mainly intended to keep gst imports out of non audio modules. + """ + buffer_ = gst.Buffer(data) + if capabilites: + if isinstance(capabilites, basestring): + capabilites = gst.caps_from_string(capabilites) + buffer_.set_caps(capabilites) + if timestamp: + buffer_.timestamp = timestamp + if duration: + buffer_.duration = duration + return buffer_ + + +def millisecond_to_clocktime(value): + """Convert a millisecond time to internal gstreamer time.""" + return value * gst.MSECOND + + def supported_uri_schemes(uri_schemes): """Determine which URIs we can actually support from provided whitelist. diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index cead01bf..36d90cac 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,14 +1,11 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import functools from spotify import Link, SpotifyError +from mopidy import audio from mopidy.backends import base @@ -71,5 +68,6 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): logger.debug('Skipping seek due to issue #300') return - self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND + self.backend.spotify.buffer_timestamp = audio.millisecond_to_clocktime( + time_position) self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index d372bfa4..7f71dc76 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -1,9 +1,5 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import os import threading @@ -122,12 +118,13 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): 'channels': channels, } - buffer_ = gst.Buffer(bytes(frames)) - buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp - buffer_.duration = num_frames * gst.SECOND / sample_rate + duration = audio.calculate_duration(num_frames, sample_rate) + buffer_ = audio.create_buffer(bytes(frames), + capabilites=capabilites, + timestamp=self.buffer_timestamp, + duration=duration) - self.buffer_timestamp += buffer_.duration + self.buffer_timestamp += duration if self.audio.emit_data(buffer_).get(): return num_frames diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index b7070454..99b32195 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -5,8 +5,7 @@ import urlparse import pykka -from mopidy import settings -from mopidy.audio import utils +from mopidy import audio as audio_lib, settings from mopidy.backends import base from mopidy.models import Track @@ -18,10 +17,11 @@ class StreamBackend(pykka.ThreadingActor, base.Backend): super(StreamBackend, self).__init__() self.library = StreamLibraryProvider(backend=self) - self.playback = base.BasePlaybackProvider(audio=audio, backend=self) + self.playback = base.BasePlaybackProvider(audio=audio, + backend=self) self.playlists = None - self.uri_schemes = utils.supported_uri_schemes( + self.uri_schemes = audio_lib.supported_uri_schemes( settings.STREAM_PROTOCOLS)