TtsRemover(Speaker *speaker); void stop();
protected:
virtual void run(); private:
Speaker *speaker; volatile bool stopped; };
/////////////////////////////////////////////////////////////////////////////////// // TTS发音线程,
class SpeakThread : public QThread {
public:
SpeakThread(Speaker *speaker); void stop();
void setSpeakingString(const QString &speakingString);
protected:
virtual void run(); private:
Speaker *speaker; volatile bool stopped; QString speakingString; };
#endif // SPEAKER_H
////////////////////////////////////////////////////////////////////////////////////////////////////// // Speaker.cpp: Qt
//////////////////////////////////////////////////////////////////////////////////////////////////////
#include \
#include
#include
std::auto_ptr
Speaker::Speaker() { ttsLoaded = false; speakEnabled = true;
// Threads
ttsLoader = 0; ttsRemover = 0; speakThread = 0;
// TTS functions
initializeFunc = 0; releaseFunc = 0; speakFunc = 0; }
Speaker::~Speaker() { terminateAllThreads();
delete ttsLoader; delete ttsRemover; delete speakThread;
//这里释放不用线程,而是直接释放 if (ttsLoaded) { removeTts(); } }
Speaker& Speaker::getInstance() { if (instance.get() == 0) {
instance.reset(new Speaker()); }
return *(instance.get()); }
void Speaker::setSpeakEnabled(bool enabled) {
speakEnabled = enabled; }
bool Speaker::isSpeakEnabled() const {
return speakEnabled; }
bool Speaker::isTtsLoaded() const {
return ttsLoaded; }
void Speaker::speak(const QString &str) {
if (ttsLoaded && speakEnabled && (0 != speakThread)) { if (speakThread->isRunning()) {
qDebug() << \; speakThread->stop(); }
qDebug() << \ << str;
speakString(\); // 不加这一句, 不知道为什么不行 speakThread->setSpeakingString(str); speakThread->start(); } }
void Speaker::speakString(const QString &str) {
if (speakFunc != 0) {
speakFunc(str.toUtf8().data()); } }
void Speaker::initializeTts() {
// If tts is loaded, don't need to load again.
if (ttsLoaded) { return; }
// 启动加载线程
// If ttsLoader is not euqal 0, that means ttsLoader is running. // Because after ttsLoader is finished, it will be removed.
if (ttsLoader == 0) {
ttsLoader = new TtsLoader(this);
connect(ttsLoader, SIGNAL(finished()), this, SLOT(completeLoadTts()));
ttsLoader->start(); } }
void Speaker::releaseTts() {
// If tts is not loaded, removing process is not needed.
if (!ttsLoaded) { return; }
if (0 == ttsRemover) {
ttsRemover = new TtsRemover(this);
connect(ttsRemover, SIGNAL(finished()), this, SLOT(completeRemoveTts()));
ttsRemover->start(); } }
void Speaker::loadTts() {
// 如果TTS引擎已经加载了, 就不需要再次加载 if (ttsLoaded) { return; }
QLibrary lib(\); if (lib.load()) {
initializeFunc = (InitializeFunc)lib.resolve(\);

