blob: a7baf22d44d3e0c8db9914b4d2c5ce10f9a25c55 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/speech/tts_utterance_impl.h"
#include <memory>
#include "base/values.h"
#include "content/public/browser/web_contents.h"
#include "third_party/blink/public/mojom/speech/speech_synthesis.mojom.h"
namespace content {
bool IsFinalTtsEventType(TtsEventType event_type) {
return (event_type == TTS_EVENT_END || event_type == TTS_EVENT_INTERRUPTED ||
event_type == TTS_EVENT_CANCELLED || event_type == TTS_EVENT_ERROR);
}
//
// UtteranceContinuousParameters
//
UtteranceContinuousParameters::UtteranceContinuousParameters()
: rate(blink::mojom::kSpeechSynthesisDoublePrefNotSet),
pitch(blink::mojom::kSpeechSynthesisDoublePrefNotSet),
volume(blink::mojom::kSpeechSynthesisDoublePrefNotSet) {}
//
// Utterance
//
// static
int TtsUtteranceImpl::next_utterance_id_ = 0;
// static
std::unique_ptr<TtsUtterance> TtsUtterance::Create(WebContents* web_contents) {
DCHECK(web_contents);
return std::make_unique<TtsUtteranceImpl>(web_contents->GetBrowserContext(),
web_contents);
}
// static
std::unique_ptr<TtsUtterance> TtsUtterance::Create(
BrowserContext* browser_context,
bool should_always_be_spoken) {
return std::make_unique<TtsUtteranceImpl>(browser_context,
should_always_be_spoken);
}
// static
std::unique_ptr<TtsUtterance> TtsUtterance::Create() {
return std::make_unique<TtsUtteranceImpl>(nullptr, nullptr);
}
TtsUtteranceImpl::TtsUtteranceImpl(BrowserContext* browser_context,
WebContents* web_contents)
: browser_context_(browser_context),
was_created_with_web_contents_(web_contents != nullptr),
id_(next_utterance_id_++),
src_id_(-1),
should_clear_queue_(true),
char_index_(0),
finished_(false) {
if (web_contents) {
web_contents_ = web_contents->GetWeakPtr();
}
}
TtsUtteranceImpl::TtsUtteranceImpl(BrowserContext* browser_context,
bool should_always_be_spoken)
: TtsUtteranceImpl(browser_context, nullptr) {
should_always_be_spoken_ = should_always_be_spoken;
}
TtsUtteranceImpl::~TtsUtteranceImpl() {
// It's an error if an Utterance is destructed without being finished,
// unless |browser_context_| is nullptr because it's a unit test.
DCHECK(finished_ || !browser_context_);
}
void TtsUtteranceImpl::OnTtsEvent(TtsEventType event_type,
int char_index,
int length,
const std::string& error_message) {
if (char_index >= 0)
char_index_ = char_index;
if (IsFinalTtsEventType(event_type)) {
finished_ = true;
}
if (event_delegate_) {
event_delegate_->OnTtsEvent(this, event_type, char_index, length,
error_message);
}
}
void TtsUtteranceImpl::Finish() {
finished_ = true;
}
void TtsUtteranceImpl::SetText(const std::string& text) {
text_ = text;
}
const std::string& TtsUtteranceImpl::GetText() {
return text_;
}
void TtsUtteranceImpl::SetOptions(base::Value::Dict options) {
options_ = std::move(options);
}
const base::Value::Dict* TtsUtteranceImpl::GetOptions() {
return &options_;
}
void TtsUtteranceImpl::SetSrcId(int src_id) {
src_id_ = src_id;
}
int TtsUtteranceImpl::GetSrcId() {
return src_id_;
}
void TtsUtteranceImpl::SetSrcUrl(const GURL& src_url) {
src_url_ = src_url;
}
const GURL& TtsUtteranceImpl::GetSrcUrl() {
return src_url_;
}
void TtsUtteranceImpl::SetVoiceName(const std::string& voice_name) {
voice_name_ = voice_name;
}
const std::string& TtsUtteranceImpl::GetVoiceName() {
return voice_name_;
}
void TtsUtteranceImpl::SetLang(const std::string& lang) {
lang_ = lang;
}
const std::string& TtsUtteranceImpl::GetLang() {
return lang_;
}
void TtsUtteranceImpl::SetContinuousParameters(const double rate,
const double pitch,
const double volume) {
continuous_parameters_.rate = rate;
continuous_parameters_.pitch = pitch;
continuous_parameters_.volume = volume;
}
const UtteranceContinuousParameters&
TtsUtteranceImpl::GetContinuousParameters() {
return continuous_parameters_;
}
void TtsUtteranceImpl::SetShouldClearQueue(bool value) {
should_clear_queue_ = value;
}
bool TtsUtteranceImpl::GetShouldClearQueue() {
return should_clear_queue_;
}
void TtsUtteranceImpl::SetRequiredEventTypes(
const base::flat_set<TtsEventType>& types) {
required_event_types_ = types;
}
const base::flat_set<TtsEventType>& TtsUtteranceImpl::GetRequiredEventTypes() {
return required_event_types_;
}
void TtsUtteranceImpl::SetDesiredEventTypes(
const base::flat_set<TtsEventType>& types) {
desired_event_types_ = types;
}
const base::flat_set<TtsEventType>& TtsUtteranceImpl::GetDesiredEventTypes() {
return desired_event_types_;
}
void TtsUtteranceImpl::SetEngineId(const std::string& engine_id) {
engine_id_ = engine_id;
}
const std::string& TtsUtteranceImpl::GetEngineId() {
return engine_id_;
}
void TtsUtteranceImpl::SetEventDelegate(
std::unique_ptr<UtteranceEventDelegate> event_delegate) {
event_delegate_ = std::move(event_delegate);
}
UtteranceEventDelegate* TtsUtteranceImpl::GetEventDelegate() {
return event_delegate_.get();
}
BrowserContext* TtsUtteranceImpl::GetBrowserContext() {
return browser_context_;
}
void TtsUtteranceImpl::ClearBrowserContext() {
browser_context_ = nullptr;
}
int TtsUtteranceImpl::GetId() {
return id_;
}
bool TtsUtteranceImpl::IsFinished() {
return finished_;
}
WebContents* TtsUtteranceImpl::GetWebContents() {
return web_contents_.get();
}
bool TtsUtteranceImpl::ShouldAlwaysBeSpoken() {
return should_always_be_spoken_;
}
} // namespace content