Rename mopidy.gstreamer to mopidy.audio

This commit is contained in:
Stein Magnus Jodal 2012-09-14 00:53:23 +02:00
parent 7f94464755
commit aab37302a1
11 changed files with 77 additions and 82 deletions

7
docs/modules/audio.rst Normal file
View File

@ -0,0 +1,7 @@
*************************************
:mod:`mopidy.audio` -- Audio playback
*************************************
.. automodule:: mopidy.audio
:synopsis: Audio playback through GStreamer
:members:

View File

@ -1,7 +0,0 @@
********************************************
:mod:`mopidy.gstreamer` -- GStreamer adapter
********************************************
.. automodule:: mopidy.gstreamer
:synopsis: GStreamer adapter
:members:

View File

@ -30,7 +30,7 @@ sys.path.insert(0,
from mopidy import (get_version, settings, OptionalDependencyError, from mopidy import (get_version, settings, OptionalDependencyError,
SettingsError, DATA_PATH, SETTINGS_PATH, SETTINGS_FILE) SettingsError, DATA_PATH, SETTINGS_PATH, SETTINGS_FILE)
from mopidy.gstreamer import GStreamer from mopidy.audio import Audio
from mopidy.utils import get_class from mopidy.utils import get_class
from mopidy.utils.deps import list_deps_optparse_callback from mopidy.utils.deps import list_deps_optparse_callback
from mopidy.utils.log import setup_logging from mopidy.utils.log import setup_logging
@ -51,7 +51,7 @@ def main():
setup_logging(options.verbosity_level, options.save_debug_log) setup_logging(options.verbosity_level, options.save_debug_log)
check_old_folders() check_old_folders()
setup_settings(options.interactive) setup_settings(options.interactive)
setup_gstreamer() setup_audio()
setup_backend() setup_backend()
setup_frontends() setup_frontends()
loop.run() loop.run()
@ -65,7 +65,7 @@ def main():
loop.quit() loop.quit()
stop_frontends() stop_frontends()
stop_backend() stop_backend()
stop_gstreamer() stop_audio()
stop_remaining_actors() stop_remaining_actors()
@ -117,12 +117,12 @@ def setup_settings(interactive):
sys.exit(1) sys.exit(1)
def setup_gstreamer(): def setup_audio():
GStreamer.start() Audio.start()
def stop_gstreamer(): def stop_audio():
stop_actors_by_class(GStreamer) stop_actors_by_class(Audio)
def setup_backend(): def setup_backend():
get_class(settings.BACKENDS[0]).start() get_class(settings.BACKENDS[0]).start()

View File

@ -15,10 +15,10 @@ from mopidy.utils import process
# Trigger install of gst mixer plugins # Trigger install of gst mixer plugins
from mopidy import mixers from mopidy import mixers
logger = logging.getLogger('mopidy.gstreamer') logger = logging.getLogger('mopidy.audio')
class GStreamer(ThreadingActor): class Audio(ThreadingActor):
""" """
Audio output through `GStreamer <http://gstreamer.freedesktop.org/>`_. Audio output through `GStreamer <http://gstreamer.freedesktop.org/>`_.
@ -31,7 +31,7 @@ class GStreamer(ThreadingActor):
""" """
def __init__(self): def __init__(self):
super(GStreamer, self).__init__() super(Audio, self).__init__()
self._default_caps = gst.Caps(""" self._default_caps = gst.Caps("""
audio/x-raw-int, audio/x-raw-int,

View File

@ -7,10 +7,9 @@ import shutil
from pykka.actor import ThreadingActor from pykka.actor import ThreadingActor
from pykka.registry import ActorRegistry from pykka.registry import ActorRegistry
from mopidy import core, settings, DATA_PATH from mopidy import audio, core, settings, DATA_PATH
from mopidy.backends import base from mopidy.backends import base
from mopidy.models import Playlist, Track, Album from mopidy.models import Playlist, Track, Album
from mopidy.gstreamer import GStreamer
from .translator import parse_m3u, parse_mpd_tag_cache from .translator import parse_m3u, parse_mpd_tag_cache
@ -58,13 +57,13 @@ class LocalBackend(ThreadingActor, base.Backend):
self.uri_schemes = [u'file'] self.uri_schemes = [u'file']
self.gstreamer = None self.audio = None
def on_start(self): def on_start(self):
gstreamer_refs = ActorRegistry.get_by_class(GStreamer) audio_refs = ActorRegistry.get_by_class(audio.Audio)
assert len(gstreamer_refs) == 1, \ assert len(audio_refs) == 1, \
'Expected exactly one running GStreamer.' 'Expected exactly one running Audio instance.'
self.gstreamer = gstreamer_refs[0].proxy() self.audio = audio_refs[0].proxy()
class LocalPlaybackController(core.PlaybackController): class LocalPlaybackController(core.PlaybackController):
@ -76,32 +75,32 @@ class LocalPlaybackController(core.PlaybackController):
@property @property
def time_position(self): def time_position(self):
return self.backend.gstreamer.get_position().get() return self.backend.audio.get_position().get()
class LocalPlaybackProvider(base.BasePlaybackProvider): class LocalPlaybackProvider(base.BasePlaybackProvider):
def pause(self): def pause(self):
return self.backend.gstreamer.pause_playback().get() return self.backend.audio.pause_playback().get()
def play(self, track): def play(self, track):
self.backend.gstreamer.prepare_change() self.backend.audio.prepare_change()
self.backend.gstreamer.set_uri(track.uri).get() self.backend.audio.set_uri(track.uri).get()
return self.backend.gstreamer.start_playback().get() return self.backend.audio.start_playback().get()
def resume(self): def resume(self):
return self.backend.gstreamer.start_playback().get() return self.backend.audio.start_playback().get()
def seek(self, time_position): def seek(self, time_position):
return self.backend.gstreamer.set_position(time_position).get() return self.backend.audio.set_position(time_position).get()
def stop(self): def stop(self):
return self.backend.gstreamer.stop_playback().get() return self.backend.audio.stop_playback().get()
def get_volume(self): def get_volume(self):
return self.backend.gstreamer.get_volume().get() return self.backend.audio.get_volume().get()
def set_volume(self, volume): def set_volume(self, volume):
self.backend.gstreamer.set_volume(volume).get() self.backend.audio.set_volume(volume).get()
class LocalStoredPlaylistsProvider(base.BaseStoredPlaylistsProvider): class LocalStoredPlaylistsProvider(base.BaseStoredPlaylistsProvider):

View File

@ -3,9 +3,8 @@ import logging
from pykka.actor import ThreadingActor from pykka.actor import ThreadingActor
from pykka.registry import ActorRegistry from pykka.registry import ActorRegistry
from mopidy import core, settings from mopidy import audio, core, settings
from mopidy.backends import base from mopidy.backends import base
from mopidy.gstreamer import GStreamer
logger = logging.getLogger('mopidy.backends.spotify') logger = logging.getLogger('mopidy.backends.spotify')
@ -67,7 +66,7 @@ class SpotifyBackend(ThreadingActor, base.Backend):
self.uri_schemes = [u'spotify'] self.uri_schemes = [u'spotify']
self.gstreamer = None self.audio = None
self.spotify = None self.spotify = None
# Fail early if settings are not present # Fail early if settings are not present
@ -75,10 +74,10 @@ class SpotifyBackend(ThreadingActor, base.Backend):
self.password = settings.SPOTIFY_PASSWORD self.password = settings.SPOTIFY_PASSWORD
def on_start(self): def on_start(self):
gstreamer_refs = ActorRegistry.get_by_class(GStreamer) audio_refs = ActorRegistry.get_by_class(audio.Audio)
assert len(gstreamer_refs) == 1, \ assert len(audio_refs) == 1, \
'Expected exactly one running GStreamer.' 'Expected exactly one running Audio instance.'
self.gstreamer = gstreamer_refs[0].proxy() self.audio = audio_refs[0].proxy()
logger.info(u'Mopidy uses SPOTIFY(R) CORE') logger.info(u'Mopidy uses SPOTIFY(R) CORE')
self.spotify = self._connect() self.spotify = self._connect()

View File

@ -8,7 +8,7 @@ logger = logging.getLogger('mopidy.backends.spotify.playback')
class SpotifyPlaybackProvider(BasePlaybackProvider): class SpotifyPlaybackProvider(BasePlaybackProvider):
def pause(self): def pause(self):
return self.backend.gstreamer.pause_playback() return self.backend.audio.pause_playback()
def play(self, track): def play(self, track):
if self.backend.playback.state == self.backend.playback.PLAYING: if self.backend.playback.state == self.backend.playback.PLAYING:
@ -19,10 +19,10 @@ class SpotifyPlaybackProvider(BasePlaybackProvider):
self.backend.spotify.session.load( self.backend.spotify.session.load(
Link.from_string(track.uri).as_track()) Link.from_string(track.uri).as_track())
self.backend.spotify.session.play(1) self.backend.spotify.session.play(1)
self.backend.gstreamer.prepare_change() self.backend.audio.prepare_change()
self.backend.gstreamer.set_uri('appsrc://') self.backend.audio.set_uri('appsrc://')
self.backend.gstreamer.start_playback() self.backend.audio.start_playback()
self.backend.gstreamer.set_metadata(track) self.backend.audio.set_metadata(track)
return True return True
except SpotifyError as e: except SpotifyError as e:
logger.info('Playback of %s failed: %s', track.uri, e) logger.info('Playback of %s failed: %s', track.uri, e)
@ -32,18 +32,18 @@ class SpotifyPlaybackProvider(BasePlaybackProvider):
return self.seek(self.backend.playback.time_position) return self.seek(self.backend.playback.time_position)
def seek(self, time_position): def seek(self, time_position):
self.backend.gstreamer.prepare_change() self.backend.audio.prepare_change()
self.backend.spotify.session.seek(time_position) self.backend.spotify.session.seek(time_position)
self.backend.gstreamer.start_playback() self.backend.audio.start_playback()
return True return True
def stop(self): def stop(self):
result = self.backend.gstreamer.stop_playback() result = self.backend.audio.stop_playback()
self.backend.spotify.session.play(0) self.backend.spotify.session.play(0)
return result return result
def get_volume(self): def get_volume(self):
return self.backend.gstreamer.get_volume().get() return self.backend.audio.get_volume().get()
def set_volume(self, volume): def set_volume(self, volume):
self.backend.gstreamer.set_volume(volume) self.backend.audio.set_volume(volume)

View File

@ -6,14 +6,13 @@ from spotify.manager import SpotifySessionManager as PyspotifySessionManager
from pykka.registry import ActorRegistry from pykka.registry import ActorRegistry
from mopidy import get_version, settings, CACHE_PATH from mopidy import audio, get_version, settings, CACHE_PATH
from mopidy.backends.base import Backend from mopidy.backends.base import Backend
from mopidy.backends.spotify import BITRATES from mopidy.backends.spotify import BITRATES
from mopidy.backends.spotify.container_manager import SpotifyContainerManager from mopidy.backends.spotify.container_manager import SpotifyContainerManager
from mopidy.backends.spotify.playlist_manager import SpotifyPlaylistManager from mopidy.backends.spotify.playlist_manager import SpotifyPlaylistManager
from mopidy.backends.spotify.translator import SpotifyTranslator from mopidy.backends.spotify.translator import SpotifyTranslator
from mopidy.models import Playlist from mopidy.models import Playlist
from mopidy.gstreamer import GStreamer
from mopidy.utils.process import BaseThread from mopidy.utils.process import BaseThread
logger = logging.getLogger('mopidy.backends.spotify.session_manager') logger = logging.getLogger('mopidy.backends.spotify.session_manager')
@ -34,7 +33,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager):
BaseThread.__init__(self) BaseThread.__init__(self)
self.name = 'SpotifyThread' self.name = 'SpotifyThread'
self.gstreamer = None self.audio = None
self.backend = None self.backend = None
self.connected = threading.Event() self.connected = threading.Event()
@ -50,10 +49,10 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager):
self.connect() self.connect()
def setup(self): def setup(self):
gstreamer_refs = ActorRegistry.get_by_class(GStreamer) audio_refs = ActorRegistry.get_by_class(audio.Audio)
assert len(gstreamer_refs) == 1, \ assert len(audio_refs) == 1, \
'Expected exactly one running gstreamer.' 'Expected exactly one running Audio instance.'
self.gstreamer = gstreamer_refs[0].proxy() self.audio = audio_refs[0].proxy()
backend_refs = ActorRegistry.get_by_class(Backend) backend_refs = ActorRegistry.get_by_class(Backend)
assert len(backend_refs) == 1, 'Expected exactly one running backend.' assert len(backend_refs) == 1, 'Expected exactly one running backend.'
@ -117,7 +116,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager):
'sample_rate': sample_rate, 'sample_rate': sample_rate,
'channels': channels, 'channels': channels,
} }
self.gstreamer.emit_data(capabilites, bytes(frames)) self.audio.emit_data(capabilites, bytes(frames))
return num_frames return num_frames
def play_token_lost(self, session): def play_token_lost(self, session):
@ -143,7 +142,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager):
def end_of_track(self, session): def end_of_track(self, session):
"""Callback used by pyspotify""" """Callback used by pyspotify"""
logger.debug(u'End of data stream reached') logger.debug(u'End of data stream reached')
self.gstreamer.emit_end_of_stream() self.audio.emit_end_of_stream()
def refresh_stored_playlists(self): def refresh_stored_playlists(self):
"""Refresh the stored playlists in the backend with fresh meta data """Refresh the stored playlists in the backend with fresh meta data

View File

@ -1,7 +1,6 @@
import sys import sys
from mopidy import settings from mopidy import audio, settings
from mopidy.gstreamer import GStreamer
from mopidy.utils.path import path_to_uri from mopidy.utils.path import path_to_uri
from tests import unittest, path_to_data_dir from tests import unittest, path_to_data_dir
@ -9,38 +8,38 @@ from tests import unittest, path_to_data_dir
@unittest.skipIf(sys.platform == 'win32', @unittest.skipIf(sys.platform == 'win32',
'Our Windows build server does not support GStreamer yet') 'Our Windows build server does not support GStreamer yet')
class GStreamerTest(unittest.TestCase): class AudioTest(unittest.TestCase):
def setUp(self): def setUp(self):
settings.MIXER = 'fakemixer track_max_volume=65536' settings.MIXER = 'fakemixer track_max_volume=65536'
settings.OUTPUT = 'fakesink' settings.OUTPUT = 'fakesink'
self.song_uri = path_to_uri(path_to_data_dir('song1.wav')) self.song_uri = path_to_uri(path_to_data_dir('song1.wav'))
self.gstreamer = GStreamer.start().proxy() self.audio = audio.Audio.start().proxy()
def tearDown(self): def tearDown(self):
self.gstreamer.stop() self.audio.stop()
settings.runtime.clear() settings.runtime.clear()
def prepare_uri(self, uri): def prepare_uri(self, uri):
self.gstreamer.prepare_change() self.audio.prepare_change()
self.gstreamer.set_uri(uri) self.audio.set_uri(uri)
def test_start_playback_existing_file(self): def test_start_playback_existing_file(self):
self.prepare_uri(self.song_uri) self.prepare_uri(self.song_uri)
self.assertTrue(self.gstreamer.start_playback().get()) self.assertTrue(self.audio.start_playback().get())
def test_start_playback_non_existing_file(self): def test_start_playback_non_existing_file(self):
self.prepare_uri(self.song_uri + 'bogus') self.prepare_uri(self.song_uri + 'bogus')
self.assertFalse(self.gstreamer.start_playback().get()) self.assertFalse(self.audio.start_playback().get())
def test_pause_playback_while_playing(self): def test_pause_playback_while_playing(self):
self.prepare_uri(self.song_uri) self.prepare_uri(self.song_uri)
self.gstreamer.start_playback() self.audio.start_playback()
self.assertTrue(self.gstreamer.pause_playback().get()) self.assertTrue(self.audio.pause_playback().get())
def test_stop_playback_while_playing(self): def test_stop_playback_while_playing(self):
self.prepare_uri(self.song_uri) self.prepare_uri(self.song_uri)
self.gstreamer.start_playback() self.audio.start_playback()
self.assertTrue(self.gstreamer.stop_playback().get()) self.assertTrue(self.audio.stop_playback().get())
@unittest.SkipTest @unittest.SkipTest
def test_deliver_data(self): def test_deliver_data(self):
@ -52,8 +51,8 @@ class GStreamerTest(unittest.TestCase):
def test_set_volume(self): def test_set_volume(self):
for value in range(0, 101): for value in range(0, 101):
self.assertTrue(self.gstreamer.set_volume(value).get()) self.assertTrue(self.audio.set_volume(value).get())
self.assertEqual(value, self.gstreamer.get_volume().get()) self.assertEqual(value, self.audio.get_volume().get())
@unittest.SkipTest @unittest.SkipTest
def test_set_state_encapsulation(self): def test_set_state_encapsulation(self):
@ -66,4 +65,3 @@ class GStreamerTest(unittest.TestCase):
@unittest.SkipTest @unittest.SkipTest
def test_invalid_output_raises_error(self): def test_invalid_output_raises_error(self):
pass # TODO pass # TODO

View File

@ -1,8 +1,8 @@
import mock import mock
import random import random
from mopidy import audio
from mopidy.models import CpTrack, Playlist, Track from mopidy.models import CpTrack, Playlist, Track
from mopidy.gstreamer import GStreamer
from tests.backends.base import populate_playlist from tests.backends.base import populate_playlist
@ -12,7 +12,7 @@ class CurrentPlaylistControllerTest(object):
def setUp(self): def setUp(self):
self.backend = self.backend_class() self.backend = self.backend_class()
self.backend.gstreamer = mock.Mock(spec=GStreamer) self.backend.audio = mock.Mock(spec=audio.Audio)
self.controller = self.backend.current_playlist self.controller = self.backend.current_playlist
self.playback = self.backend.playback self.playback = self.backend.playback

View File

@ -2,8 +2,8 @@ import mock
import random import random
import time import time
from mopidy import audio
from mopidy.models import Track from mopidy.models import Track
from mopidy.gstreamer import GStreamer
from tests import unittest from tests import unittest
from tests.backends.base import populate_playlist from tests.backends.base import populate_playlist
@ -16,7 +16,7 @@ class PlaybackControllerTest(object):
def setUp(self): def setUp(self):
self.backend = self.backend_class() self.backend = self.backend_class()
self.backend.gstreamer = mock.Mock(spec=GStreamer) self.backend.audio = mock.Mock(spec=audio.Audio)
self.playback = self.backend.playback self.playback = self.backend.playback
self.current_playlist = self.backend.current_playlist self.current_playlist = self.backend.current_playlist
@ -729,7 +729,7 @@ class PlaybackControllerTest(object):
def test_time_position_when_stopped(self): def test_time_position_when_stopped(self):
future = mock.Mock() future = mock.Mock()
future.get = mock.Mock(return_value=0) future.get = mock.Mock(return_value=0)
self.backend.gstreamer.get_position = mock.Mock(return_value=future) self.backend.audio.get_position = mock.Mock(return_value=future)
self.assertEqual(self.playback.time_position, 0) self.assertEqual(self.playback.time_position, 0)
@ -737,7 +737,7 @@ class PlaybackControllerTest(object):
def test_time_position_when_stopped_with_playlist(self): def test_time_position_when_stopped_with_playlist(self):
future = mock.Mock() future = mock.Mock()
future.get = mock.Mock(return_value=0) future.get = mock.Mock(return_value=0)
self.backend.gstreamer.get_position = mock.Mock(return_value=future) self.backend.audio.get_position = mock.Mock(return_value=future)
self.assertEqual(self.playback.time_position, 0) self.assertEqual(self.playback.time_position, 0)