04f1eaf4f0
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15212 a1c6a512-1295-4272-9138-f99709370657
264 lines
7.1 KiB
C++
264 lines
7.1 KiB
C++
/***************************************************************************
|
|
* __________ __ ___.
|
|
* 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"
|
|
|
|
TalkFileCreator::TalkFileCreator(QObject* parent): QObject(parent)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
bool TalkFileCreator::initEncoder()
|
|
{
|
|
QFileInfo enc(m_EncExec);
|
|
if(enc.exists())
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
bool TalkFileCreator::createTalkFiles(ProgressloggerInterface* logger)
|
|
{
|
|
m_abort = false;
|
|
m_logger = logger;
|
|
m_logger->addItem("Starting Talk file generation",LOGINFO);
|
|
|
|
if(m_curTTS == "sapi")
|
|
m_tts = new TTSSapi();
|
|
else
|
|
m_tts = new TTSExes();
|
|
|
|
m_tts->setTTSexe(m_TTSexec);
|
|
m_tts->setTTsOpts(m_TTSOpts);
|
|
m_tts->setTTsLanguage(m_TTSLanguage);
|
|
m_tts->setTTsTemplate(m_curTTSTemplate);
|
|
|
|
if(!m_tts->start())
|
|
{
|
|
m_logger->addItem("Init of TTS engine failed",LOGERROR);
|
|
return false;
|
|
}
|
|
if(!initEncoder())
|
|
{
|
|
m_logger->addItem("Init of encoder failed",LOGERROR);
|
|
m_tts->stop();
|
|
return false;
|
|
}
|
|
QApplication::processEvents();
|
|
|
|
connect(logger,SIGNAL(aborted()),this,SLOT(abort()));
|
|
m_logger->setProgressMax(0);
|
|
QDirIterator it(m_dir,QDirIterator::Subdirectories);
|
|
QSettings installlog(m_mountpoint + "/.rockbox/rbutil.log", QSettings::IniFormat, 0);
|
|
installlog.beginGroup("talkfiles");
|
|
// iterate over all entrys
|
|
while (it.hasNext())
|
|
{
|
|
if(m_abort)
|
|
{
|
|
m_logger->addItem("Talk file creation aborted",LOGERROR);
|
|
m_tts->stop();
|
|
return false;
|
|
}
|
|
|
|
QApplication::processEvents();
|
|
QFileInfo fileInf = it.fileInfo();
|
|
QString toSpeak;
|
|
QString filename;
|
|
QString wavfilename;
|
|
|
|
//! skip dotdot and .talk files
|
|
if(fileInf.fileName() == ".." || fileInf.suffix() == "talk")
|
|
{
|
|
it.next();
|
|
continue;
|
|
}
|
|
//! if it is a dir
|
|
if(fileInf.isDir())
|
|
{
|
|
// skip entry if folder talking isnt enabled
|
|
if(m_talkFolders == false)
|
|
{
|
|
it.next();
|
|
continue;
|
|
}
|
|
toSpeak = fileInf.absoluteDir().dirName();
|
|
filename = fileInf.absolutePath() + "/_dirname.talk";
|
|
}
|
|
else // if it is a file
|
|
{
|
|
// skip entry if file talking isnt enabled
|
|
if(m_talkFiles == false)
|
|
{
|
|
it.next();
|
|
continue;
|
|
}
|
|
if(m_stripExtensions)
|
|
toSpeak = fileInf.baseName();
|
|
else
|
|
toSpeak = fileInf.fileName();
|
|
filename = fileInf.absoluteFilePath() + ".talk";
|
|
}
|
|
wavfilename = filename + ".wav";
|
|
|
|
QFileInfo filenameInf(filename);
|
|
QFileInfo wavfilenameInf(wavfilename);
|
|
|
|
//! the actual generation of the .talk files
|
|
if(!filenameInf.exists() || m_overwriteTalk)
|
|
{
|
|
if(!wavfilenameInf.exists() || m_overwriteWav)
|
|
{
|
|
m_logger->addItem("Voicing of " + toSpeak,LOGINFO);
|
|
if(!m_tts->voice(toSpeak,wavfilename))
|
|
{
|
|
m_logger->addItem("Voicing of " + toSpeak + " failed",LOGERROR);
|
|
m_logger->abort();
|
|
m_tts->stop();
|
|
return false;
|
|
}
|
|
}
|
|
m_logger->addItem("Encoding of " + toSpeak,LOGINFO);
|
|
if(!encode(wavfilename,filename))
|
|
{
|
|
m_logger->addItem("Encoding of " + wavfilename + " failed",LOGERROR);
|
|
m_logger->abort();
|
|
m_tts->stop();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//! remove the intermedia wav file, if requested
|
|
QString now = QDate::currentDate().toString("yyyyMMdd");
|
|
if(m_removeWav)
|
|
{
|
|
QFile wavfile(wavfilename);
|
|
wavfile.remove();
|
|
installlog.remove(wavfilename);
|
|
}
|
|
else
|
|
installlog.setValue(wavfilename.remove(0,m_mountpoint.length()),now);
|
|
|
|
//! add the .talk file to the install log
|
|
installlog.setValue(filename.remove(0,m_mountpoint.length()),now);
|
|
it.next();
|
|
}
|
|
|
|
installlog.endGroup();
|
|
m_tts->stop();
|
|
m_logger->addItem("Finished creating Talk files",LOGOK);
|
|
m_logger->setProgressMax(1);
|
|
m_logger->setProgressValue(1);
|
|
m_logger->abort();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
void TalkFileCreator::abort()
|
|
{
|
|
m_abort = true;
|
|
}
|
|
|
|
bool TalkFileCreator::encode(QString input,QString output)
|
|
{
|
|
qDebug() << "encoding..";
|
|
QString execstring = m_curEncTemplate;
|
|
|
|
execstring.replace("%exe",m_EncExec);
|
|
execstring.replace("%options",m_EncOpts);
|
|
execstring.replace("%input",input);
|
|
execstring.replace("%output",output);
|
|
qDebug() << execstring;
|
|
QProcess::execute(execstring);
|
|
return true;
|
|
|
|
}
|
|
|
|
bool TTSSapi::start()
|
|
{
|
|
QFileInfo tts(m_TTSexec);
|
|
if(!tts.exists())
|
|
return false;
|
|
|
|
// create the voice process
|
|
QString execstring = m_TTSTemplate;
|
|
execstring.replace("%exe",m_TTSexec);
|
|
execstring.replace("%options",m_TTSOpts);
|
|
execstring.replace("%lang",m_TTSLanguage);
|
|
qDebug() << "init" << execstring;
|
|
voicescript = new QProcess(NULL);
|
|
voicescript->start(execstring);
|
|
if(!voicescript->waitForStarted())
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool TTSSapi::voice(QString text,QString wavfile)
|
|
{
|
|
QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n";
|
|
qDebug() << "voicing" << query;
|
|
voicescript->write(query.toLocal8Bit());
|
|
voicescript->write("SYNC\tbla\r\n");
|
|
voicescript->waitForReadyRead();
|
|
return true;
|
|
}
|
|
|
|
bool TTSSapi::stop()
|
|
{
|
|
QString query = "QUIT\r\n";
|
|
voicescript->write(query.toLocal8Bit());
|
|
voicescript->waitForFinished();
|
|
delete voicescript;
|
|
return true;
|
|
}
|
|
|
|
bool TTSExes::start()
|
|
{
|
|
QFileInfo tts(m_TTSexec);
|
|
qDebug() << "ttsexe init";
|
|
if(tts.exists())
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool TTSExes::voice(QString text,QString wavfile)
|
|
{
|
|
QString execstring = m_TTSTemplate;
|
|
|
|
execstring.replace("%exe",m_TTSexec);
|
|
execstring.replace("%options",m_TTSOpts);
|
|
execstring.replace("%wavfile",wavfile);
|
|
execstring.replace("%text",text);
|
|
qDebug() << "voicing" << execstring;
|
|
QProcess::execute(execstring);
|
|
return true;
|
|
|
|
}
|