| Index: chrome/browser/extensions/extension_tts_api.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_tts_api.cc (revision 56764)
|
| +++ chrome/browser/extensions/extension_tts_api.cc (working copy)
|
| @@ -7,19 +7,84 @@
|
| #include <string>
|
|
|
| #include "base/values.h"
|
| +#include "base/string_number_conversions.h"
|
|
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
| #include "chrome/browser/chromeos/cros/speech_synthesis_library.h"
|
|
|
| +using base::DoubleToString;
|
| +
|
| +const char kNameKey[] = "name";
|
| +const char kLanguageNameKey[] = "languageName";
|
| +const char kGenderKey[] = "gender";
|
| +const char kRateKey[] = "rate";
|
| +const char kPitchKey[] = "pitch";
|
| +const char kVolumeKey[] = "volume";
|
| +const char kEqualStr[] = "=";
|
| +const char kDelimiter[] = ";";
|
| +
|
| namespace {
|
| const char kCrosLibraryNotLoadedError[] =
|
| "Cros shared library not loaded.";
|
| +
|
| + bool ReadNumberByKey(DictionaryValue* dict, const char* key,
|
| + double* ret_value) {
|
| + Value* value;
|
| + dict->Get(key, &value);
|
| + if (value->IsType(Value::TYPE_INTEGER)) {
|
| + int int_value;
|
| + if (!dict->GetInteger(key, &int_value))
|
| + return false;
|
| + *ret_value = int_value;
|
| + } else if (value->IsType(Value::TYPE_REAL)) {
|
| + if (!dict->GetReal(key, ret_value))
|
| + return false;
|
| + } else {
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + void AppendSpeakOption(std::string key, std::string value,
|
| + std::string* options) {
|
| + *options += key + kEqualStr + value + kDelimiter;
|
| + }
|
| };
|
|
|
| bool ExtensionTtsSpeakFunction::RunImpl() {
|
| std::string utterance;
|
| + std::string options = "";
|
| + DictionaryValue* speak_options = NULL;
|
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &utterance));
|
| + if (args_->GetDictionary(1, &speak_options)) {
|
| + std::string str_value;
|
| + double real_value;
|
| + if (speak_options->HasKey(kLanguageNameKey) &&
|
| + speak_options->GetString(kLanguageNameKey, &str_value)) {
|
| + AppendSpeakOption(std::string(kNameKey), str_value, &options);
|
| + }
|
| + if (speak_options->HasKey(kGenderKey) &&
|
| + speak_options->GetString(kGenderKey, &str_value)) {
|
| + AppendSpeakOption(std::string(kGenderKey), str_value, &options);
|
| + }
|
| + if (ReadNumberByKey(speak_options, kRateKey, &real_value))
|
| + // The TTS service allows a range of 0 to 5 for speech rate.
|
| + AppendSpeakOption(std::string(kRateKey),
|
| + DoubleToString(real_value * 5), &options);
|
| + if (ReadNumberByKey(speak_options, kPitchKey, &real_value))
|
| + // The TTS service allows a range of 0 to 2 for speech pitch.
|
| + AppendSpeakOption(std::string(kPitchKey),
|
| + DoubleToString(real_value * 2), &options);
|
| + if (ReadNumberByKey(speak_options, kVolumeKey, &real_value))
|
| + // The TTS service allows a range of 0 to 5 for speech volume.
|
| + AppendSpeakOption(std::string(kVolumeKey),
|
| + DoubleToString(real_value * 5), &options);
|
| + }
|
| if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
|
| + if (!options.empty()) {
|
| + chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
|
| + SetSpeakProperties(options.c_str());
|
| + }
|
| bool ret = chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
|
| Speak(utterance.c_str());
|
| result_.reset();
|
|
|