Chromium Code Reviews| Index: chrome/browser/extensions/extension_tts_api_chromeos.cc |
| diff --git a/chrome/browser/extensions/extension_tts_api_chromeos.cc b/chrome/browser/extensions/extension_tts_api_chromeos.cc |
| index e421897ff0db144bc7b98f741a5f971b7084d59c..6efc6cfee8fe6ef91caf91bd3afeed370b9917d2 100644 |
| --- a/chrome/browser/extensions/extension_tts_api_chromeos.cc |
| +++ b/chrome/browser/extensions/extension_tts_api_chromeos.cc |
| @@ -2,19 +2,19 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include "base/bind.h" |
| #include "base/memory/singleton.h" |
| #include "base/message_loop.h" |
| #include "base/string_number_conversions.h" |
| #include "base/task.h" |
| -#include "chrome/browser/chromeos/cros/cros_library.h" |
| -#include "chrome/browser/chromeos/cros/speech_synthesis_library.h" |
| +#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
| +#include "chrome/browser/chromeos/dbus/speech_synthesizer_client.h" |
| #include "chrome/browser/extensions/extension_tts_api_controller.h" |
| #include "chrome/browser/extensions/extension_tts_api_platform.h" |
| using base::DoubleToString; |
| namespace { |
| -const char kCrosLibraryNotLoadedError[] = "Cros shared library not loaded."; |
| const int kSpeechCheckDelayIntervalMs = 100; |
| }; |
| @@ -39,10 +39,12 @@ class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl { |
| private: |
| ExtensionTtsPlatformImplChromeOs() |
| - : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {} |
| + : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
| + ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {} |
| virtual ~ExtensionTtsPlatformImplChromeOs() {} |
| void PollUntilSpeechFinishes(int utterance_id); |
| + void ContinuePollingIfSpeechIsNotFinished(int utterance_id, bool result); |
| void AppendSpeakOption(std::string key, |
| std::string value, |
| @@ -51,6 +53,7 @@ class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl { |
| int utterance_id_; |
| int utterance_length_; |
| ScopedRunnableMethodFactory<ExtensionTtsPlatformImplChromeOs> method_factory_; |
| + base::WeakPtrFactory<ExtensionTtsPlatformImplChromeOs> weak_ptr_factory_; |
| friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplChromeOs>; |
| @@ -67,12 +70,6 @@ bool ExtensionTtsPlatformImplChromeOs::Speak( |
| const std::string& utterance, |
| const std::string& lang, |
| const UtteranceContinuousParameters& params) { |
| - chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get(); |
| - if (!cros_library->EnsureLoaded()) { |
| - set_error(kCrosLibraryNotLoadedError); |
| - return false; |
| - } |
| - |
| utterance_id_ = utterance_id; |
| utterance_length_ = utterance.size(); |
| @@ -80,14 +77,14 @@ bool ExtensionTtsPlatformImplChromeOs::Speak( |
| if (!lang.empty()) { |
| AppendSpeakOption( |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyLocale, |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyLocale, |
| lang, |
| &options); |
| } |
| if (params.rate >= 0.0) { |
| AppendSpeakOption( |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyRate, |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyRate, |
| DoubleToString(params.rate), |
| &options); |
| } |
| @@ -95,7 +92,7 @@ bool ExtensionTtsPlatformImplChromeOs::Speak( |
| if (params.pitch >= 0.0) { |
| // The TTS service allows a range of 0 to 2 for speech pitch. |
| AppendSpeakOption( |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyPitch, |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyPitch, |
| DoubleToString(params.pitch), |
| &options); |
| } |
| @@ -104,36 +101,29 @@ bool ExtensionTtsPlatformImplChromeOs::Speak( |
| // The Chrome OS TTS service allows a range of 0 to 5 for speech volume, |
| // but 5 clips, so map to a range of 0...4. |
| AppendSpeakOption( |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyVolume, |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyVolume, |
| DoubleToString(params.volume * 4), |
| &options); |
| } |
| - if (!options.empty()) { |
| - cros_library->GetSpeechSynthesisLibrary()->SetSpeakProperties( |
| - options.c_str()); |
| - } |
| + chromeos::SpeechSynthesizerClient* speech_synthesizer_client = |
| + chromeos::DBusThreadManager::Get()->speech_synthesizer_client(); |
| - bool result = |
| - cros_library->GetSpeechSynthesisLibrary()->Speak(utterance.c_str()); |
| + if (!options.empty()) |
| + speech_synthesizer_client->SetSpeakProperties(options); |
| - if (result) { |
| - ExtensionTtsController* controller = ExtensionTtsController::GetInstance(); |
| - controller->OnTtsEvent(utterance_id_, TTS_EVENT_START, 0, std::string()); |
| - PollUntilSpeechFinishes(utterance_id_); |
| - } |
| + speech_synthesizer_client->Speak(utterance); |
|
satorux1
2011/10/18 20:49:25
I was a bit worried about the change here as Speak
hashimoto
2011/10/19 00:08:47
Yes, this change keeps the semantics, nothing is c
|
| + ExtensionTtsController* controller = ExtensionTtsController::GetInstance(); |
| + controller->OnTtsEvent(utterance_id_, TTS_EVENT_START, 0, std::string()); |
| + PollUntilSpeechFinishes(utterance_id_); |
| - return result; |
| + return true; |
| } |
| bool ExtensionTtsPlatformImplChromeOs::StopSpeaking() { |
| - if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { |
| - return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()-> |
| - StopSpeaking(); |
| - } |
| - |
| - set_error(kCrosLibraryNotLoadedError); |
| - return false; |
| + chromeos::DBusThreadManager::Get()->speech_synthesizer_client()-> |
| + StopSpeaking(); |
| + return true; |
| } |
| bool ExtensionTtsPlatformImplChromeOs::SendsEvent(TtsEventType event_type) { |
| @@ -148,22 +138,26 @@ void ExtensionTtsPlatformImplChromeOs::PollUntilSpeechFinishes( |
| // This utterance must have been interrupted or cancelled. |
| return; |
| } |
| + chromeos::SpeechSynthesizerClient* speech_synthesizer_client = |
| + chromeos::DBusThreadManager::Get()->speech_synthesizer_client(); |
| + speech_synthesizer_client->IsSpeaking(base::Bind( |
| + &ExtensionTtsPlatformImplChromeOs::ContinuePollingIfSpeechIsNotFinished, |
| + weak_ptr_factory_.GetWeakPtr(), utterance_id)); |
|
satorux1
2011/10/18 20:49:25
Nice! It's now asynchronous thus not blocking UI.
hashimoto
2011/10/19 00:08:47
I tried to make IsSpeaking synchronous, but gave u
|
| +} |
| - chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get(); |
| - ExtensionTtsController* controller = ExtensionTtsController::GetInstance(); |
| - |
| - if (!cros_library->EnsureLoaded()) { |
| - controller->OnTtsEvent( |
| - utterance_id_, TTS_EVENT_ERROR, 0, kCrosLibraryNotLoadedError); |
| +void ExtensionTtsPlatformImplChromeOs::ContinuePollingIfSpeechIsNotFinished( |
| + int utterance_id, bool is_speaking) { |
| + if (utterance_id != utterance_id_) { |
| + // This utterance must have been interrupted or cancelled. |
| return; |
| } |
| - |
| - if (!cros_library->GetSpeechSynthesisLibrary()->IsSpeaking()) { |
| + if (!is_speaking) { |
| + ExtensionTtsController* controller = ExtensionTtsController::GetInstance(); |
| controller->OnTtsEvent( |
| utterance_id_, TTS_EVENT_END, utterance_length_, std::string()); |
| return; |
| } |
| - |
| + // Contniue polling. |
| MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, method_factory_.NewRunnableMethod( |
| &ExtensionTtsPlatformImplChromeOs::PollUntilSpeechFinishes, |
| @@ -177,9 +171,9 @@ void ExtensionTtsPlatformImplChromeOs::AppendSpeakOption( |
| std::string* options) { |
| *options += |
| key + |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyEquals + |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyEquals + |
| value + |
| - chromeos::SpeechSynthesisLibrary::kSpeechPropertyDelimiter; |
| + chromeos::SpeechSynthesizerClient::kSpeechPropertyDelimiter; |
| } |
| // static |