rockbox/rbutil/rbutilqt/talkfile.cpp

194 lines
5.7 KiB
C++
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* 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::createTalkFiles(ProgressloggerInterface* logger)
{
m_abort = false;
m_logger = logger;
m_logger->addItem(tr("Starting Talk file generation"),LOGINFO);
//tts
m_tts = TTSBase::getTTS(settings->curTTS());
m_tts->setCfg(settings);
QString errStr;
if(!m_tts->start(&errStr))
{
m_logger->addItem(errStr,LOGERROR);
m_logger->addItem(tr("Init of TTS engine failed"),LOGERROR);
m_logger->abort();
return false;
}
// Encoder
m_enc = getEncoder(settings->curEncoder());
m_enc->setCfg(settings);
if(!m_enc->start())
{
m_logger->addItem(tr("Init of Encoder engine failed"),LOGERROR);
m_logger->abort();
m_tts->stop();
return false;
}
QCoreApplication::processEvents();
connect(logger,SIGNAL(aborted()),this,SLOT(abort()));
m_logger->setProgressMax(0);
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags;
if(m_recursive)
flags = QDirIterator::Subdirectories;
QDirIterator it(m_dir,flags);
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(tr("Talk file creation aborted"),LOGERROR);
m_logger->abort();
m_tts->stop();
return false;
}
QCoreApplication::processEvents();
QFileInfo fileInf = it.fileInfo();
QString toSpeak;
QString filename;
QString wavfilename;
QString path = fileInf.filePath();
qDebug() << path;
if( path.endsWith("..") || path.endsWith(".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;
}
int index1 = path.lastIndexOf("/");
int index2 = path.lastIndexOf("/",index1-1);
toSpeak = path.mid(index2+1,(index1-index2)-1);
filename = path.left(index1) + "/_dirname.talk";
qDebug() << "toSpeak: " << toSpeak << "filename: " << filename;
}
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(tr("Voicing of %1").arg(toSpeak),LOGINFO);
if(!m_tts->voice(toSpeak,wavfilename))
{
m_logger->addItem(tr("Voicing of %s failed").arg(toSpeak),LOGERROR);
m_logger->abort();
m_tts->stop();
m_enc->stop();
return false;
}
QCoreApplication::processEvents();
}
m_logger->addItem(tr("Encoding of %1").arg(toSpeak),LOGINFO);
if(!m_enc->encode(wavfilename,filename))
{
m_logger->addItem(tr("Encoding of %1 failed").arg(wavfilename),LOGERROR);
m_logger->abort();
m_tts->stop();
m_enc->stop();
return false;
}
QCoreApplication::processEvents();
}
//! 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(tr("Finished creating Talk files"),LOGOK);
m_logger->setProgressMax(1);
m_logger->setProgressValue(1);
m_logger->abort();
return true;
}
void TalkFileCreator::abort()
{
m_abort = true;
}