78 lines
2.3 KiB
Python
78 lines
2.3 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.
|
|
#
|
|
"""Mycroft audio service.
|
|
|
|
This handles playback of audio and speech
|
|
"""
|
|
from mycroft.util import (
|
|
check_for_signal,
|
|
reset_sigint_handler,
|
|
start_message_bus_client,
|
|
wait_for_exit_signal
|
|
)
|
|
from mycroft.util.log import LOG
|
|
from mycroft.util.process_utils import ProcessStatus, StatusCallbackMap
|
|
|
|
import mycroft.audio.speech as speech
|
|
from .audioservice import AudioService
|
|
|
|
|
|
def on_ready():
|
|
LOG.info('Audio service is ready.')
|
|
|
|
|
|
def on_error(e='Unknown'):
|
|
LOG.error('Audio service failed to launch ({}).'.format(repr(e)))
|
|
|
|
|
|
def on_stopping():
|
|
LOG.info('Audio service is shutting down...')
|
|
|
|
|
|
def main(ready_hook=on_ready, error_hook=on_error, stopping_hook=on_stopping):
|
|
"""Start the Audio Service and connect to the Message Bus"""
|
|
LOG.info("Starting Audio Service")
|
|
try:
|
|
reset_sigint_handler()
|
|
check_for_signal("isSpeaking")
|
|
whitelist = ['mycroft.audio.service']
|
|
bus = start_message_bus_client("AUDIO", whitelist=whitelist)
|
|
callbacks = StatusCallbackMap(on_ready=ready_hook, on_error=error_hook,
|
|
on_stopping=stopping_hook)
|
|
status = ProcessStatus('audio', bus, callbacks)
|
|
|
|
speech.init(bus)
|
|
|
|
# Connect audio service instance to message bus
|
|
audio = AudioService(bus)
|
|
status.set_started()
|
|
except Exception as e:
|
|
status.set_error(e)
|
|
else:
|
|
if audio.wait_for_load() and len(audio.service) > 0:
|
|
# If at least one service exists, report ready
|
|
status.set_ready()
|
|
wait_for_exit_signal()
|
|
status.set_stopping()
|
|
else:
|
|
status.set_error('No audio services loaded')
|
|
|
|
speech.shutdown()
|
|
audio.shutdown()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|