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 .listener import AudioListener
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
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.

View File

@ -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)

View File

@ -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

View File

@ -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)