// Copyright (c) 2011 The Chromium 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 "chrome/browser/extensions/extension_tts_api.h" #include "base/memory/singleton.h" #include "base/string_number_conversions.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/speech_synthesis_library.h" namespace util = extension_tts_api_util; using base::DoubleToString; namespace { const char kCrosLibraryNotLoadedError[] = "Cros shared library not loaded."; }; class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl { public: virtual bool Speak( const std::string& utterance, const std::string& locale, const std::string& gender, double rate, double pitch, double volume); virtual bool StopSpeaking(); virtual bool IsSpeaking(); // Get the single instance of this class. static ExtensionTtsPlatformImplChromeOs* GetInstance(); private: ExtensionTtsPlatformImplChromeOs() {} virtual ~ExtensionTtsPlatformImplChromeOs() {} void AppendSpeakOption(std::string key, std::string value, std::string* options); friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplChromeOs>; DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImplChromeOs); }; // static ExtensionTtsPlatformImpl* ExtensionTtsPlatformImpl::GetInstance() { return ExtensionTtsPlatformImplChromeOs::GetInstance(); } bool ExtensionTtsPlatformImplChromeOs::Speak( const std::string& utterance, const std::string& locale, const std::string& gender, double rate, double pitch, double volume) { chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get(); if (!cros_library->EnsureLoaded()) { set_error(kCrosLibraryNotLoadedError); return false; } std::string options; if (!locale.empty()) { AppendSpeakOption( chromeos::SpeechSynthesisLibrary::kSpeechPropertyLocale, locale, &options); } if (!gender.empty()) { AppendSpeakOption( chromeos::SpeechSynthesisLibrary::kSpeechPropertyGender, gender, &options); } if (rate >= 0.0) { AppendSpeakOption( chromeos::SpeechSynthesisLibrary::kSpeechPropertyRate, DoubleToString(rate * 5), &options); } if (pitch >= 0.0) { // The TTS service allows a range of 0 to 2 for speech pitch. AppendSpeakOption( chromeos::SpeechSynthesisLibrary::kSpeechPropertyPitch, DoubleToString(pitch * 2), &options); } if (volume >= 0.0) { // The TTS service allows a range of 0 to 5 for speech volume. AppendSpeakOption( chromeos::SpeechSynthesisLibrary::kSpeechPropertyVolume, DoubleToString(volume * 5), &options); } if (!options.empty()) { cros_library->GetSpeechSynthesisLibrary()->SetSpeakProperties( options.c_str()); } return cros_library->GetSpeechSynthesisLibrary()->Speak(utterance.c_str()); } bool ExtensionTtsPlatformImplChromeOs::StopSpeaking() { if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()-> StopSpeaking(); } set_error(kCrosLibraryNotLoadedError); return false; } bool ExtensionTtsPlatformImplChromeOs::IsSpeaking() { if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()-> IsSpeaking(); } set_error(kCrosLibraryNotLoadedError); return false; } void ExtensionTtsPlatformImplChromeOs::AppendSpeakOption( std::string key, std::string value, std::string* options) { *options += key + chromeos::SpeechSynthesisLibrary::kSpeechPropertyEquals + value + chromeos::SpeechSynthesisLibrary::kSpeechPropertyDelimiter; } // static ExtensionTtsPlatformImplChromeOs* ExtensionTtsPlatformImplChromeOs::GetInstance() { return Singleton<ExtensionTtsPlatformImplChromeOs>::get(); }