blob: 0eedcc21dfead84600f11977bce7f0f27c9b5af9 [file] [log] [blame]
// Copyright (c) 2010 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.
#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_
#include <queue>
#include "base/singleton.h"
#include "base/task.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/extensions/extension_tts_api_util.h"
// Abstract class that defines the native platform TTS interface.
class ExtensionTtsPlatformImpl {
public:
static ExtensionTtsPlatformImpl* GetInstance();
// Speak the given utterance with the given parameters if possible,
// and return true on success. Utterance will always be nonempty.
// If the user does not specify the other values, language and gender
// will be empty strings, and rate, pitch, and volume will be -1.0.
//
// The ExtensionTtsController will only try to speak one utterance at
// a time. If it wants to intterupt speech, it will always call Stop
// before speaking again, otherwise it will wait until IsSpeaking
// returns false before calling Speak again.
virtual bool Speak(
const std::string& utterance,
const std::string& language,
const std::string& gender,
double rate,
double pitch,
double volume) = 0;
// Stop speaking immediately and return true on success.
virtual bool StopSpeaking() = 0;
// Return true if the synthesis engine is currently speaking.
virtual bool IsSpeaking() = 0;
virtual std::string error() { return error_; }
virtual void clear_error() { error_ = std::string(); }
virtual void set_error(const std::string& error) { error_ = error; }
protected:
ExtensionTtsPlatformImpl() {}
virtual ~ExtensionTtsPlatformImpl() {}
std::string error_;
DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImpl);
};
// Singleton class that manages text-to-speech.
class ExtensionTtsController {
public:
// Get the single instance of this class.
static ExtensionTtsController* GetInstance();
struct Utterance {
Utterance()
: rate(-1.0),
pitch(-1.0),
volume(-1.0),
success_task(NULL),
failure_task(NULL) {
}
std::string text;
std::string language;
std::string gender;
double rate;
double pitch;
double volume;
Task* success_task;
Task* failure_task;
std::string error;
};
// Returns true if we're currently speaking an utterance.
bool IsSpeaking() const;
// Speak the given utterance. If |can_enqueue| is true and another
// utterance is in progress, adds it to the end of the queue. Otherwise,
// interrupts any current utterance and speaks this one immediately.
void SpeakOrEnqueue(Utterance* utterance, bool can_enqueue);
// Stop all utterances and flush the queue.
void Stop();
// For unit testing.
void SetPlatformImpl(ExtensionTtsPlatformImpl* platform_impl);
private:
ExtensionTtsController();
virtual ~ExtensionTtsController() {}
// Get the platform TTS implementation (or injected mock).
ExtensionTtsPlatformImpl* GetPlatformImpl();
// Start speaking the given utterance. Will either take ownership of
// |utterance| or delete it if there's an error.
void SpeakNow(Utterance* utterance);
// Called periodically when speech is ongoing. Checks to see if the
// underlying platform speech system has finished the current utterance,
// and if so finishes it and pops the next utterance off the queue.
void CheckSpeechStatus();
// Clear the utterance queue.
void ClearUtteranceQueue();
// Finalize and delete the current utterance.
void FinishCurrentUtterance();
ScopedRunnableMethodFactory<ExtensionTtsController> method_factory_;
friend struct DefaultSingletonTraits<ExtensionTtsController>;
// The current utterance being spoken.
Utterance* current_utterance_;
// A queue of utterances to speak after the current one finishes.
std::queue<Utterance*> utterance_queue_;
// A pointer to the platform implementation of text-to-speech, for
// dependency injection.
ExtensionTtsPlatformImpl* platform_impl_;
DISALLOW_COPY_AND_ASSIGN(ExtensionTtsController);
};
//
// Extension API function definitions
//
class ExtensionTtsSpeakFunction : public AsyncExtensionFunction {
private:
~ExtensionTtsSpeakFunction() {}
virtual bool RunImpl();
void SpeechFinished(bool success);
ExtensionTtsController::Utterance* utterance_;
DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.speak")
};
class ExtensionTtsStopSpeakingFunction : public SyncExtensionFunction {
private:
~ExtensionTtsStopSpeakingFunction() {}
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.stop")
};
class ExtensionTtsIsSpeakingFunction : public SyncExtensionFunction {
private:
~ExtensionTtsIsSpeakingFunction() {}
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.isSpeaking")
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_