mycroft-core/mycroft/audio/services/__init__.py

161 lines
4.2 KiB
Python

# Copyright 2017 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Definition of the audio service backends base classes.
These classes can be used to create an Audioservice plugin extending
Mycroft's media playback options.
"""
from abc import ABCMeta, abstractmethod
class AudioBackend(metaclass=ABCMeta):
"""Base class for all audio backend implementations.
Args:
config (dict): configuration dict for the instance
bus (MessageBusClient): Mycroft messagebus emitter
"""
def __init__(self, config, bus):
self._track_start_callback = None
self.supports_mime_hints = False
self.config = config
self.bus = bus
@abstractmethod
def supported_uris(self):
"""List of supported uri types.
Returns:
list: Supported uri's
"""
@abstractmethod
def clear_list(self):
"""Clear playlist."""
@abstractmethod
def add_list(self, tracks):
"""Add tracks to backend's playlist.
Args:
tracks (list): list of tracks.
"""
@abstractmethod
def play(self, repeat=False):
"""Start playback.
Starts playing the first track in the playlist and will contiune
until all tracks have been played.
Args:
repeat (bool): Repeat playlist, defaults to False
"""
@abstractmethod
def stop(self):
"""Stop playback.
Stops the current playback.
Returns:
bool: True if playback was stopped, otherwise False
"""
def set_track_start_callback(self, callback_func):
"""Register callback on track start.
This method should be called as each track in a playlist is started.
"""
self._track_start_callback = callback_func
def pause(self):
"""Pause playback.
Stops playback but may be resumed at the exact position the pause
occured.
"""
def resume(self):
"""Resume paused playback.
Resumes playback after being paused.
"""
def next(self):
"""Skip to next track in playlist."""
def previous(self):
"""Skip to previous track in playlist."""
def lower_volume(self):
"""Lower volume.
This method is used to implement audio ducking. It will be called when
Mycroft is listening or speaking to make sure the media playing isn't
interfering.
"""
def restore_volume(self):
"""Restore normal volume.
Called when to restore the playback volume to previous level after
Mycroft has lowered it using lower_volume().
"""
def seek_forward(self, seconds=1):
"""Skip X seconds.
Args:
seconds (int): number of seconds to seek, if negative rewind
"""
def seek_backward(self, seconds=1):
"""Rewind X seconds.
Args:
seconds (int): number of seconds to seek, if negative jump forward.
"""
def track_info(self):
"""Get info about current playing track.
Returns:
dict: Track info containing atleast the keys artist and album.
"""
ret = {}
ret['artist'] = ''
ret['album'] = ''
return ret
def shutdown(self):
"""Perform clean shutdown.
Implements any audio backend specific shutdown procedures.
"""
self.stop()
class RemoteAudioBackend(AudioBackend):
"""Base class for remote audio backends.
RemoteAudioBackends will always be checked after the normal
AudioBackends to make playback start locally by default.
An example of a RemoteAudioBackend would be things like Chromecasts,
mopidy servers, etc.
"""