• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/extensions/extension_tts_api.h"
6 
7 #include "base/memory/singleton.h"
8 #include "base/string_number_conversions.h"
9 #include "chrome/browser/chromeos/cros/cros_library.h"
10 #include "chrome/browser/chromeos/cros/speech_synthesis_library.h"
11 
12 namespace util = extension_tts_api_util;
13 
14 using base::DoubleToString;
15 
16 namespace {
17 const char kCrosLibraryNotLoadedError[] = "Cros shared library not loaded.";
18 };
19 
20 class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl {
21  public:
22   virtual bool Speak(
23       const std::string& utterance,
24       const std::string& locale,
25       const std::string& gender,
26       double rate,
27       double pitch,
28       double volume);
29 
30   virtual bool StopSpeaking();
31 
32   virtual bool IsSpeaking();
33 
34   // Get the single instance of this class.
35   static ExtensionTtsPlatformImplChromeOs* GetInstance();
36 
37  private:
ExtensionTtsPlatformImplChromeOs()38   ExtensionTtsPlatformImplChromeOs() {}
~ExtensionTtsPlatformImplChromeOs()39   virtual ~ExtensionTtsPlatformImplChromeOs() {}
40 
41   void AppendSpeakOption(std::string key,
42                          std::string value,
43                          std::string* options);
44 
45   friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplChromeOs>;
46 
47   DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImplChromeOs);
48 };
49 
50 // static
GetInstance()51 ExtensionTtsPlatformImpl* ExtensionTtsPlatformImpl::GetInstance() {
52   return ExtensionTtsPlatformImplChromeOs::GetInstance();
53 }
54 
Speak(const std::string & utterance,const std::string & locale,const std::string & gender,double rate,double pitch,double volume)55 bool ExtensionTtsPlatformImplChromeOs::Speak(
56     const std::string& utterance,
57     const std::string& locale,
58     const std::string& gender,
59     double rate,
60     double pitch,
61     double volume) {
62   chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get();
63   if (!cros_library->EnsureLoaded()) {
64     set_error(kCrosLibraryNotLoadedError);
65     return false;
66   }
67 
68   std::string options;
69 
70   if (!locale.empty()) {
71     AppendSpeakOption(
72         chromeos::SpeechSynthesisLibrary::kSpeechPropertyLocale,
73         locale,
74         &options);
75   }
76 
77   if (!gender.empty()) {
78     AppendSpeakOption(
79         chromeos::SpeechSynthesisLibrary::kSpeechPropertyGender,
80         gender,
81         &options);
82   }
83 
84   if (rate >= 0.0) {
85     AppendSpeakOption(
86         chromeos::SpeechSynthesisLibrary::kSpeechPropertyRate,
87         DoubleToString(rate * 5),
88         &options);
89   }
90 
91   if (pitch >= 0.0) {
92     // The TTS service allows a range of 0 to 2 for speech pitch.
93     AppendSpeakOption(
94         chromeos::SpeechSynthesisLibrary::kSpeechPropertyPitch,
95         DoubleToString(pitch * 2),
96         &options);
97   }
98 
99   if (volume >= 0.0) {
100     // The TTS service allows a range of 0 to 5 for speech volume.
101     AppendSpeakOption(
102         chromeos::SpeechSynthesisLibrary::kSpeechPropertyVolume,
103         DoubleToString(volume * 5),
104         &options);
105   }
106 
107   if (!options.empty()) {
108     cros_library->GetSpeechSynthesisLibrary()->SetSpeakProperties(
109         options.c_str());
110   }
111 
112   return cros_library->GetSpeechSynthesisLibrary()->Speak(utterance.c_str());
113 }
114 
StopSpeaking()115 bool ExtensionTtsPlatformImplChromeOs::StopSpeaking() {
116   if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
117     return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
118         StopSpeaking();
119   }
120 
121   set_error(kCrosLibraryNotLoadedError);
122   return false;
123 }
124 
IsSpeaking()125 bool ExtensionTtsPlatformImplChromeOs::IsSpeaking() {
126   if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
127     return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
128         IsSpeaking();
129   }
130 
131   set_error(kCrosLibraryNotLoadedError);
132   return false;
133 }
134 
AppendSpeakOption(std::string key,std::string value,std::string * options)135 void ExtensionTtsPlatformImplChromeOs::AppendSpeakOption(
136     std::string key,
137     std::string value,
138     std::string* options) {
139   *options +=
140       key +
141       chromeos::SpeechSynthesisLibrary::kSpeechPropertyEquals +
142       value +
143       chromeos::SpeechSynthesisLibrary::kSpeechPropertyDelimiter;
144 }
145 
146 // static
147 ExtensionTtsPlatformImplChromeOs*
GetInstance()148 ExtensionTtsPlatformImplChromeOs::GetInstance() {
149   return Singleton<ExtensionTtsPlatformImplChromeOs>::get();
150 }
151