summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/base/talkfile.cpp
diff options
context:
space:
mode:
authorDominik Wenger <domonoky@googlemail.com>2009-06-26 20:40:51 +0000
committerDominik Wenger <domonoky@googlemail.com>2009-06-26 20:40:51 +0000
commit20bf8aaf181dc5f24bad2628953c4d53782533cb (patch)
tree640787672cbe49dbbb23b8322d5a90595c2edf06 /rbutil/rbutilqt/base/talkfile.cpp
parent73d25744fb01844cc28402dfc4b48a030d270579 (diff)
downloadrockbox-20bf8aaf181dc5f24bad2628953c4d53782533cb.tar.gz
rockbox-20bf8aaf181dc5f24bad2628953c4d53782533cb.tar.bz2
rockbox-20bf8aaf181dc5f24bad2628953c4d53782533cb.zip
rbutil: improve voice and talk generation.
- introduce a talkgenerator to better share code between voice and talk generation. - name intermediate .talkfiles after the md5sum of the text. (prevents naming problems). - do not directly use the logger, instead emit signals. - move talkfile and voicefile generation to base/ git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21524 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/base/talkfile.cpp')
-rw-r--r--rbutil/rbutilqt/base/talkfile.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/base/talkfile.cpp b/rbutil/rbutilqt/base/talkfile.cpp
new file mode 100644
index 0000000000..81dcf01ff5
--- /dev/null
+++ b/rbutil/rbutilqt/base/talkfile.cpp
@@ -0,0 +1,263 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2007 by Dominik Wenger
+ * $Id$
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "talkfile.h"
+#include "rbsettings.h"
+
+TalkFileCreator::TalkFileCreator(QObject* parent): QObject(parent)
+{
+
+}
+
+//! \brief Creates Talkfiles.
+//!
+//! \param logger A pointer to a Loggerobject
+bool TalkFileCreator::createTalkFiles()
+{
+ m_abort = false;
+ QString errStr;
+
+ emit logItem(tr("Starting Talk file generation"),LOGINFO);
+ emit logProgress(0,0);
+ QCoreApplication::processEvents();
+
+ // read in Maps of paths - file/dirnames
+ emit logItem(tr("Reading Filelist..."),LOGINFO);
+ if(createTalkList(m_dir) == false)
+ {
+ emit logItem(tr("Talk file creation aborted"),LOGERROR);
+ doAbort();
+ return false;
+ }
+ QCoreApplication::processEvents();
+
+ // generate entries
+ {
+ TalkGenerator generator(this);
+ connect(&generator,SIGNAL(done(bool)),this,SIGNAL(done(bool)));
+ connect(&generator,SIGNAL(logItem(QString,int)),this,SIGNAL(logItem(QString,int)));
+ connect(&generator,SIGNAL(logProgress(int,int)),this,SIGNAL(logProgress(int,int)));
+ connect(this,SIGNAL(aborted()),&generator,SLOT(abort()));
+
+ if(generator.process(&m_talkList) == TalkGenerator::eERROR)
+ {
+ doAbort();
+ return false;
+ }
+ }
+
+ // Copying talk files
+ emit logItem(tr("Copying Talkfiles..."),LOGINFO);
+ if(copyTalkFiles(&errStr) == false)
+ {
+ emit logItem(errStr,LOGERROR);
+ doAbort();
+ return false;
+ }
+
+ // Deleting left overs
+ if( !cleanup())
+ return false;
+
+ emit logItem(tr("Finished creating Talk files"),LOGOK);
+ emit logProgress(1,1);
+ emit done(false);
+
+ return true;
+}
+
+//! \brief Strips everything after and including the last dot in a string. If there is no dot, nothing is changed
+//!
+//! \param filename The filename from which to strip the Extension
+//! \returns the modified string
+QString TalkFileCreator::stripExtension(QString filename)
+{
+ if(filename.lastIndexOf(".") != -1)
+ return filename.left(filename.lastIndexOf("."));
+ else
+ return filename;
+}
+
+//! \brief Does needed Tasks when we need to abort. Cleans up Files. Stops the Logger, Stops TTS and Encoder
+//!
+void TalkFileCreator::doAbort()
+{
+ cleanup();
+ emit logProgress(0,1);
+ emit done(true);
+}
+//! \brief creates a list of what to generate
+//!
+//! \param startDir The directory from which to start scanning
+bool TalkFileCreator::createTalkList(QDir startDir)
+{
+ m_talkList.clear();
+
+ // create Iterator
+ QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags;
+ if(m_recursive)
+ flags = QDirIterator::Subdirectories;
+
+ QDirIterator it(startDir,flags);
+
+ //create temp directory
+ QDir tempDir(QDir::tempPath()+ "/talkfiles/");
+ if(!tempDir.exists())
+ tempDir.mkpath(QDir::tempPath()+ "/talkfiles/");
+
+ // read in Maps of paths - file/dirnames
+ while (it.hasNext())
+ {
+ it.next();
+ if(m_abort)
+ {
+ return false;
+ }
+
+ QFileInfo fileInf = it.fileInfo();
+
+ // its a dir
+ if(fileInf.isDir())
+ {
+ QDir dir = fileInf.dir();
+
+ // insert into List
+ if(!dir.dirName().isEmpty() && m_talkFolders)
+ {
+ TalkGenerator::TalkEntry entry;
+ entry.toSpeak = dir.dirName();
+ entry.wavfilename = QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry.toSpeak.toUtf8(),
+ QCryptographicHash::Md5).toHex() + ".wav";
+ entry.talkfilename = QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry.toSpeak.toUtf8(),
+ QCryptographicHash::Md5).toHex() + ".talk";
+ entry.target = dir.path() + "/_dirname.talk";
+ entry.voiced = false;
+ entry.encoded = false;
+ qDebug() << "toSpeak: " << entry.toSpeak << " target: " << entry.target << " intermediates: " <<
+ entry.wavfilename << entry.talkfilename;
+ m_talkList.append(entry);
+ }
+ }
+ else // its a File
+ {
+ // insert into List
+ if( !fileInf.fileName().isEmpty() && !fileInf.fileName().endsWith(".talk") && m_talkFiles)
+ {
+ TalkGenerator::TalkEntry entry;
+ if(m_stripExtensions)
+ entry.toSpeak = stripExtension(fileInf.fileName());
+ else
+ entry.toSpeak = fileInf.fileName();
+ entry.wavfilename = QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry.toSpeak.toUtf8(),
+ QCryptographicHash::Md5).toHex() + ".wav";
+ entry.talkfilename = QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry.toSpeak.toUtf8(),
+ QCryptographicHash::Md5).toHex() + ".talk";
+ entry.target = fileInf.path() + "/" + fileInf.fileName() + ".talk";
+ entry.voiced = false;
+ entry.encoded = false;
+ qDebug() << "toSpeak: " << entry.toSpeak << " target: " << entry.target << " intermediates: " <<
+ entry.wavfilename << entry.talkfilename;
+ m_talkList.append(entry);
+ }
+ }
+ QCoreApplication::processEvents();
+ }
+ return true;
+}
+
+
+//! \brief copys Talkfiles from the temp dir to the target. Progress and installlog is handled inside
+//!
+//! \param errString Pointer to a QString where the error cause is written.
+//! \returns true on success, false on error or user abort
+bool TalkFileCreator::copyTalkFiles(QString* errString)
+{
+ int progressMax = m_talkList.size();
+ int m_progress = 0;
+ emit logProgress(m_progress,progressMax);
+
+ QSettings installlog(m_mountpoint + "/.rockbox/rbutil.log", QSettings::IniFormat, 0);
+ installlog.beginGroup("talkfiles");
+
+ for(int i=0; i < m_talkList.size(); i++)
+ {
+ if(m_abort)
+ {
+ *errString = tr("File copy aborted");
+ return false;
+ }
+
+ // skip not encoded files
+ if(m_talkList[i].encoded == false)
+ {
+ emit logProgress(++m_progress,progressMax);
+ continue; // this file was skipped in one of the previous steps
+ }
+ // remove target if it exists, and if we should overwrite it
+ if(m_overwriteTalk && QFile::exists(m_talkList[i].target))
+ QFile::remove(m_talkList[i].target);
+
+ // copying
+ qDebug() << "copying " << m_talkList[i].talkfilename << "to" << m_talkList[i].target;
+ if(!QFile::copy(m_talkList[i].talkfilename,m_talkList[i].target))
+ {
+ *errString = tr("Copying of %1 to %2 failed").arg(m_talkList[i].talkfilename).arg(m_talkList[i].target);
+ return false;
+ }
+
+ // add to installlog
+ QString now = QDate::currentDate().toString("yyyyMMdd");
+ installlog.setValue(m_talkList[i].target.remove(0,m_mountpoint.length()),now);
+
+ emit logProgress(++m_progress,progressMax);
+ QCoreApplication::processEvents();
+ }
+ installlog.endGroup();
+ installlog.sync();
+ return true;
+}
+
+
+//! \brief Cleans up Files potentially left in the temp dir
+//!
+bool TalkFileCreator::cleanup()
+{
+ emit logItem(tr("Cleaning up.."),LOGINFO);
+
+ for(int i=0; i < m_talkList.size(); i++)
+ {
+ if(QFile::exists(m_talkList[i].wavfilename))
+ QFile::remove(m_talkList[i].wavfilename);
+ if(QFile::exists(m_talkList[i].talkfilename))
+ QFile::remove(m_talkList[i].talkfilename);
+
+ QCoreApplication::processEvents();
+ }
+ emit logItem(tr("Finished"),LOGINFO);
+ return true;
+}
+
+//! \brief slot, which is connected to the abort of the Logger. Sets a flag, so Creating Talkfiles ends at the next possible position
+//!
+void TalkFileCreator::abort()
+{
+ m_abort = true;
+ emit aborted();
+}
+