rbutilqt: made the sapi TTS more configurable, you can now select a specific voice...
[Rockbox.git] / rbutil / rbutilqt / talkfile.cpp
blob89166daa90663b311041c1609300fe88eb9e0a22
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2007 by Dominik Wenger
10 * $Id$
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "talkfile.h"
22 TalkFileCreator::TalkFileCreator(QObject* parent): QObject(parent)
27 bool TalkFileCreator::createTalkFiles(ProgressloggerInterface* logger)
29 m_abort = false;
30 m_logger = logger;
31 m_logger->addItem(tr("Starting Talk file generation"),LOGINFO);
33 //tts
34 m_tts = getTTS(userSettings->value("tts").toString());
35 m_tts->setCfg(userSettings,deviceSettings);
37 QString errStr;
38 if(!m_tts->start(&errStr))
40 m_logger->addItem(errStr,LOGERROR);
41 m_logger->addItem(tr("Init of TTS engine failed"),LOGERROR);
42 m_logger->abort();
43 return false;
46 // Encoder
47 m_enc = getEncoder(userSettings->value("encoder").toString());
48 m_enc->setUserCfg(userSettings);
50 if(!m_enc->start())
52 m_logger->addItem(tr("Init of Encoder engine failed"),LOGERROR);
53 m_logger->abort();
54 m_tts->stop();
55 return false;
58 QApplication::processEvents();
60 connect(logger,SIGNAL(aborted()),this,SLOT(abort()));
61 m_logger->setProgressMax(0);
62 QDirIterator it(m_dir,QDirIterator::Subdirectories);
63 QSettings installlog(m_mountpoint + "/.rockbox/rbutil.log", QSettings::IniFormat, 0);
64 installlog.beginGroup("talkfiles");
65 // iterate over all entrys
66 while (it.hasNext())
68 if(m_abort)
70 m_logger->addItem(tr("Talk file creation aborted"),LOGERROR);
71 m_logger->abort();
72 m_tts->stop();
73 return false;
76 QApplication::processEvents();
77 QFileInfo fileInf = it.fileInfo();
78 QString toSpeak;
79 QString filename;
80 QString wavfilename;
82 QString path = fileInf.filePath();
83 qDebug() << path;
85 if( path.endsWith("..") || path.endsWith(".talk") )
87 it.next();
88 continue;
91 //! if it is a dir
92 if(fileInf.isDir())
94 // skip entry if folder talking isnt enabled
95 if(m_talkFolders == false)
97 it.next();
98 continue;
100 int index1 = path.lastIndexOf("/");
101 int index2 = path.lastIndexOf("/",index1-1);
103 toSpeak = path.mid(index2+1,(index1-index2)-1);
105 filename = path.left(index1) + "/_dirname.talk";
106 qDebug() << "toSpeak: " << toSpeak << "filename: " << filename;
108 else // if it is a file
110 // skip entry if file talking isnt enabled
111 if(m_talkFiles == false)
113 it.next();
114 continue;
116 if(m_stripExtensions)
117 toSpeak = fileInf.baseName();
118 else
119 toSpeak = fileInf.fileName();
120 filename = fileInf.absoluteFilePath() + ".talk";
122 wavfilename = filename + ".wav";
124 QFileInfo filenameInf(filename);
125 QFileInfo wavfilenameInf(wavfilename);
127 //! the actual generation of the .talk files
128 if(!filenameInf.exists() || m_overwriteTalk)
130 if(!wavfilenameInf.exists() || m_overwriteWav)
132 m_logger->addItem(tr("Voicing of %1").arg(toSpeak),LOGINFO);
133 if(!m_tts->voice(toSpeak,wavfilename))
135 m_logger->addItem(tr("Voicing of %s failed").arg(toSpeak),LOGERROR);
136 m_logger->abort();
137 m_tts->stop();
138 m_enc->stop();
139 return false;
141 QApplication::processEvents();
143 m_logger->addItem(tr("Encoding of %1").arg(toSpeak),LOGINFO);
144 if(!m_enc->encode(wavfilename,filename))
146 m_logger->addItem(tr("Encoding of %1 failed").arg(wavfilename),LOGERROR);
147 m_logger->abort();
148 m_tts->stop();
149 m_enc->stop();
150 return false;
152 QApplication::processEvents();
155 //! remove the intermedia wav file, if requested
156 QString now = QDate::currentDate().toString("yyyyMMdd");
157 if(m_removeWav)
159 QFile wavfile(wavfilename);
160 wavfile.remove();
161 installlog.remove(wavfilename);
163 else
164 installlog.setValue(wavfilename.remove(0,m_mountpoint.length()),now);
166 //! add the .talk file to the install log
167 installlog.setValue(filename.remove(0,m_mountpoint.length()),now);
168 it.next();
171 installlog.endGroup();
172 m_tts->stop();
173 m_logger->addItem(tr("Finished creating Talk files"),LOGOK);
174 m_logger->setProgressMax(1);
175 m_logger->setProgressValue(1);
176 m_logger->abort();
178 return true;
182 void TalkFileCreator::abort()
184 m_abort = true;