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.
This commit is contained in:
Thomas Adamcik 2013-01-03 15:35:52 +01:00
parent 8d2656f75c
commit 88398ea355
5 changed files with 42 additions and 18 deletions

View File

@ -4,3 +4,5 @@ from __future__ import unicode_literals
from .actor import Audio from .actor import Audio
from .listener import AudioListener from .listener import AudioListener
from .constants import PlaybackState from .constants import PlaybackState
from .utils import (calculate_duration, create_buffer, millisecond_to_clocktime,
supported_uri_schemes)

View File

@ -5,6 +5,33 @@ pygst.require('0.10')
import gst 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): def supported_uri_schemes(uri_schemes):
"""Determine which URIs we can actually support from provided whitelist. """Determine which URIs we can actually support from provided whitelist.

View File

@ -1,14 +1,11 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import pygst
pygst.require('0.10')
import gst
import logging import logging
import functools import functools
from spotify import Link, SpotifyError from spotify import Link, SpotifyError
from mopidy import audio
from mopidy.backends import base from mopidy.backends import base
@ -71,5 +68,6 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider):
logger.debug('Skipping seek due to issue #300') logger.debug('Skipping seek due to issue #300')
return 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) self.backend.spotify.session.seek(time_position)

View File

@ -1,9 +1,5 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import pygst
pygst.require('0.10')
import gst
import logging import logging
import os import os
import threading import threading
@ -122,12 +118,13 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager):
'channels': channels, 'channels': channels,
} }
buffer_ = gst.Buffer(bytes(frames)) duration = audio.calculate_duration(num_frames, sample_rate)
buffer_.set_caps(gst.caps_from_string(capabilites)) buffer_ = audio.create_buffer(bytes(frames),
buffer_.timestamp = self.buffer_timestamp capabilites=capabilites,
buffer_.duration = num_frames * gst.SECOND / sample_rate timestamp=self.buffer_timestamp,
duration=duration)
self.buffer_timestamp += buffer_.duration self.buffer_timestamp += duration
if self.audio.emit_data(buffer_).get(): if self.audio.emit_data(buffer_).get():
return num_frames return num_frames

View File

@ -5,8 +5,7 @@ import urlparse
import pykka import pykka
from mopidy import settings from mopidy import audio as audio_lib, settings
from mopidy.audio import utils
from mopidy.backends import base from mopidy.backends import base
from mopidy.models import Track from mopidy.models import Track
@ -18,10 +17,11 @@ class StreamBackend(pykka.ThreadingActor, base.Backend):
super(StreamBackend, self).__init__() super(StreamBackend, self).__init__()
self.library = StreamLibraryProvider(backend=self) 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.playlists = None
self.uri_schemes = utils.supported_uri_schemes( self.uri_schemes = audio_lib.supported_uri_schemes(
settings.STREAM_PROTOCOLS) settings.STREAM_PROTOCOLS)