summaryrefslogtreecommitdiffstats
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2011-04-22 17:59:43 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2011-04-22 17:59:43 +0000
commitc6a8efb8afb848e0001eacdb8376f1aa46a33733 (patch)
tree208aac2290492d44dd2cb4ae2436db1bd55cc2a6 /rbutil
parentafa6afc3bcb1337b842cab30280ad400d3e0668b (diff)
downloadrockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.tar.gz
rockbox-c6a8efb8afb848e0001eacdb8376f1aa46a33733.zip
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
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/base/talkgenerator.cpp75
-rw-r--r--rbutil/rbutilqt/base/talkgenerator.h1
2 files changed, 49 insertions, 27 deletions
diff --git a/rbutil/rbutilqt/base/talkgenerator.cpp b/rbutil/rbutilqt/base/talkgenerator.cpp
index f1aa783281..9b0cbf4066 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 cca196bc2e..d0cbcd0af3 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;
};