From 88398ea355dff692c93e0a3220deeaa60ebd00a1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 15:35:52 +0100 Subject: [PATCH] Add new mopidy.audio.utils functions (fixes #301). Adds functions to create buffers, calcalute buffer durations based on number of samples and the sample rate and converting milliseconds to gst internal clock time. This also alows for the removal of all gst imports outside of mopidy.audio. --- mopidy/audio/__init__.py | 2 ++ mopidy/audio/utils.py | 27 ++++++++++++++++++++++ mopidy/backends/spotify/playback.py | 8 +++---- mopidy/backends/spotify/session_manager.py | 15 +++++------- mopidy/backends/stream/actor.py | 8 +++---- 5 files changed, 42 insertions(+), 18 deletions(-) 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)