| Index: chrome/browser/speech/tts_controller.cc
|
| diff --git a/chrome/browser/speech/tts_controller.cc b/chrome/browser/speech/tts_controller.cc
|
| index 6fbe4e2b81a780223c41045f7472faf90a74288b..f6bff5213c8dc79db179db4286ebcf39780b894a 100644
|
| --- a/chrome/browser/speech/tts_controller.cc
|
| +++ b/chrome/browser/speech/tts_controller.cc
|
| @@ -8,9 +8,7 @@
|
| #include <vector>
|
|
|
| #include "base/float_util.h"
|
| -#include "base/json/json_writer.h"
|
| #include "base/values.h"
|
| -#include "chrome/browser/extensions/event_router.h"
|
| #include "chrome/browser/extensions/extension_system.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/speech/extension_api/tts_engine_extension_api.h"
|
| @@ -23,39 +21,18 @@
|
| namespace constants = tts_extension_api_constants;
|
|
|
| namespace {
|
| -
|
| // A value to be used to indicate that there is no char index available.
|
| const int kInvalidCharIndex = -1;
|
| +} // namespace
|
|
|
| -namespace events {
|
| -const char kOnEvent[] = "tts.onEvent";
|
| -}; // namespace events
|
| -
|
| -std::string TtsEventTypeToString(TtsEventType event_type) {
|
| - switch (event_type) {
|
| - case TTS_EVENT_START:
|
| - return constants::kEventTypeStart;
|
| - case TTS_EVENT_END:
|
| - return constants::kEventTypeEnd;
|
| - case TTS_EVENT_WORD:
|
| - return constants::kEventTypeWord;
|
| - case TTS_EVENT_SENTENCE:
|
| - return constants::kEventTypeSentence;
|
| - case TTS_EVENT_MARKER:
|
| - return constants::kEventTypeMarker;
|
| - case TTS_EVENT_INTERRUPTED:
|
| - return constants::kEventTypeInterrupted;
|
| - case TTS_EVENT_CANCELLED:
|
| - return constants::kEventTypeCancelled;
|
| - case TTS_EVENT_ERROR:
|
| - return constants::kEventTypeError;
|
| - default:
|
| - NOTREACHED();
|
| - return std::string();
|
| - }
|
| +
|
| +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);
|
| }
|
|
|
| -} // namespace
|
|
|
| //
|
| // UtteranceContinuousParameters
|
| @@ -69,6 +46,16 @@ UtteranceContinuousParameters::UtteranceContinuousParameters()
|
|
|
|
|
| //
|
| +// VoiceData
|
| +//
|
| +
|
| +
|
| +VoiceData::VoiceData() {}
|
| +
|
| +VoiceData::~VoiceData() {}
|
| +
|
| +
|
| +//
|
| // Utterance
|
| //
|
|
|
| @@ -79,6 +66,7 @@ Utterance::Utterance(Profile* profile)
|
| : profile_(profile),
|
| id_(next_utterance_id_++),
|
| src_id_(-1),
|
| + event_delegate_(NULL),
|
| can_enqueue_(false),
|
| char_index_(0),
|
| finished_(false) {
|
| @@ -92,43 +80,15 @@ Utterance::~Utterance() {
|
| void Utterance::OnTtsEvent(TtsEventType event_type,
|
| int char_index,
|
| const std::string& error_message) {
|
| - std::string event_type_string = TtsEventTypeToString(event_type);
|
| if (char_index >= 0)
|
| char_index_ = char_index;
|
| - if (event_type == TTS_EVENT_END ||
|
| - event_type == TTS_EVENT_INTERRUPTED ||
|
| - event_type == TTS_EVENT_CANCELLED ||
|
| - event_type == TTS_EVENT_ERROR) {
|
| + if (IsFinalTtsEventType(event_type))
|
| finished_ = true;
|
| - }
|
| - if (desired_event_types_.size() > 0 &&
|
| - desired_event_types_.find(event_type_string) ==
|
| - desired_event_types_.end()) {
|
| - return;
|
| - }
|
|
|
| - if (src_id_ < 0)
|
| - return;
|
| -
|
| - DictionaryValue* details = new DictionaryValue();
|
| - if (char_index != kInvalidCharIndex)
|
| - details->SetInteger(constants::kCharIndexKey, char_index);
|
| - details->SetString(constants::kEventTypeKey, event_type_string);
|
| - if (event_type == TTS_EVENT_ERROR) {
|
| - details->SetString(constants::kErrorMessageKey, error_message);
|
| - }
|
| - details->SetInteger(constants::kSrcIdKey, src_id_);
|
| - details->SetBoolean(constants::kIsFinalEventKey, finished_);
|
| -
|
| - scoped_ptr<ListValue> arguments(new ListValue());
|
| - arguments->Set(0, details);
|
| -
|
| - scoped_ptr<extensions::Event> event(new extensions::Event(
|
| - events::kOnEvent, arguments.Pass()));
|
| - event->restrict_to_profile = profile_;
|
| - event->event_url = src_url_;
|
| - extensions::ExtensionSystem::Get(profile_)->event_router()->
|
| - DispatchEventToExtension(src_extension_id_, event.Pass());
|
| + if (event_delegate_)
|
| + event_delegate_->OnTtsEvent(this, event_type, char_index, error_message);
|
| + if (finished_)
|
| + event_delegate_ = NULL;
|
| }
|
|
|
| void Utterance::Finish() {
|
| @@ -252,46 +212,35 @@ void TtsController::OnTtsEvent(int utterance_id,
|
| }
|
| }
|
|
|
| -ListValue* TtsController::GetVoices(Profile* profile) {
|
| - ListValue* result_voices = new ListValue();
|
| +void TtsController::GetVoices(Profile* profile,
|
| + std::vector<VoiceData>* out_voices) {
|
| TtsPlatformImpl* platform_impl = GetPlatformImpl();
|
| if (platform_impl && platform_impl->PlatformImplAvailable()) {
|
| - DictionaryValue* result_voice = new DictionaryValue();
|
| - result_voice->SetString(
|
| - constants::kVoiceNameKey, constants::kNativeVoiceName);
|
| - if (!platform_impl->gender().empty())
|
| - result_voice->SetString(constants::kGenderKey, platform_impl->gender());
|
| - ListValue* event_types = new ListValue();
|
| + out_voices->push_back(VoiceData());
|
| + VoiceData& voice = out_voices->back();
|
| + voice.name = constants::kNativeVoiceName;
|
| + voice.gender = platform_impl->gender();
|
|
|
| // All platforms must send end events, and cancelled and interrupted
|
| // events are generated from the controller.
|
| DCHECK(platform_impl->SendsEvent(TTS_EVENT_END));
|
| - event_types->Append(Value::CreateStringValue(constants::kEventTypeEnd));
|
| - event_types->Append(Value::CreateStringValue(
|
| - constants::kEventTypeCancelled));
|
| - event_types->Append(Value::CreateStringValue(
|
| - constants::kEventTypeInterrupted));
|
| + voice.events.push_back(constants::kEventTypeEnd);
|
| + voice.events.push_back(constants::kEventTypeCancelled);
|
| + voice.events.push_back(constants::kEventTypeInterrupted);
|
|
|
| if (platform_impl->SendsEvent(TTS_EVENT_START))
|
| - event_types->Append(Value::CreateStringValue(constants::kEventTypeStart));
|
| + voice.events.push_back(constants::kEventTypeStart);
|
| if (platform_impl->SendsEvent(TTS_EVENT_WORD))
|
| - event_types->Append(Value::CreateStringValue(constants::kEventTypeWord));
|
| + voice.events.push_back(constants::kEventTypeWord);
|
| if (platform_impl->SendsEvent(TTS_EVENT_SENTENCE))
|
| - event_types->Append(Value::CreateStringValue(
|
| - constants::kEventTypeSentence));
|
| + voice.events.push_back(constants::kEventTypeSentence);
|
| if (platform_impl->SendsEvent(TTS_EVENT_MARKER))
|
| - event_types->Append(Value::CreateStringValue(
|
| - constants::kEventTypeMarker));
|
| + voice.events.push_back(constants::kEventTypeMarker);
|
| if (platform_impl->SendsEvent(TTS_EVENT_ERROR))
|
| - event_types->Append(Value::CreateStringValue(
|
| - constants::kEventTypeError));
|
| - result_voice->Set(constants::kEventTypesKey, event_types);
|
| - result_voices->Append(result_voice);
|
| + voice.events.push_back(constants::kEventTypeError);
|
| }
|
|
|
| - GetExtensionVoices(profile, result_voices);
|
| -
|
| - return result_voices;
|
| + GetExtensionVoices(profile, out_voices);
|
| }
|
|
|
| bool TtsController::IsSpeaking() {
|
|
|