Explicitly pass "--discard-comments" to OggEnc2 + some code refactoring.

This commit is contained in:
LoRd_MuldeR 2016-04-16 13:26:21 +02:00
parent b6b0413e86
commit 898eb216eb
17 changed files with 219 additions and 212 deletions

View File

@ -86,6 +86,7 @@
<ul> <ul>
<li>Upgraded build environment to Microsoft Visual Studio 2015 with Update-2</li> <li>Upgraded build environment to Microsoft Visual Studio 2015 with Update-2</li>
<li>Fixed the location of temporary intermediate files for SoX-based audio effects</li> <li>Fixed the location of temporary intermediate files for SoX-based audio effects</li>
<li>Fixed embedding of meta tags with OggEnc2 when reading directly from OGG/FLAC input file</li>
<li>Enabled the &quot;built-in&quot; resampler for QAAC encoder</li> <li>Enabled the &quot;built-in&quot; resampler for QAAC encoder</li>
<li>The &quot;Algorithm Quality&quot; slider now also affects the QAAC encoder</li> <li>The &quot;Algorithm Quality&quot; slider now also affects the QAAC encoder</li>
<li>Added &quot;AVX&quot; (Advanced Vector Extensions) to CPU feature detection code</li> <li>Added &quot;AVX&quot; (Advanced Vector Extensions) to CPU feature detection code</li>

View File

@ -6,6 +6,7 @@
* Upgraded build environment to Microsoft Visual Studio 2015 with Update-2 * Upgraded build environment to Microsoft Visual Studio 2015 with Update-2
* Fixed the location of temporary intermediate files for SoX-based audio effects * Fixed the location of temporary intermediate files for SoX-based audio effects
* Fixed embedding of meta tags with OggEnc2 when reading directly from OGG/FLAC input file
* Enabled the "built-in" resampler for QAAC encoder * Enabled the "built-in" resampler for QAAC encoder
* The "Algorithm Quality" slider now also affects the QAAC encoder * The "Algorithm Quality" slider now also affects the QAAC encoder
* Added "AVX" (Advanced Vector Extensions) to CPU feature detection code * Added "AVX" (Advanced Vector Extensions) to CPU feature detection code

View File

@ -34,8 +34,8 @@
#define VER_LAMEXP_MINOR_HI 1 #define VER_LAMEXP_MINOR_HI 1
#define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_MINOR_LO 4
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 8 #define VER_LAMEXP_PATCH 9
#define VER_LAMEXP_BUILD 1878 #define VER_LAMEXP_BUILD 1880
#define VER_LAMEXP_CONFG 1818 #define VER_LAMEXP_CONFG 1818
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -128,11 +128,10 @@ static const g_aacEncoderInfo;
AACEncoder::AACEncoder(void) AACEncoder::AACEncoder(void)
: :
m_binary_enc(lamexp_tools_lookup("neroAacEnc.exe")), m_binary_enc(lamexp_tools_lookup(L1S("neroAacEnc.exe"))),
m_binary_tag(lamexp_tools_lookup("neroAacTag.exe")), m_binary_tag(lamexp_tools_lookup(L1S("neroAacTag.exe")))
m_binary_sox(lamexp_tools_lookup("sox.exe"))
{ {
if(m_binary_enc.isEmpty() || m_binary_tag.isEmpty() || m_binary_sox.isEmpty()) if(m_binary_enc.isEmpty() || m_binary_tag.isEmpty())
{ {
MUTILS_THROW("Error initializing AAC encoder. Tool 'neroAacEnc.exe' is not registred!"); MUTILS_THROW("Error initializing AAC encoder. Tool 'neroAacEnc.exe' is not registred!");
} }
@ -154,13 +153,13 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "-q" << QString().sprintf("%.2f", double(qBound(0, m_configBitrate * 5, 100)) / 100.0); args << L1S("-q") << QString().sprintf("%.2f", double(qBound(0, m_configBitrate * 5, 100)) / 100.0);
break; break;
case SettingsModel::ABRMode: case SettingsModel::ABRMode:
args << "-br" << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000); args << L1S("-br") << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000);
break; break;
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "-cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000); args << L1S("-cbr") << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000);
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -169,26 +168,26 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
if(m_configEnable2Pass && (m_configRCMode == SettingsModel::ABRMode)) if(m_configEnable2Pass && (m_configRCMode == SettingsModel::ABRMode))
{ {
args << "-2pass"; args << L1S("-2pass");
} }
switch(m_configProfile) switch(m_configProfile)
{ {
case 1: case 1:
args << "-lc"; //Forces use of LC AAC profile args << L1S("-lc"); //Forces use of LC AAC profile
break; break;
case 2: case 2:
args << "-he"; //Forces use of HE AAC profile args << L1S("-he"); //Forces use of HE AAC profile
break; break;
case 3: case 3:
args << "-hev2"; //Forces use of HEv2 AAC profile args << L1S("-hev2"); //Forces use of HEv2 AAC profile
break; break;
} }
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
args << "-if" << QDir::toNativeSeparators(sourceFile); args << L1S("-if") << QDir::toNativeSeparators(sourceFile);
args << "-of" << QDir::toNativeSeparators(outputFile); args << L1S("-of") << QDir::toNativeSeparators(outputFile);
if(!startProcess(process, m_binary_enc, args)) if(!startProcess(process, m_binary_enc, args))
{ {
@ -200,9 +199,9 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("Processed\\s+(\\d+)\\s+seconds"); QRegExp regExp(L1S("Processed\\s+(\\d+)\\s+seconds"));
QRegExp regExp_pass1("First\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"); QRegExp regExp_pass1(L1S("First\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"));
QRegExp regExp_pass2("Second\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"); QRegExp regExp_pass2(L1S("Second\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -210,7 +209,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -218,7 +217,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("NeroAacEnc process timed out <-- killing!"); qWarning("NeroAacEnc process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -295,7 +294,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
return true; return true;
} }
emit messageLogged("\n-------------------------------\n"); emit messageLogged(L1S("\n-------------------------------\n"));
args.clear(); args.clear();
args << QDir::toNativeSeparators(outputFile); args << QDir::toNativeSeparators(outputFile);
@ -322,7 +321,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -330,7 +329,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("NeroAacTag process timed out <-- killing!"); qWarning("NeroAacTag process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -364,9 +363,9 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool AACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool AACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -49,7 +49,7 @@ public:
private: private:
const QString m_binary_enc; const QString m_binary_enc;
const QString m_binary_tag; const QString m_binary_tag;
const QString m_binary_sox; //const QString m_binary_sox;
int m_configProfile; int m_configProfile;
bool m_configEnable2Pass; bool m_configEnable2Pass;
}; };

View File

@ -134,7 +134,7 @@ static const g_fdkAacEncoderInfo;
FDKAACEncoder::FDKAACEncoder(void) FDKAACEncoder::FDKAACEncoder(void)
: :
m_binary(lamexp_tools_lookup("fdkaac.exe")) m_binary(lamexp_tools_lookup(L1S("fdkaac.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -154,29 +154,29 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
QStringList args; QStringList args;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PATH", QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), MUtils::temp_folder()))); env.insert(L1S("PATH"), QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), MUtils::temp_folder())));
process.setProcessEnvironment(env); process.setProcessEnvironment(env);
switch(m_configProfile) switch(m_configProfile)
{ {
case 1: case 1:
args << "-p" << "2"; args << L1S("-p") << QString::number(2);
break; break;
case 2: case 2:
args << "-p" << "5"; args << L1S("-p") << QString::number(5);
break; break;
case 3: case 3:
args << "-p" << "29"; args << L1S("-p") << QString::number(29);
break; break;
} }
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "-b" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); args << L1S("-b") << QString::number(qBound(8, index2bitrate(m_configBitrate), 576));
break; break;
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "-m" << QString::number(qBound(1, m_configBitrate + 1 , 5)); args << L1S("-m") << QString::number(qBound(1, m_configBitrate + 1 , 5));
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -185,15 +185,15 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.title().isEmpty()) args << L1S("--title") << cleanTag(metaInfo.title());
if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.artist().isEmpty()) args << L1S("--artist") << cleanTag(metaInfo.artist());
if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.album().isEmpty()) args << L1S("--album") << cleanTag(metaInfo.album());
if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(!metaInfo.genre().isEmpty()) args << L1S("--genre") << cleanTag(metaInfo.genre());
if(!metaInfo.comment().isEmpty()) args << "--comment" << cleanTag( metaInfo.comment()); if(!metaInfo.comment().isEmpty()) args << L1S("--comment") << cleanTag( metaInfo.comment());
if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.year()) args << L1S("--date") << QString::number(metaInfo.year());
if(metaInfo.position()) args << "--track" << QString::number(metaInfo.position()); if(metaInfo.position()) args << L1S("--track") << QString::number(metaInfo.position());
args << "-o" << QDir::toNativeSeparators(outputFile); args << L1S("-o") << QDir::toNativeSeparators(outputFile);
args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(sourceFile);
if(!startProcess(process, m_binary, args, QFileInfo(outputFile).canonicalPath())) if(!startProcess(process, m_binary, args, QFileInfo(outputFile).canonicalPath()))
@ -205,7 +205,7 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\[(\\d+)%\\]\\s+(\\d+):(\\d+)"); QRegExp regExp(L1S("\\[(\\d+)%\\]\\s+(\\d+):(\\d+)"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -213,7 +213,7 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -221,7 +221,7 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
qWarning("FDKAAC process timed out <-- killing!"); qWarning("FDKAAC process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -266,9 +266,9 @@ bool FDKAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool FDKAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool FDKAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -131,8 +131,8 @@ static const g_fhgAacEncoderInfo;
FHGAACEncoder::FHGAACEncoder(void) FHGAACEncoder::FHGAACEncoder(void)
: :
m_binary_enc(lamexp_tools_lookup("fhgaacenc.exe")), m_binary_enc(lamexp_tools_lookup(L1S("fhgaacenc.exe"))),
m_binary_dll(lamexp_tools_lookup("enc_fhgaac.dll")) m_binary_dll(lamexp_tools_lookup(L1S("enc_fhgaac.dll")))
{ {
if(m_binary_enc.isEmpty() || m_binary_dll.isEmpty()) if(m_binary_enc.isEmpty() || m_binary_dll.isEmpty())
{ {
@ -158,15 +158,15 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
switch(m_configProfile) switch(m_configProfile)
{ {
case 1: case 1:
args << "--profile" << "lc"; //Forces use of LC AAC profile args << L1S("--profile") << L1S("lc"); //Forces use of LC AAC profile
break; break;
case 2: case 2:
maxBitrate = 128; maxBitrate = 128;
args << "--profile" << "he"; //Forces use of HE AAC profile args << L1S("--profile") << L1S("he"); //Forces use of HE AAC profile
break; break;
case 3: case 3:
maxBitrate = 56; maxBitrate = 56;
args << "--profile" << "hev2"; //Forces use of HEv2 AAC profile args << L1S("--profile") << L1S("hev2"); //Forces use of HEv2 AAC profile
break; break;
} }
} }
@ -174,10 +174,10 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "--cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), maxBitrate)); args << L1S("--cbr") << QString::number(qBound(8, index2bitrate(m_configBitrate), maxBitrate));
break; break;
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "--vbr" << QString::number(qBound(1, m_configBitrate + 1, 6)); args << L1S("--vbr") << QString::number(qBound(1, m_configBitrate + 1, 6));
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -200,7 +200,7 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("Progress:\\s*(\\d+)%"); QRegExp regExp(L1S("Progress:\\s*(\\d+)%"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -208,7 +208,7 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -216,7 +216,7 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
qWarning("FhgAacEnc process timed out <-- killing!"); qWarning("FhgAacEnc process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -261,9 +261,9 @@ bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool FHGAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool FHGAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -141,8 +141,8 @@ static const g_qaacEncoderInfo;
QAACEncoder::QAACEncoder(void) QAACEncoder::QAACEncoder(void)
: :
m_binary_qaac32(lamexp_tools_lookup("qaac.exe")), m_binary_qaac32(lamexp_tools_lookup(L1S("qaac.exe"))),
m_binary_qaac64(lamexp_tools_lookup("qaac64.exe")) m_binary_qaac64(lamexp_tools_lookup(L1S("qaac64.exe")))
{ {
if(m_binary_qaac32.isEmpty() && m_binary_qaac64.isEmpty()) if(m_binary_qaac32.isEmpty() && m_binary_qaac64.isEmpty())
{ {
@ -165,7 +165,7 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
QStringList args; QStringList args;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PATH", QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), MUtils::temp_folder()))); env.insert(L1S("PATH"), QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), MUtils::temp_folder())));
process.setProcessEnvironment(env); process.setProcessEnvironment(env);
if(m_configRCMode != SettingsModel::VBRMode) if(m_configRCMode != SettingsModel::VBRMode)
@ -174,7 +174,7 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
case 2: case 2:
case 3: case 3:
args << "--he"; //Forces use of HE AAC profile (there is no explicit HEv2 switch for QAAC) args << L1S("--he"); //Forces use of HE AAC profile (there is no explicit HEv2 switch for QAAC)
break; break;
} }
} }
@ -182,39 +182,39 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "--cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); args << L1S("--cbr") << QString::number(qBound(8, index2bitrate(m_configBitrate), 576));
break; break;
case SettingsModel::ABRMode: case SettingsModel::ABRMode:
args << "--cvbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); args << L1S("--cvbr") << QString::number(qBound(8, index2bitrate(m_configBitrate), 576));
break; break;
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "--tvbr" << QString::number(g_qaacVBRQualityLUT[qBound(0, m_configBitrate , 14)]); args << L1S("--tvbr") << QString::number(g_qaacVBRQualityLUT[qBound(0, m_configBitrate , 14)]);
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
break; break;
} }
args << "--quality" << QString::number(qBound(0, m_algorithmQuality, 2)); args << L1S("--quality") << QString::number(qBound(0, m_algorithmQuality, 2));
if (m_configSamplingRate > 0) if (m_configSamplingRate > 0)
{ {
args << QString("--native-resampler=bats,%0").arg(QString::number(RESAMPLING_QUALITY)); args << QString("--native-resampler=bats,%0").arg(QString::number(RESAMPLING_QUALITY));
args << "--rate" << QString::number(m_configSamplingRate); args << L1S("--rate") << QString::number(m_configSamplingRate);
} }
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.title().isEmpty()) args << L1S("--title") << cleanTag(metaInfo.title());
if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.artist().isEmpty()) args << L1S("--artist") << cleanTag(metaInfo.artist());
if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.album().isEmpty()) args << L1S("--album") << cleanTag(metaInfo.album());
if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(!metaInfo.genre().isEmpty()) args << L1S("--genre") << cleanTag(metaInfo.genre());
if(!metaInfo.comment().isEmpty()) args << "--comment" << cleanTag( metaInfo.comment()); if(!metaInfo.comment().isEmpty()) args << L1S("--comment") << cleanTag( metaInfo.comment());
if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.year()) args << L1S("--date") << QString::number(metaInfo.year());
if(metaInfo.position()) args << "--track" << QString::number(metaInfo.position()); if(metaInfo.position()) args << L1S("--track") << QString::number(metaInfo.position());
if(!metaInfo.cover().isEmpty()) args << "--artwork" << metaInfo.cover(); if(!metaInfo.cover().isEmpty()) args << L1S("--artwork") << metaInfo.cover();
args << "-d" << "."; args << L1S("-d") << L1S(".");
args << "-o" << QDir::toNativeSeparators(outputFile); args << L1S("-o") << QDir::toNativeSeparators(outputFile);
args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(sourceFile);
if(!startProcess(process, qaac_bin, args, QFileInfo(outputFile).canonicalPath())) if(!startProcess(process, qaac_bin, args, QFileInfo(outputFile).canonicalPath()))
@ -226,7 +226,7 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\[(\\d+)\\.(\\d)%\\]"); QRegExp regExp(L1S("\\[(\\d+)\\.(\\d)%\\]"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -234,7 +234,7 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -242,7 +242,7 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
qWarning("QAAC process timed out <-- killing!"); qWarning("QAAC process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -287,9 +287,9 @@ bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
bool QAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool QAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -127,7 +127,7 @@ static const g_aftenEncoderInfo;
AC3Encoder::AC3Encoder(void) AC3Encoder::AC3Encoder(void)
: :
m_binary(lamexp_tools_lookup("aften.exe")) m_binary(lamexp_tools_lookup(L1S("aften.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -152,10 +152,10 @@ bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "-q" << QString::number(qBound(0, m_configBitrate * 16, 1023)); args << L1S("-q") << QString::number(qBound(0, m_configBitrate * 16, 1023));
break; break;
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "-b" << QString::number(g_ac3BitratesLUT[qBound(0, m_configBitrate, 18)]); args << L1S("-b") << QString::number(g_ac3BitratesLUT[qBound(0, m_configBitrate, 18)]);
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -164,19 +164,19 @@ bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
if(m_configAudioCodingMode >= 1) if(m_configAudioCodingMode >= 1)
{ {
args << "-acmod" << QString::number(m_configAudioCodingMode - 1); args << L1S("-acmod") << QString::number(m_configAudioCodingMode - 1);
} }
if(m_configDynamicRangeCompression != 5) if(m_configDynamicRangeCompression != 5)
{ {
args << "-dynrng" << QString::number(m_configDynamicRangeCompression); args << L1S("-dynrng") << QString::number(m_configDynamicRangeCompression);
} }
if(m_configExponentSearchSize != 8) if(m_configExponentSearchSize != 8)
{ {
args << "-exps" << QString::number(m_configExponentSearchSize); args << L1S("-exps") << QString::number(m_configExponentSearchSize);
} }
if(m_configFastBitAllocation) if(m_configFastBitAllocation)
{ {
args << "-fba" << QString::number(1); args << L1S("-fba") << QString::number(1);
} }
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
@ -193,7 +193,7 @@ bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("progress:(\\s+)(\\d+)%(\\s+)\\|"); QRegExp regExp(L1S("progress:(\\s+)(\\d+)%(\\s+)\\|"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -201,7 +201,7 @@ bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -209,7 +209,7 @@ bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("Aften process timed out <-- killing!"); qWarning("Aften process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -286,9 +286,9 @@ const unsigned int *AC3Encoder::supportedSamplerates(void)
bool AC3Encoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool AC3Encoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -129,7 +129,7 @@ static const g_dcaEncoderInfo;
DCAEncoder::DCAEncoder(void) DCAEncoder::DCAEncoder(void)
: :
m_binary(lamexp_tools_lookup("dcaenc.exe")) m_binary(lamexp_tools_lookup(L1S("dcaenc.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -146,9 +146,9 @@ bool DCAEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
QProcess process; QProcess process;
QStringList args; QStringList args;
args << "-i" << QDir::toNativeSeparators(sourceFile); args << L1S("-i") << QDir::toNativeSeparators(sourceFile);
args << "-o" << QDir::toNativeSeparators(outputFile); args << L1S("-o") << QDir::toNativeSeparators(outputFile);
args << "-b" << QString::number(qBound(32, index2bitrate(m_configBitrate), 4096)); args << L1S("-b") << QString::number(qBound(32, index2bitrate(m_configBitrate), 4096));
if(!startProcess(process, m_binary, args)) if(!startProcess(process, m_binary, args))
{ {
@ -159,7 +159,7 @@ bool DCAEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\[(\\d+)\\.(\\d+)%\\]"); QRegExp regExp(L1S("\\[(\\d+)\\.(\\d+)%\\]"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -167,7 +167,7 @@ bool DCAEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -175,7 +175,7 @@ bool DCAEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("DCAENC process timed out <-- killing!"); qWarning("DCAENC process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -220,9 +220,9 @@ bool DCAEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool DCAEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool DCAEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -123,7 +123,7 @@ static const g_flacEncoderInfo;
FLACEncoder::FLACEncoder(void) FLACEncoder::FLACEncoder(void)
: :
m_binary(lamexp_tools_lookup("flac.exe")) m_binary(lamexp_tools_lookup(L1S("flac.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -141,22 +141,22 @@ bool FLACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
QStringList args; QStringList args;
args << QString("-%1").arg(QString::number(qBound(0, m_configBitrate, 8))); args << QString("-%1").arg(QString::number(qBound(0, m_configBitrate, 8)));
args << "--channel-map=none"; args << L1S("--channel-map=none");
if(!metaInfo.title().isEmpty()) args << "-T" << QString("title=%1").arg(cleanTag(metaInfo.title())); if(!metaInfo.title().isEmpty()) args << L1S("-T") << QString("title=%1").arg(cleanTag(metaInfo.title()));
if(!metaInfo.artist().isEmpty()) args << "-T" << QString("artist=%1").arg(cleanTag(metaInfo.artist())); if(!metaInfo.artist().isEmpty()) args << L1S("-T") << QString("artist=%1").arg(cleanTag(metaInfo.artist()));
if(!metaInfo.album().isEmpty()) args << "-T" << QString("album=%1").arg(cleanTag(metaInfo.album())); if(!metaInfo.album().isEmpty()) args << L1S("-T") << QString("album=%1").arg(cleanTag(metaInfo.album()));
if(!metaInfo.genre().isEmpty()) args << "-T" << QString("genre=%1").arg(cleanTag(metaInfo.genre())); if(!metaInfo.genre().isEmpty()) args << L1S("-T") << QString("genre=%1").arg(cleanTag(metaInfo.genre()));
if(!metaInfo.comment().isEmpty()) args << "-T" << QString("comment=%1").arg(cleanTag(metaInfo.comment())); if(!metaInfo.comment().isEmpty()) args << L1S("-T") << QString("comment=%1").arg(cleanTag(metaInfo.comment()));
if(metaInfo.year()) args << "-T" << QString("date=%1").arg(QString::number(metaInfo.year())); if(metaInfo.year()) args << L1S("-T") << QString("date=%1").arg(QString::number(metaInfo.year()));
if(metaInfo.position()) args << "-T" << QString("track=%1").arg(QString::number(metaInfo.position())); if(metaInfo.position()) args << L1S("-T") << QString("track=%1").arg(QString::number(metaInfo.position()));
if(!metaInfo.cover().isEmpty()) args << QString("--picture=%1").arg(metaInfo.cover()); if(!metaInfo.cover().isEmpty()) args << QString("--picture=%1").arg(metaInfo.cover());
//args << "--tv" << QString().sprintf("Encoder=LameXP v%d.%02d.%04d [%s]", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_release()); //args << "--tv" << QString().sprintf("Encoder=LameXP v%d.%02d.%04d [%s]", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_release());
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
args << "-f" << "-o" << QDir::toNativeSeparators(outputFile); args << L1S("-f") << L1S("-o") << QDir::toNativeSeparators(outputFile);
args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(sourceFile);
if(!startProcess(process, m_binary, args)) if(!startProcess(process, m_binary, args))
@ -168,7 +168,7 @@ bool FLACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\b(\\d+)% complete"); QRegExp regExp(L1S("\\b(\\d+)% complete"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -176,7 +176,7 @@ bool FLACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -184,7 +184,7 @@ bool FLACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
qWarning("FLAC process timed out <-- killing!"); qWarning("FLAC process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -229,9 +229,9 @@ bool FLACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
bool FLACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool FLACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -123,8 +123,8 @@ static const g_macEncoderInfo;
MACEncoder::MACEncoder(void) MACEncoder::MACEncoder(void)
: :
m_binary_enc(lamexp_tools_lookup("mac.exe")), m_binary_enc(lamexp_tools_lookup(L1S("mac.exe"))),
m_binary_tag(lamexp_tools_lookup("tag.exe")) m_binary_tag(lamexp_tools_lookup(L1S("tag.exe")))
{ {
if(m_binary_enc.isEmpty() || m_binary_tag.isEmpty()) if(m_binary_enc.isEmpty() || m_binary_tag.isEmpty())
{ {
@ -165,7 +165,7 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("Progress: (\\d+).(\\d+)%"); QRegExp regExp(L1S("Progress: (\\d+).(\\d+)%"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -173,7 +173,7 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -181,7 +181,7 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("MAC process timed out <-- killing!"); qWarning("MAC process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -226,10 +226,10 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
return true; return true;
} }
emit messageLogged("\n-------------------------------\n"); emit messageLogged(L1S("\n-------------------------------\n"));
args.clear(); args.clear();
args << "APE2" << QDir::toNativeSeparators(outputFile); args << L1S("APE2") << QDir::toNativeSeparators(outputFile);
if(!metaInfo.title().isEmpty()) args << QString("Title=%1").arg(cleanTag(metaInfo.title())); if(!metaInfo.title().isEmpty()) args << QString("Title=%1").arg(cleanTag(metaInfo.title()));
if(!metaInfo.artist().isEmpty()) args << QString("Artist=%1").arg(cleanTag(metaInfo.artist())); if(!metaInfo.artist().isEmpty()) args << QString("Artist=%1").arg(cleanTag(metaInfo.artist()));
@ -254,7 +254,7 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -262,7 +262,7 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("Tag process timed out <-- killing!"); qWarning("Tag process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -296,9 +296,9 @@ bool MACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool MACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool MACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -128,7 +128,7 @@ static const g_mp3EncoderInfo;
MP3Encoder::MP3Encoder(void) MP3Encoder::MP3Encoder(void)
: :
m_binary(lamexp_tools_lookup("lame.exe")) m_binary(lamexp_tools_lookup(L1S("lame.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -151,20 +151,20 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
QProcess process; QProcess process;
QStringList args; QStringList args;
args << "--nohist"; args << L1S("--nohist");
args << "-q" << QString::number(g_lameAgorithmQualityLUT[m_algorithmQuality]); args << L1S("-q") << QString::number(g_lameAgorithmQualityLUT[m_algorithmQuality]);
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "-V" << QString::number(g_lameVBRQualityLUT[qBound(0, m_configBitrate, 9)]); args << L1S("-V") << QString::number(g_lameVBRQualityLUT[qBound(0, m_configBitrate, 9)]);
break; break;
case SettingsModel::ABRMode: case SettingsModel::ABRMode:
args << "--abr" << QString::number(g_mp3BitrateLUT[qBound(0, m_configBitrate, 13)]); args << L1S("--abr") << QString::number(g_mp3BitrateLUT[qBound(0, m_configBitrate, 13)]);
break; break;
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "--cbr"; args << L1S("--cbr");
args << "-b" << QString::number(g_mp3BitrateLUT[qBound(0, m_configBitrate, 13)]); args << L1S("-b") << QString::number(g_mp3BitrateLUT[qBound(0, m_configBitrate, 13)]);
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -175,32 +175,32 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
if(m_configRCMode != SettingsModel::CBRMode) if(m_configRCMode != SettingsModel::CBRMode)
{ {
args << "-b" << QString::number(clipBitrate(m_configBitrateMinimum)); args << L1S("-b") << QString::number(clipBitrate(m_configBitrateMinimum));
args << "-B" << QString::number(clipBitrate(m_configBitrateMaximum)); args << L1S("-B") << QString::number(clipBitrate(m_configBitrateMaximum));
} }
} }
if(m_configSamplingRate > 0) if(m_configSamplingRate > 0)
{ {
args << "--resample" << QString::number(m_configSamplingRate); args << L1S("--resample") << QString::number(m_configSamplingRate);
} }
switch(m_configChannelMode) switch(m_configChannelMode)
{ {
case 1: case 1:
args << "-m" << "j"; args << L1S("-m") << L1S("j");
break; break;
case 2: case 2:
args << "-m" << "f"; args << L1S("-m") << L1S("f");
break; break;
case 3: case 3:
args << "-m" << "s"; args << L1S("-m") << L1S("s");
break; break;
case 4: case 4:
args << "-m" << "d"; args << L1S("-m") << L1S("d");
break; break;
case 5: case 5:
args << "-m" << "m"; args << L1S("-m") << L1S("m");
break; break;
} }
@ -212,16 +212,16 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
if(isUnicode(metaInfo.genre())) bUseUCS2 = true; if(isUnicode(metaInfo.genre())) bUseUCS2 = true;
if(isUnicode(metaInfo.comment())) bUseUCS2 = true; if(isUnicode(metaInfo.comment())) bUseUCS2 = true;
if(bUseUCS2) args << "--id3v2-ucs2"; //Must specify this BEFORE "--tt" and friends! if (bUseUCS2) args << L1S("--id3v2-ucs2"); //Must specify this BEFORE "--tt" and friends!
if(!metaInfo.title().isEmpty()) args << "--tt" << cleanTag(metaInfo.title()); if(!metaInfo.title().isEmpty()) args << L1S("--tt") << cleanTag(metaInfo.title());
if(!metaInfo.artist().isEmpty()) args << "--ta" << cleanTag(metaInfo.artist()); if(!metaInfo.artist().isEmpty()) args << L1S("--ta") << cleanTag(metaInfo.artist());
if(!metaInfo.album().isEmpty()) args << "--tl" << cleanTag( metaInfo.album()); if(!metaInfo.album().isEmpty()) args << L1S("--tl") << cleanTag( metaInfo.album());
if(!metaInfo.genre().isEmpty()) args << "--tg" << cleanTag(metaInfo.genre()); if(!metaInfo.genre().isEmpty()) args << L1S("--tg") << cleanTag(metaInfo.genre());
if(!metaInfo.comment().isEmpty()) args << "--tc" << cleanTag(metaInfo.comment()); if(!metaInfo.comment().isEmpty()) args << L1S("--tc") << cleanTag(metaInfo.comment());
if(metaInfo.year()) args << "--ty" << QString::number(metaInfo.year()); if(metaInfo.year()) args << L1S("--ty") << QString::number(metaInfo.year());
if(metaInfo.position()) args << "--tn" << QString::number(metaInfo.position()); if(metaInfo.position()) args << L1S("--tn") << QString::number(metaInfo.position());
if(!metaInfo.cover().isEmpty()) args << "--ti" << QDir::toNativeSeparators(metaInfo.cover()); if(!metaInfo.cover().isEmpty()) args << L1S("--ti") << QDir::toNativeSeparators(metaInfo.cover());
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
@ -237,7 +237,7 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\(.*(\\d+)%\\)\\|"); QRegExp regExp(L1S("\\(.*(\\d+)%\\)\\|"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -245,7 +245,7 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -253,7 +253,7 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
{ {
process.kill(); process.kill();
qWarning("LAME process timed out <-- killing!"); qWarning("LAME process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -298,20 +298,20 @@ bool MP3Encoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo
bool MP3Encoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool MP3Encoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }
} }
else if(containerType.compare("MPEG Audio", Qt::CaseInsensitive) == 0) else if(containerType.compare(L1S("MPEG Audio"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("MPEG Audio", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("MPEG Audio"), Qt::CaseInsensitive) == 0)
{ {
if(formatProfile.compare("Layer 3", Qt::CaseInsensitive) == 0 || formatProfile.compare("Layer 2", Qt::CaseInsensitive) == 0) if(formatProfile.compare(L1S("Layer 3"), Qt::CaseInsensitive) == 0 || formatProfile.compare(L1S("Layer 2"), Qt::CaseInsensitive) == 0)
{ {
if(formatVersion.compare("Version 1", Qt::CaseInsensitive) == 0 || formatVersion.compare("Version 2", Qt::CaseInsensitive) == 0) if(formatVersion.compare(L1S("Version 1"), Qt::CaseInsensitive) == 0 || formatVersion.compare(L1S("Version 2"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -124,7 +124,7 @@ static const g_opusEncoderInfo;
OpusEncoder::OpusEncoder(void) OpusEncoder::OpusEncoder(void)
: :
m_binary(lamexp_tools_lookup("opusenc.exe")) m_binary(lamexp_tools_lookup(L1S("opusenc.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -148,13 +148,13 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "--vbr"; args << L1S("--vbr");
break; break;
case SettingsModel::ABRMode: case SettingsModel::ABRMode:
args << "--cvbr"; args << L1S("--cvbr");
break; break;
case SettingsModel::CBRMode: case SettingsModel::CBRMode:
args << "--hard-cbr"; args << L1S("--hard-cbr");
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -166,35 +166,35 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
switch(m_configFrameSize) switch(m_configFrameSize)
{ {
case 0: case 0:
args << "--framesize" << "2.5"; args << L1S("--framesize") << L1S("2.5");
break; break;
case 1: case 1:
args << "--framesize" << "5"; args << L1S("--framesize") << L1S("5");
break; break;
case 2: case 2:
args << "--framesize" << "10"; args << L1S("--framesize") << L1S("10");
break; break;
case 3: case 3:
args << "--framesize" << "20"; args << L1S("--framesize") << L1S("20");
break; break;
case 4: case 4:
args << "--framesize" << "40"; args << L1S("--framesize") << L1S("40");
break; break;
case 5: case 5:
args << "--framesize" << "60"; args << L1S("--framesize") << L1S("60");
break; break;
} }
args << QString("--bitrate") << QString::number(qBound(8, (m_configBitrate + 1) * 8, 256)); args << L1S("--bitrate") << QString::number(qBound(8, (m_configBitrate + 1) * 8, 256));
if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.title().isEmpty()) args << L1S("--title") << cleanTag(metaInfo.title());
if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.artist().isEmpty()) args << L1S("--artist") << cleanTag(metaInfo.artist());
if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.album().isEmpty()) args << L1S("--album") << cleanTag(metaInfo.album());
if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(!metaInfo.genre().isEmpty()) args << L1S("--genre") << cleanTag(metaInfo.genre());
if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.year()) args << L1S("--date") << QString::number(metaInfo.year());
if(metaInfo.position()) args << "--comment" << QString("tracknumber=%1").arg(QString::number(metaInfo.position())); if(metaInfo.position()) args << L1S("--comment") << QString("tracknumber=%1").arg(QString::number(metaInfo.position()));
if(!metaInfo.comment().isEmpty()) args << "--comment" << QString("comment=%1").arg(cleanTag(metaInfo.comment())); if(!metaInfo.comment().isEmpty()) args << L1S("--comment") << QString("comment=%1").arg(cleanTag(metaInfo.comment()));
if(!metaInfo.cover().isEmpty()) args << "--picture" << makeCoverParam(metaInfo.cover()); if(!metaInfo.cover().isEmpty()) args << L1S("--picture") << makeCoverParam(metaInfo.cover());
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
@ -210,7 +210,7 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\((\\d+)%\\)"); QRegExp regExp(L1S("\\((\\d+)%\\)"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -218,7 +218,7 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -226,7 +226,7 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
{ {
process.kill(); process.kill();
qWarning("Opus process timed out <-- killing!"); qWarning("Opus process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -309,9 +309,9 @@ void OpusEncoder::setFrameSize(int frameSize)
bool OpusEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool OpusEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -125,7 +125,7 @@ static const g_vorbisEncoderInfo;
VorbisEncoder::VorbisEncoder(void) VorbisEncoder::VorbisEncoder(void)
: :
m_binary(lamexp_tools_lookup("oggenc2.exe")) m_binary(lamexp_tools_lookup(L1S("oggenc2.exe")))
{ {
if(m_binary.isEmpty()) if(m_binary.isEmpty())
{ {
@ -150,10 +150,10 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
switch(m_configRCMode) switch(m_configRCMode)
{ {
case SettingsModel::VBRMode: case SettingsModel::VBRMode:
args << "-q" << QString::number(qBound(-2, m_configBitrate - 2, 10)); args << L1S("-q") << QString::number(qBound(-2, m_configBitrate - 2, 10));
break; break;
case SettingsModel::ABRMode: case SettingsModel::ABRMode:
args << "-b" << QString::number(qBound(32, (m_configBitrate + 4) * 8, 500)); args << L1S("-b") << QString::number(qBound(32, (m_configBitrate + 4) * 8, 500));
break; break;
default: default:
MUTILS_THROW("Bad rate-control mode!"); MUTILS_THROW("Bad rate-control mode!");
@ -162,28 +162,33 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
if((m_configBitrateMaximum > 0) && (m_configBitrateMinimum > 0) && (m_configBitrateMinimum <= m_configBitrateMaximum)) if((m_configBitrateMaximum > 0) && (m_configBitrateMinimum > 0) && (m_configBitrateMinimum <= m_configBitrateMaximum))
{ {
args << "--min-bitrate" << QString::number(qBound(32, m_configBitrateMinimum, 500)); args << L1S("--min-bitrate") << QString::number(qBound(32, m_configBitrateMinimum, 500));
args << "--max-bitrate" << QString::number(qBound(32, m_configBitrateMaximum, 500)); args << L1S("--max-bitrate") << QString::number(qBound(32, m_configBitrateMaximum, 500));
} }
if(m_configSamplingRate > 0) if(m_configSamplingRate > 0)
{ {
args << "--resample" << QString::number(m_configSamplingRate) << "--converter" << QString::number(0); args << L1S("--resample") << QString::number(m_configSamplingRate) << L1S("--converter") << QString::number(0);
} }
if(!metaInfo.title().isEmpty()) args << "-t" << cleanTag(metaInfo.title()); if (!metaInfo.empty(false))
if(!metaInfo.artist().isEmpty()) args << "-a" << cleanTag(metaInfo.artist()); {
if(!metaInfo.album().isEmpty()) args << "-l" << cleanTag(metaInfo.album()); args << L1S("--discard-comments");
if(!metaInfo.genre().isEmpty()) args << "-G" << cleanTag(metaInfo.genre()); }
if(!metaInfo.comment().isEmpty()) args << "-c" << QString("comment=%1").arg(cleanTag(metaInfo.comment()));
if(metaInfo.year()) args << "-d" << QString::number(metaInfo.year()); if(!metaInfo.title().isEmpty()) args << L1S("-t") << cleanTag(metaInfo.title());
if(metaInfo.position()) args << "-N" << QString::number(metaInfo.position()); if(!metaInfo.artist().isEmpty()) args << L1S("-a") << cleanTag(metaInfo.artist());
if(!metaInfo.album().isEmpty()) args << L1S("-l") << cleanTag(metaInfo.album());
if(!metaInfo.genre().isEmpty()) args << L1S("-G") << cleanTag(metaInfo.genre());
if(!metaInfo.comment().isEmpty()) args << L1S("-c") << QString("comment=%1").arg(cleanTag(metaInfo.comment()));
if(metaInfo.year()) args << L1S("-d") << QString::number(metaInfo.year());
if(metaInfo.position()) args << L1S("-N") << QString::number(metaInfo.position());
//args << "--tv" << QString().sprintf("Encoder=LameXP v%d.%02d.%04d [%s]", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_release()); //args << "--tv" << QString().sprintf("Encoder=LameXP v%d.%02d.%04d [%s]", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_release());
if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts);
args << "-o" << QDir::toNativeSeparators(outputFile); args << L1S("-o") << QDir::toNativeSeparators(outputFile);
args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(sourceFile);
if(!startProcess(process, m_binary, args)) if(!startProcess(process, m_binary, args))
@ -195,7 +200,7 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool bAborted = false; bool bAborted = false;
int prevProgress = -1; int prevProgress = -1;
QRegExp regExp("\\[.*(\\d+)[.,](\\d+)%\\]"); QRegExp regExp(L1S("\\[.*(\\d+)[.,](\\d+)%\\]"));
while(process.state() != QProcess::NotRunning) while(process.state() != QProcess::NotRunning)
{ {
@ -203,7 +208,7 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
bAborted = true; bAborted = true;
emit messageLogged("\nABORTED BY USER !!!"); emit messageLogged(L1S("\nABORTED BY USER !!!"));
break; break;
} }
process.waitForReadyRead(m_processTimeoutInterval); process.waitForReadyRead(m_processTimeoutInterval);
@ -211,7 +216,7 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
{ {
process.kill(); process.kill();
qWarning("OggEnc process timed out <-- killing!"); qWarning("OggEnc process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!"); emit messageLogged(L1S("\nPROCESS TIMEOUT !!!"));
bTimeout = true; bTimeout = true;
break; break;
} }
@ -256,16 +261,16 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaI
bool VorbisEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool VorbisEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }
} }
else if(containerType.compare("FLAC", Qt::CaseInsensitive) == 0) else if(containerType.compare(L1S("FLAC"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("FLAC", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("FLAC"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -146,11 +146,11 @@ bool WaveEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInf
if (success) if (success)
{ {
emit messageLogged(QLatin1String("File copied successfully.")); emit messageLogged(L1S("File copied successfully."));
} }
else else
{ {
emit messageLogged((*abortFlag) ? QLatin1String("Operation cancelled by user!") : QLatin1String("Error: Failed to copy file!")); emit messageLogged((*abortFlag) ? L1S("Operation cancelled by user!") : L1S("Error: Failed to copy file!"));
} }
return success; return success;
@ -174,9 +174,9 @@ void WaveEncoder::updateProgress(const double &progress)
bool WaveEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) bool WaveEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{ {
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) if(containerType.compare(L1S("Wave"), Qt::CaseInsensitive) == 0)
{ {
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) if(formatType.compare(L1S("PCM"), Qt::CaseInsensitive) == 0)
{ {
return true; return true;
} }

View File

@ -83,4 +83,5 @@ const QString lamexp_version2string(const QString &pattern, unsigned int version
// HELPER MACROS // HELPER MACROS
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define L1S(STR) (QLatin1String((STR)))
#define NOBR(STR) (QString("<nobr>%1</nobr>").arg((STR)).replace("-", "&minus;")) #define NOBR(STR) (QString("<nobr>%1</nobr>").arg((STR)).replace("-", "&minus;"))