blob: a1f4046c94e4eeb76790c6d6b1bf50711dbe7ce9 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/a11y/lib/tts/tts_manager.h"
#include <lib/syslog/cpp/macros.h>
namespace a11y {
TtsManager::TtsManager(sys::ComponentContext* startup_context) : engine_binding_(this) {
FX_CHECK(startup_context);
startup_context->outgoing()->AddPublicService(manager_bindings_.GetHandler(this));
startup_context->outgoing()->AddPublicService(registry_bindings_.GetHandler(this));
}
TtsManager::~TtsManager() = default;
void TtsManager::OpenEngine(
fidl::InterfaceRequest<fuchsia::accessibility::tts::Engine> engine_request,
OpenEngineCallback callback) {
fuchsia::accessibility::tts::TtsManager_OpenEngine_Result result;
if (engine_binding_.is_bound()) {
// The engine is in use by another speaker.
result.set_err(fuchsia::accessibility::tts::Error::BUSY);
} else {
engine_binding_.Bind(std::move(engine_request));
result.set_response(fuchsia::accessibility::tts::TtsManager_OpenEngine_Response{});
}
callback(std::move(result));
CheckIfTtsEngineIsReadyAndRunCallback();
}
void TtsManager::CloseEngine() {
if (engine_binding_.is_bound()) {
engine_binding_.Unbind();
}
}
void TtsManager::RegisterEngine(fidl::InterfaceHandle<fuchsia::accessibility::tts::Engine> engine,
RegisterEngineCallback callback) {
fuchsia::accessibility::tts::EngineRegistry_RegisterEngine_Result result;
if (!engine_) {
engine_.Bind(std::move(engine));
result.set_response(fuchsia::accessibility::tts::EngineRegistry_RegisterEngine_Response{});
} else {
// There is already an engine registered.
result.set_err(fuchsia::accessibility::tts::Error::BUSY);
}
callback(std::move(result));
CheckIfTtsEngineIsReadyAndRunCallback();
}
void TtsManager::Enqueue(fuchsia::accessibility::tts::Utterance utterance,
EnqueueCallback callback) {
fuchsia::accessibility::tts::Engine_Enqueue_Result result;
if (!engine_) {
result.set_err(fuchsia::accessibility::tts::Error::BAD_STATE);
callback(std::move(result));
} else {
engine_->Enqueue(std::move(utterance), std::move(callback));
}
}
void TtsManager::CheckIfTtsEngineIsReadyAndRunCallback() {
if (!engine_binding_.is_bound() || !engine_) {
return;
}
if (tts_engine_ready_callback_) {
tts_engine_ready_callback_();
}
UnregisterTTSEngineReadyCallback();
}
void TtsManager::Speak(SpeakCallback callback) {
fuchsia::accessibility::tts::Engine_Speak_Result result;
if (!engine_) {
result.set_err(fuchsia::accessibility::tts::Error::BAD_STATE);
callback(std::move(result));
} else {
engine_->Speak(std::move(callback));
}
}
void TtsManager::Cancel(CancelCallback callback) {
if (engine_) {
engine_->Cancel(std::move(callback));
} else {
callback();
}
}
void TtsManager::RegisterTTSEngineReadyCallback(TTSEngineReadyCallback callback) {
tts_engine_ready_callback_ = std::move(callback);
// The TTS engine and speaker may already be connected when the callback is
// registered, in which case, we should execute and unregister immediately.
CheckIfTtsEngineIsReadyAndRunCallback();
}
void TtsManager::UnregisterTTSEngineReadyCallback() {
tts_engine_ready_callback_ = TTSEngineReadyCallback();
}
} // namespace a11y