diff options
| author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2011-04-22 17:59:43 +0000 |
|---|---|---|
| committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2011-04-22 17:59:43 +0000 |
| commit | c6a8efb8afb848e0001eacdb8376f1aa46a33733 (patch) | |
| tree | 208aac2290492d44dd2cb4ae2436db1bd55cc2a6 | |
| parent | afa6afc3bcb1337b842cab30280ad400d3e0668b (diff) | |
| download | rockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.zip rockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.tar.gz rockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.tar.bz2 rockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.tar.xz | |
Implement simple run for non-multithreaded TTS.
Since setting the maximum number of threads to use to 1 causes sporadically
files missing add a simple alternative implementation that doesn't use futures.
This is a stop-gap solution to fix voice files not creating (reported on
Windows with SAPI voices, see FS#11994). Encoding doesn't seem to be affected
by the problem and is unchanged.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29762 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | rbutil/rbutilqt/base/talkgenerator.cpp | 75 | ||||
| -rw-r--r-- | rbutil/rbutilqt/base/talkgenerator.h | 1 |
2 files changed, 49 insertions, 27 deletions
diff --git a/rbutil/rbutilqt/base/talkgenerator.cpp b/rbutil/rbutilqt/base/talkgenerator.cpp index f1aa783..9b0cbf4 100644 --- a/rbutil/rbutilqt/base/talkgenerator.cpp +++ b/rbutil/rbutilqt/base/talkgenerator.cpp @@ -24,7 +24,7 @@ TalkGenerator::TalkGenerator(QObject* parent): QObject(parent), encFutureWatcher(this), ttsFutureWatcher(this) { - + m_userAborted = false; } //! \brief Creates Talkfiles. @@ -126,32 +126,52 @@ TalkGenerator::Status TalkGenerator::voiceList(QList<TalkEntry>* list,int wavtri } /* If the engine can't be parallelized, we use only 1 thread */ - int maxThreadCount = QThreadPool::globalInstance()->maxThreadCount(); - if ((m_tts->capabilities() & TTSBase::RunInParallel) == 0) - QThreadPool::globalInstance()->setMaxThreadCount(1); - qDebug() << "[TalkGenerator] Maximum number of threads used:" - << QThreadPool::globalInstance()->maxThreadCount(); - - connect(&ttsFutureWatcher, SIGNAL(progressValueChanged(int)), - this, SLOT(ttsProgress(int))); - ttsFutureWatcher.setFuture(QtConcurrent::map(*list, &TalkGenerator::ttsEntryPoint)); - - /* We use this loop as an equivalent to ttsFutureWatcher.waitForFinished() - * since the latter blocks all events */ - while(ttsFutureWatcher.isRunning()) - QCoreApplication::processEvents(); - - /* Restore global settings, if we changed them */ - if ((m_tts->capabilities() & TTSBase::RunInParallel) == 0) - QThreadPool::globalInstance()->setMaxThreadCount(maxThreadCount); - - if(ttsFutureWatcher.isCanceled()) - return eERROR; - else if(m_ttsWarnings) - return eWARNING; - else - return eOK; -} + // NOTE: setting the number of maximum threads to use to 1 doesn't seem to + // work as expected -- it causes sporadically output files missing (see + // FS#11994). As a stop-gap solution use a separate implementation in that + // case for running the TTS. + if((m_tts->capabilities() & TTSBase::RunInParallel) != 0) + { + int maxThreadCount = QThreadPool::globalInstance()->maxThreadCount(); + qDebug() << "[TalkGenerator] Maximum number of threads used:" + << QThreadPool::globalInstance()->maxThreadCount(); + + connect(&ttsFutureWatcher, SIGNAL(progressValueChanged(int)), + this, SLOT(ttsProgress(int))); + ttsFutureWatcher.setFuture(QtConcurrent::map(*list, &TalkGenerator::ttsEntryPoint)); + + /* We use this loop as an equivalent to ttsFutureWatcher.waitForFinished() + * since the latter blocks all events */ + while(ttsFutureWatcher.isRunning()) + QCoreApplication::processEvents(); + + /* Restore global settings, if we changed them */ + if ((m_tts->capabilities() & TTSBase::RunInParallel) == 0) + QThreadPool::globalInstance()->setMaxThreadCount(maxThreadCount); + + if(ttsFutureWatcher.isCanceled()) + return eERROR; + else if(m_ttsWarnings) + return eWARNING; + else + return eOK; + } + else { + qDebug() << "[TalkGenerator] Using single thread TTS workaround"; + int items = list->size(); + for(int i = 0; i < items; i++) { + if(m_userAborted) { + emit logItem(tr("Voicing aborted"), LOGERROR); + return eERROR; + } + TalkEntry entry = list->at(i); + TalkGenerator::ttsEntryPoint(entry); + (*list)[i] = entry; + emit logProgress(i, items); + } + return m_ttsWarnings ? eWARNING : eOK; + } +} void TalkGenerator::ttsEntryPoint(TalkEntry& entry) { @@ -279,5 +299,6 @@ void TalkGenerator::abort() encFutureWatcher.cancel(); emit logItem(tr("Encoding aborted"), LOGERROR); } + m_userAborted = true; } diff --git a/rbutil/rbutilqt/base/talkgenerator.h b/rbutil/rbutilqt/base/talkgenerator.h index cca196b..d0cbcd0 100644 --- a/rbutil/rbutilqt/base/talkgenerator.h +++ b/rbutil/rbutilqt/base/talkgenerator.h @@ -94,6 +94,7 @@ private: EncBase* m_enc; bool m_ttsWarnings; + bool m_userAborted; }; |