From aab37302a1096a19e0ed02fa1e77cf369772bf21 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 14 Sep 2012 00:53:23 +0200 Subject: [PATCH 1/2] Rename mopidy.gstreamer to mopidy.audio --- docs/modules/audio.rst | 7 +++++ docs/modules/gstreamer.rst | 7 ----- mopidy/__main__.py | 14 ++++----- mopidy/{gstreamer.py => audio/__init__.py} | 6 ++-- mopidy/backends/local/__init__.py | 33 +++++++++++----------- mopidy/backends/spotify/__init__.py | 13 ++++----- mopidy/backends/spotify/playback.py | 20 ++++++------- mopidy/backends/spotify/session_manager.py | 17 ++++++----- tests/{gstreamer_test.py => audio_test.py} | 30 +++++++++----------- tests/backends/base/current_playlist.py | 4 +-- tests/backends/base/playback.py | 8 +++--- 11 files changed, 77 insertions(+), 82 deletions(-) create mode 100644 docs/modules/audio.rst delete mode 100644 docs/modules/gstreamer.rst rename mopidy/{gstreamer.py => audio/__init__.py} (99%) rename tests/{gstreamer_test.py => audio_test.py} (64%) diff --git a/docs/modules/audio.rst b/docs/modules/audio.rst new file mode 100644 index 00000000..0f1c3bfb --- /dev/null +++ b/docs/modules/audio.rst @@ -0,0 +1,7 @@ +************************************* +:mod:`mopidy.audio` -- Audio playback +************************************* + +.. automodule:: mopidy.audio + :synopsis: Audio playback through GStreamer + :members: diff --git a/docs/modules/gstreamer.rst b/docs/modules/gstreamer.rst deleted file mode 100644 index 205b0a3e..00000000 --- a/docs/modules/gstreamer.rst +++ /dev/null @@ -1,7 +0,0 @@ -******************************************** -:mod:`mopidy.gstreamer` -- GStreamer adapter -******************************************** - -.. automodule:: mopidy.gstreamer - :synopsis: GStreamer adapter - :members: diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 9bee390e..416429bc 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -30,7 +30,7 @@ sys.path.insert(0, from mopidy import (get_version, settings, OptionalDependencyError, 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.deps import list_deps_optparse_callback from mopidy.utils.log import setup_logging @@ -51,7 +51,7 @@ def main(): setup_logging(options.verbosity_level, options.save_debug_log) check_old_folders() setup_settings(options.interactive) - setup_gstreamer() + setup_audio() setup_backend() setup_frontends() loop.run() @@ -65,7 +65,7 @@ def main(): loop.quit() stop_frontends() stop_backend() - stop_gstreamer() + stop_audio() stop_remaining_actors() @@ -117,12 +117,12 @@ def setup_settings(interactive): sys.exit(1) -def setup_gstreamer(): - GStreamer.start() +def setup_audio(): + Audio.start() -def stop_gstreamer(): - stop_actors_by_class(GStreamer) +def stop_audio(): + stop_actors_by_class(Audio) def setup_backend(): get_class(settings.BACKENDS[0]).start() diff --git a/mopidy/gstreamer.py b/mopidy/audio/__init__.py similarity index 99% rename from mopidy/gstreamer.py rename to mopidy/audio/__init__.py index 9d0cb97c..28abd75d 100644 --- a/mopidy/gstreamer.py +++ b/mopidy/audio/__init__.py @@ -15,10 +15,10 @@ from mopidy.utils import process # Trigger install of gst mixer plugins from mopidy import mixers -logger = logging.getLogger('mopidy.gstreamer') +logger = logging.getLogger('mopidy.audio') -class GStreamer(ThreadingActor): +class Audio(ThreadingActor): """ Audio output through `GStreamer `_. @@ -31,7 +31,7 @@ class GStreamer(ThreadingActor): """ def __init__(self): - super(GStreamer, self).__init__() + super(Audio, self).__init__() self._default_caps = gst.Caps(""" audio/x-raw-int, diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index e8d918b0..022b253b 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -7,10 +7,9 @@ import shutil from pykka.actor import ThreadingActor 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.models import Playlist, Track, Album -from mopidy.gstreamer import GStreamer from .translator import parse_m3u, parse_mpd_tag_cache @@ -58,13 +57,13 @@ class LocalBackend(ThreadingActor, base.Backend): self.uri_schemes = [u'file'] - self.gstreamer = None + self.audio = None def on_start(self): - gstreamer_refs = ActorRegistry.get_by_class(GStreamer) - assert len(gstreamer_refs) == 1, \ - 'Expected exactly one running GStreamer.' - self.gstreamer = gstreamer_refs[0].proxy() + audio_refs = ActorRegistry.get_by_class(audio.Audio) + assert len(audio_refs) == 1, \ + 'Expected exactly one running Audio instance.' + self.audio = audio_refs[0].proxy() class LocalPlaybackController(core.PlaybackController): @@ -76,32 +75,32 @@ class LocalPlaybackController(core.PlaybackController): @property def time_position(self): - return self.backend.gstreamer.get_position().get() + return self.backend.audio.get_position().get() class LocalPlaybackProvider(base.BasePlaybackProvider): def pause(self): - return self.backend.gstreamer.pause_playback().get() + return self.backend.audio.pause_playback().get() def play(self, track): - self.backend.gstreamer.prepare_change() - self.backend.gstreamer.set_uri(track.uri).get() - return self.backend.gstreamer.start_playback().get() + self.backend.audio.prepare_change() + self.backend.audio.set_uri(track.uri).get() + return self.backend.audio.start_playback().get() def resume(self): - return self.backend.gstreamer.start_playback().get() + return self.backend.audio.start_playback().get() 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): - return self.backend.gstreamer.stop_playback().get() + return self.backend.audio.stop_playback().get() def get_volume(self): - return self.backend.gstreamer.get_volume().get() + return self.backend.audio.get_volume().get() def set_volume(self, volume): - self.backend.gstreamer.set_volume(volume).get() + self.backend.audio.set_volume(volume).get() class LocalStoredPlaylistsProvider(base.BaseStoredPlaylistsProvider): diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index fef86280..1feb1c65 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -3,9 +3,8 @@ import logging from pykka.actor import ThreadingActor from pykka.registry import ActorRegistry -from mopidy import core, settings +from mopidy import audio, core, settings from mopidy.backends import base -from mopidy.gstreamer import GStreamer logger = logging.getLogger('mopidy.backends.spotify') @@ -67,7 +66,7 @@ class SpotifyBackend(ThreadingActor, base.Backend): self.uri_schemes = [u'spotify'] - self.gstreamer = None + self.audio = None self.spotify = None # Fail early if settings are not present @@ -75,10 +74,10 @@ class SpotifyBackend(ThreadingActor, base.Backend): self.password = settings.SPOTIFY_PASSWORD def on_start(self): - gstreamer_refs = ActorRegistry.get_by_class(GStreamer) - assert len(gstreamer_refs) == 1, \ - 'Expected exactly one running GStreamer.' - self.gstreamer = gstreamer_refs[0].proxy() + audio_refs = ActorRegistry.get_by_class(audio.Audio) + assert len(audio_refs) == 1, \ + 'Expected exactly one running Audio instance.' + self.audio = audio_refs[0].proxy() logger.info(u'Mopidy uses SPOTIFY(R) CORE') self.spotify = self._connect() diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 70cc4617..307cf4bf 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -8,7 +8,7 @@ logger = logging.getLogger('mopidy.backends.spotify.playback') class SpotifyPlaybackProvider(BasePlaybackProvider): def pause(self): - return self.backend.gstreamer.pause_playback() + return self.backend.audio.pause_playback() def play(self, track): if self.backend.playback.state == self.backend.playback.PLAYING: @@ -19,10 +19,10 @@ class SpotifyPlaybackProvider(BasePlaybackProvider): self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) - self.backend.gstreamer.prepare_change() - self.backend.gstreamer.set_uri('appsrc://') - self.backend.gstreamer.start_playback() - self.backend.gstreamer.set_metadata(track) + self.backend.audio.prepare_change() + self.backend.audio.set_uri('appsrc://') + self.backend.audio.start_playback() + self.backend.audio.set_metadata(track) return True except SpotifyError as 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) def seek(self, time_position): - self.backend.gstreamer.prepare_change() + self.backend.audio.prepare_change() self.backend.spotify.session.seek(time_position) - self.backend.gstreamer.start_playback() + self.backend.audio.start_playback() return True def stop(self): - result = self.backend.gstreamer.stop_playback() + result = self.backend.audio.stop_playback() self.backend.spotify.session.play(0) return result def get_volume(self): - return self.backend.gstreamer.get_volume().get() + return self.backend.audio.get_volume().get() def set_volume(self, volume): - self.backend.gstreamer.set_volume(volume) + self.backend.audio.set_volume(volume) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 481f7a94..aa3734ae 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -6,14 +6,13 @@ from spotify.manager import SpotifySessionManager as PyspotifySessionManager 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.spotify import BITRATES from mopidy.backends.spotify.container_manager import SpotifyContainerManager from mopidy.backends.spotify.playlist_manager import SpotifyPlaylistManager from mopidy.backends.spotify.translator import SpotifyTranslator from mopidy.models import Playlist -from mopidy.gstreamer import GStreamer from mopidy.utils.process import BaseThread logger = logging.getLogger('mopidy.backends.spotify.session_manager') @@ -34,7 +33,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): BaseThread.__init__(self) self.name = 'SpotifyThread' - self.gstreamer = None + self.audio = None self.backend = None self.connected = threading.Event() @@ -50,10 +49,10 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): self.connect() def setup(self): - gstreamer_refs = ActorRegistry.get_by_class(GStreamer) - assert len(gstreamer_refs) == 1, \ - 'Expected exactly one running gstreamer.' - self.gstreamer = gstreamer_refs[0].proxy() + audio_refs = ActorRegistry.get_by_class(audio.Audio) + assert len(audio_refs) == 1, \ + 'Expected exactly one running Audio instance.' + self.audio = audio_refs[0].proxy() backend_refs = ActorRegistry.get_by_class(Backend) assert len(backend_refs) == 1, 'Expected exactly one running backend.' @@ -117,7 +116,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): 'sample_rate': sample_rate, 'channels': channels, } - self.gstreamer.emit_data(capabilites, bytes(frames)) + self.audio.emit_data(capabilites, bytes(frames)) return num_frames def play_token_lost(self, session): @@ -143,7 +142,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): def end_of_track(self, session): """Callback used by pyspotify""" 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): """Refresh the stored playlists in the backend with fresh meta data diff --git a/tests/gstreamer_test.py b/tests/audio_test.py similarity index 64% rename from tests/gstreamer_test.py rename to tests/audio_test.py index ce20d2b4..fcafa75f 100644 --- a/tests/gstreamer_test.py +++ b/tests/audio_test.py @@ -1,7 +1,6 @@ import sys -from mopidy import settings -from mopidy.gstreamer import GStreamer +from mopidy import audio, settings from mopidy.utils.path import path_to_uri 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', 'Our Windows build server does not support GStreamer yet') -class GStreamerTest(unittest.TestCase): +class AudioTest(unittest.TestCase): def setUp(self): settings.MIXER = 'fakemixer track_max_volume=65536' settings.OUTPUT = 'fakesink' 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): - self.gstreamer.stop() + self.audio.stop() settings.runtime.clear() def prepare_uri(self, uri): - self.gstreamer.prepare_change() - self.gstreamer.set_uri(uri) + self.audio.prepare_change() + self.audio.set_uri(uri) def test_start_playback_existing_file(self): 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): 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): self.prepare_uri(self.song_uri) - self.gstreamer.start_playback() - self.assertTrue(self.gstreamer.pause_playback().get()) + self.audio.start_playback() + self.assertTrue(self.audio.pause_playback().get()) def test_stop_playback_while_playing(self): self.prepare_uri(self.song_uri) - self.gstreamer.start_playback() - self.assertTrue(self.gstreamer.stop_playback().get()) + self.audio.start_playback() + self.assertTrue(self.audio.stop_playback().get()) @unittest.SkipTest def test_deliver_data(self): @@ -52,8 +51,8 @@ class GStreamerTest(unittest.TestCase): def test_set_volume(self): for value in range(0, 101): - self.assertTrue(self.gstreamer.set_volume(value).get()) - self.assertEqual(value, self.gstreamer.get_volume().get()) + self.assertTrue(self.audio.set_volume(value).get()) + self.assertEqual(value, self.audio.get_volume().get()) @unittest.SkipTest def test_set_state_encapsulation(self): @@ -66,4 +65,3 @@ class GStreamerTest(unittest.TestCase): @unittest.SkipTest def test_invalid_output_raises_error(self): pass # TODO - diff --git a/tests/backends/base/current_playlist.py b/tests/backends/base/current_playlist.py index e99cd56c..44e9390e 100644 --- a/tests/backends/base/current_playlist.py +++ b/tests/backends/base/current_playlist.py @@ -1,8 +1,8 @@ import mock import random +from mopidy import audio from mopidy.models import CpTrack, Playlist, Track -from mopidy.gstreamer import GStreamer from tests.backends.base import populate_playlist @@ -12,7 +12,7 @@ class CurrentPlaylistControllerTest(object): def setUp(self): 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.playback = self.backend.playback diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 40c49709..dcd43983 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -2,8 +2,8 @@ import mock import random import time +from mopidy import audio from mopidy.models import Track -from mopidy.gstreamer import GStreamer from tests import unittest from tests.backends.base import populate_playlist @@ -16,7 +16,7 @@ class PlaybackControllerTest(object): def setUp(self): 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.current_playlist = self.backend.current_playlist @@ -729,7 +729,7 @@ class PlaybackControllerTest(object): def test_time_position_when_stopped(self): future = mock.Mock() 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) @@ -737,7 +737,7 @@ class PlaybackControllerTest(object): def test_time_position_when_stopped_with_playlist(self): future = mock.Mock() 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) From 4dd95804f25dd9dee2c260d8a23b2879cb50e2fa Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 14 Sep 2012 00:56:49 +0200 Subject: [PATCH 2/2] Rename mopidy.mixers to mopidy.audio.mixers --- mopidy/audio/__init__.py | 2 +- mopidy/{ => audio}/mixers/__init__.py | 6 +++--- mopidy/{ => audio}/mixers/auto.py | 2 +- mopidy/{ => audio}/mixers/fake.py | 2 +- mopidy/{ => audio}/mixers/nad.py | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename mopidy/{ => audio}/mixers/__init__.py (88%) rename mopidy/{ => audio}/mixers/auto.py (97%) rename mopidy/{ => audio}/mixers/fake.py (96%) rename mopidy/{ => audio}/mixers/nad.py (98%) diff --git a/mopidy/audio/__init__.py b/mopidy/audio/__init__.py index 28abd75d..78a53277 100644 --- a/mopidy/audio/__init__.py +++ b/mopidy/audio/__init__.py @@ -13,7 +13,7 @@ from mopidy.backends.base import Backend from mopidy.utils import process # Trigger install of gst mixer plugins -from mopidy import mixers +from mopidy.audio import mixers logger = logging.getLogger('mopidy.audio') diff --git a/mopidy/mixers/__init__.py b/mopidy/audio/mixers/__init__.py similarity index 88% rename from mopidy/mixers/__init__.py rename to mopidy/audio/mixers/__init__.py index 317188fc..a0247519 100644 --- a/mopidy/mixers/__init__.py +++ b/mopidy/audio/mixers/__init__.py @@ -38,6 +38,6 @@ def create_track(label, initial_volume, min_volume, max_volume, # # Keep these imports at the bottom of the file to avoid cyclic import problems # when mixers use the above code. -from mopidy.mixers.auto import AutoAudioMixer -from mopidy.mixers.fake import FakeMixer -from mopidy.mixers.nad import NadMixer +from .auto import AutoAudioMixer +from .fake import FakeMixer +from .nad import NadMixer diff --git a/mopidy/mixers/auto.py b/mopidy/audio/mixers/auto.py similarity index 97% rename from mopidy/mixers/auto.py rename to mopidy/audio/mixers/auto.py index f4bd0f92..1233afa3 100644 --- a/mopidy/mixers/auto.py +++ b/mopidy/audio/mixers/auto.py @@ -5,7 +5,7 @@ import gst import logging -logger = logging.getLogger('mopidy.mixers.auto') +logger = logging.getLogger('mopidy.audio.mixers.auto') # TODO: we might want to add some ranking to the mixers we know about? diff --git a/mopidy/mixers/fake.py b/mopidy/audio/mixers/fake.py similarity index 96% rename from mopidy/mixers/fake.py rename to mopidy/audio/mixers/fake.py index 3c47ef33..c5faa03f 100644 --- a/mopidy/mixers/fake.py +++ b/mopidy/audio/mixers/fake.py @@ -3,7 +3,7 @@ pygst.require('0.10') import gobject import gst -from mopidy.mixers import create_track +from mopidy.audio.mixers import create_track class FakeMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer): diff --git a/mopidy/mixers/nad.py b/mopidy/audio/mixers/nad.py similarity index 98% rename from mopidy/mixers/nad.py rename to mopidy/audio/mixers/nad.py index de959d41..667dee53 100644 --- a/mopidy/mixers/nad.py +++ b/mopidy/audio/mixers/nad.py @@ -12,10 +12,10 @@ except ImportError: from pykka.actor import ThreadingActor -from mopidy.mixers import create_track +from mopidy.audio.mixers import create_track -logger = logging.getLogger('mopidy.mixers.nad') +logger = logging.getLogger('mopidy.audio.mixers.nad') class NadMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer):