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:
parent
8d2656f75c
commit
88398ea355
@ -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)
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user