Added 'wma2wav' as WMA decoder and removed all support for WMA decoder by NCH Swift Sound.
This commit is contained in:
parent
c5606cf45a
commit
327ca1ae75
@ -19,8 +19,8 @@ a:visited { color: #0000EE; }
|
||||
<a name="4.02"></a>Changes between v4.02 and v4.03:<br><ul>
|
||||
<li>Updated MediaInfo to v0.7.46 (2011-07-04), compiled with MSVC 10.0
|
||||
<li>Fixed Cue Sheet import for tracks with certain characters in the title
|
||||
<li>Added "built-in" WMA decoder (see <a href="http://forum.doom9.org/showthread.php?t=140273">this</a> thread for details) and removed all remnants of "old" decoder
|
||||
<li>Workaround for malicious "anti-virus" programs that prevent innocent applications from functioning
|
||||
<li>Detect WMA decoder (wamwav.exe) in the application directory, might be usefull for "portable" mode
|
||||
<li>Enabled "Aero Glass" theme in installer and web-update program (Vista and Windows 7 only)
|
||||
</ul><br>
|
||||
|
||||
|
17
doc/FAQ.html
17
doc/FAQ.html
@ -127,7 +127,7 @@ Currently the following input formats are supported by LameXP:<br><ul>
|
||||
<li>The True Audio (TTA)
|
||||
<li>Uncompressed PCM / Waveform Audio File (WAV/RIFF)
|
||||
<li>WavPack Hybrid Lossless Audio
|
||||
<li>Windows Media Audio (WMA), using NCH Software decoder [available as separate download]</ul>
|
||||
<li>Windows Media Audio (WMA), using wma2wav [built-in]</ul>
|
||||
|
||||
<br><br>
|
||||
|
||||
@ -310,16 +310,11 @@ such streams. Still, if you want to extract the "raw" AAC stream from an MP4 fil
|
||||
|
||||
<a name="ebf016ab"></a><b>How do I enable WMA input (decoding) in LameXP?</b><br>
|
||||
<br>
|
||||
WMA input requires the WMA decoder component to be installed on your local computer. Usually LameXP will show<br>
|
||||
a warning on startup, if the WMA decoder component could not be found. In that case you can simply choose<br>
|
||||
"Download & Install" in order to install the WMA decoder component on your system. Alternatively you can<br>
|
||||
also install the WMA decoder component manually by choosing "Install WMA Decoder" from the "Tools" menu. In<br>
|
||||
any case you must restart LameXP after the WMA decoder component has been installed.<br>
|
||||
<br>
|
||||
It has to be noted that the WMA decoder component relies on the Windows Media Format Runtime. All supported<br>
|
||||
versions of Microsoft Windows should have the Windows Media Format Runtime installed out of the box. However<br>
|
||||
Wine does not! In case you encounter problems with the WMA decoder component, try downloading and installing<br>
|
||||
the <a href="http://www.free-codecs.com/download/Windows_Media_Format_11.htm" target="_blank">Windows Media Format 11 Runtime</a> manually. This should also work under Linux/Wine.<br><br>
|
||||
LameXP now uses its "built-in" WMA decoder, thanks to 'wma2wav'. However it has to be noted that the WMA<br>
|
||||
decoder relies on the Windows Media Format Runtime. All supported versions of Microsoft Windows should have<br>
|
||||
the Windows Media Format Runtime installed as part of the Windows Media Player. But Wine does not! In case<br>
|
||||
you encounter problems with the WMA decoder, try installing the <a href="http://anonym.to/http://www.citizeninsomniac.com/WMV/wmfdist11.exe" target="_blank">Windows Media Format Runtime</a> manually. This<br>
|
||||
should also work under Wine. The 'N' or 'KN' editions of Windows 7 need the <a href="http://www.microsoft.com/download/en/details.aspx?id=16546" target="_blank">Windows Media Feature Pack</a>.<br><br>
|
||||
|
||||
<br><br>
|
||||
|
||||
|
@ -3071,7 +3071,6 @@
|
||||
</property>
|
||||
<addaction name="actionDisableSounds"/>
|
||||
<addaction name="actionDisableUpdateReminder"/>
|
||||
<addaction name="actionDisableWmaDecoderNotifications"/>
|
||||
<addaction name="actionDisableNeroAacNotifications"/>
|
||||
<addaction name="actionDisableSlowStartupNotifications"/>
|
||||
<addaction name="actionDisableShellIntegration"/>
|
||||
@ -3079,7 +3078,6 @@
|
||||
<addaction name="actionCheckForBetaUpdates"/>
|
||||
</widget>
|
||||
<addaction name="actionImportCueSheet"/>
|
||||
<addaction name="actionInstallWMADecoder"/>
|
||||
<addaction name="actionShowDropBoxWidget"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="menuConfiguration"/>
|
||||
@ -3477,6 +3475,8 @@
|
||||
<include location="../res/Icons.qrc"/>
|
||||
<include location="../res/Icons.qrc"/>
|
||||
<include location="../res/Icons.qrc"/>
|
||||
<include location="../res/Icons.qrc"/>
|
||||
<include location="../res/Icons.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
|
@ -27,6 +27,7 @@
|
||||
<file>tools/tta.exe</file>
|
||||
<file>tools/valdec.exe</file>
|
||||
<file>tools/wget.exe</file>
|
||||
<file>tools/wma2wav.exe</file>
|
||||
<file>tools/wupdate.exe</file>
|
||||
<file>tools/wvunpack.exe</file>
|
||||
</qresource>
|
||||
|
@ -30,7 +30,7 @@
|
||||
#define VER_LAMEXP_MINOR_LO 3
|
||||
#define VER_LAMEXP_TYPE Alpha
|
||||
#define VER_LAMEXP_PATCH 4
|
||||
#define VER_LAMEXP_BUILD 603
|
||||
#define VER_LAMEXP_BUILD 605
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Tools versions
|
||||
|
@ -31,12 +31,11 @@
|
||||
|
||||
WMADecoder::WMADecoder(void)
|
||||
:
|
||||
m_binary(lamexp_lookup_tool("wmawav.exe")),
|
||||
m_semaphore(new QSystemSemaphore("{84BB780D-67D3-49DC-ADF0-97C795A55D5C}", 1))
|
||||
m_binary(lamexp_lookup_tool("wma2wav.exe"))
|
||||
{
|
||||
if(m_binary.isEmpty())
|
||||
{
|
||||
throw "Error initializing WMA decoder. Tool 'wmawav.exe' is not registred!";
|
||||
throw "Error initializing WMA decoder. Tool 'wma2wav.exe' is not registred!";
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,26 +48,18 @@ bool WMADecoder::decode(const QString &sourceFile, const QString &outputFile, vo
|
||||
QProcess process;
|
||||
QStringList args;
|
||||
|
||||
args << pathToShort(QDir::toNativeSeparators(sourceFile));
|
||||
args << pathToShort(QDir::toNativeSeparators(outputFile));
|
||||
|
||||
if(!m_semaphore->acquire())
|
||||
{
|
||||
emit messageLogged("Failed to acquire the semaphore!");
|
||||
return false;
|
||||
}
|
||||
args << "-i" << QDir::toNativeSeparators(sourceFile);
|
||||
args << "-o" << QDir::toNativeSeparators(outputFile) << "-f";
|
||||
|
||||
if(!startProcess(process, m_binary, args))
|
||||
{
|
||||
m_semaphore->release();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bTimeout = false;
|
||||
bool bAborted = false;
|
||||
|
||||
//The WMA Decoder doesn't actually send any status updates :-[
|
||||
emit statusUpdated(20 + (QUuid::createUuid().data1 % 80));
|
||||
QRegExp regExp("\\[(\\d+)\\.(\\d+)%\\]");
|
||||
|
||||
while(process.state() != QProcess::NotRunning)
|
||||
{
|
||||
@ -83,7 +74,7 @@ bool WMADecoder::decode(const QString &sourceFile, const QString &outputFile, vo
|
||||
if(!process.bytesAvailable() && process.state() == QProcess::Running)
|
||||
{
|
||||
process.kill();
|
||||
qWarning("WmaWav process timed out <-- killing!");
|
||||
qWarning("wma2wav process timed out <-- killing!");
|
||||
emit messageLogged("\nPROCESS TIMEOUT !!!");
|
||||
bTimeout = true;
|
||||
break;
|
||||
@ -92,7 +83,13 @@ bool WMADecoder::decode(const QString &sourceFile, const QString &outputFile, vo
|
||||
{
|
||||
QByteArray line = process.readLine();
|
||||
QString text = QString::fromUtf8(line.constData()).simplified();
|
||||
if(!text.isEmpty())
|
||||
if(regExp.lastIndexIn(text) >= 0)
|
||||
{
|
||||
bool ok = false;
|
||||
int progress = regExp.cap(1).toInt(&ok);
|
||||
if(ok) emit statusUpdated(progress);
|
||||
}
|
||||
else if(!text.isEmpty())
|
||||
{
|
||||
emit messageLogged(text);
|
||||
}
|
||||
@ -108,7 +105,6 @@ bool WMADecoder::decode(const QString &sourceFile, const QString &outputFile, vo
|
||||
|
||||
emit statusUpdated(100);
|
||||
emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode()));
|
||||
m_semaphore->release();
|
||||
|
||||
if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit || QFileInfo(outputFile).size() == 0)
|
||||
{
|
||||
@ -134,11 +130,6 @@ bool WMADecoder::isFormatSupported(const QString &containerType, const QString &
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WMADecoder::isDecoderAvailable(void)
|
||||
{
|
||||
return lamexp_check_tool("wmawav.exe");
|
||||
}
|
||||
|
||||
QStringList WMADecoder::supportedTypes(void)
|
||||
{
|
||||
return QStringList() << "Windows Media Audio (*.wma)";
|
||||
|
@ -33,10 +33,8 @@ public:
|
||||
|
||||
virtual bool decode(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag);
|
||||
static bool isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion);
|
||||
static bool isDecoderAvailable(void);
|
||||
static QStringList supportedTypes(void);
|
||||
|
||||
private:
|
||||
const QString m_binary;
|
||||
QSystemSemaphore *m_semaphore;
|
||||
};
|
||||
|
@ -50,14 +50,14 @@ bool WaveDecoder::decode(const QString &sourceFile, const QString &outputFile, v
|
||||
size_t srcLen = wcslen(reinterpret_cast<const wchar_t*>(sourceFile.utf16())) + 3;
|
||||
wchar_t *srcBuffer = new wchar_t[srcLen];
|
||||
memset(srcBuffer, 0, srcLen * sizeof(wchar_t));
|
||||
wcscpy_s(srcBuffer, srcLen, reinterpret_cast<const wchar_t*>(sourceFile.utf16()));
|
||||
wcsncpy_s(srcBuffer, srcLen, reinterpret_cast<const wchar_t*>(sourceFile.utf16()), _TRUNCATE);
|
||||
FIX_SEPARATORS (srcBuffer);
|
||||
fileOperation.pFrom = srcBuffer;
|
||||
|
||||
size_t outLen = wcslen(reinterpret_cast<const wchar_t*>(outputFile.utf16())) + 3;
|
||||
wchar_t *outBuffer = new wchar_t[outLen];
|
||||
memset(outBuffer, 0, outLen * sizeof(wchar_t));
|
||||
wcscpy_s(outBuffer, outLen, reinterpret_cast<const wchar_t*>(outputFile.utf16()));
|
||||
wcsncpy_s(outBuffer, outLen, reinterpret_cast<const wchar_t*>(outputFile.utf16()), _TRUNCATE);
|
||||
FIX_SEPARATORS (outBuffer);
|
||||
fileOperation.pTo = outBuffer;
|
||||
|
||||
|
@ -84,13 +84,14 @@ AboutDialog::AboutDialog(SettingsModel *settings, QWidget *parent, bool firstSta
|
||||
{
|
||||
QString versionStr = QString().sprintf
|
||||
(
|
||||
"Version %d.%02d %s, Build %d [%s], %s, Qt v%s",
|
||||
"Version %d.%02d %s, Build %d [%s], %s %s, Qt v%s",
|
||||
lamexp_version_major(),
|
||||
lamexp_version_minor(),
|
||||
lamexp_version_release(),
|
||||
lamexp_version_build(),
|
||||
lamexp_version_date().toString(Qt::ISODate).toLatin1().constData(),
|
||||
lamexp_version_compiler(),
|
||||
lamexp_version_arch(),
|
||||
qVersion()
|
||||
);
|
||||
|
||||
|
@ -339,9 +339,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
|
||||
actionCheckForBetaUpdates->setEnabled(!lamexp_version_demo());
|
||||
connect(actionDisableUpdateReminder, SIGNAL(triggered(bool)), this, SLOT(disableUpdateReminderActionTriggered(bool)));
|
||||
connect(actionDisableSounds, SIGNAL(triggered(bool)), this, SLOT(disableSoundsActionTriggered(bool)));
|
||||
connect(actionInstallWMADecoder, SIGNAL(triggered(bool)), this, SLOT(installWMADecoderActionTriggered(bool)));
|
||||
connect(actionDisableNeroAacNotifications, SIGNAL(triggered(bool)), this, SLOT(disableNeroAacNotificationsActionTriggered(bool)));
|
||||
connect(actionDisableWmaDecoderNotifications, SIGNAL(triggered(bool)), this, SLOT(disableWmaDecoderNotificationsActionTriggered(bool)));
|
||||
connect(actionDisableSlowStartupNotifications, SIGNAL(triggered(bool)), this, SLOT(disableSlowStartupNotificationsActionTriggered(bool)));
|
||||
connect(actionDisableShellIntegration, SIGNAL(triggered(bool)), this, SLOT(disableShellIntegrationActionTriggered(bool)));
|
||||
connect(actionShowDropBoxWidget, SIGNAL(triggered(bool)), this, SLOT(showDropBoxWidgetActionTriggered(bool)));
|
||||
@ -551,81 +549,81 @@ void MainWindow::addFolder(const QString &path, bool recursive, bool delayed)
|
||||
/*
|
||||
* Download and install WMA Decoder component
|
||||
*/
|
||||
bool MainWindow::installWMADecoder(void)
|
||||
{
|
||||
static const char *download_url = "http://www.nch.com.au/components/wmawav.exe";
|
||||
static const char *download_hash = "52a3b0e6690faf3f830c336d3c0eadfb7a4e9bc6";
|
||||
|
||||
bool bResult = false;
|
||||
|
||||
QString binaryWGet = lamexp_lookup_tool("wget.exe");
|
||||
QString binaryElevator = lamexp_lookup_tool("elevator.exe");
|
||||
|
||||
if(binaryWGet.isEmpty() || binaryElevator.isEmpty())
|
||||
{
|
||||
throw "Required binary is not available!";
|
||||
}
|
||||
|
||||
while(true)
|
||||
{
|
||||
QString setupFile = QString("%1/%2.exe").arg(lamexp_temp_folder2(), lamexp_rand_str());
|
||||
|
||||
QProcess process;
|
||||
process.setWorkingDirectory(QFileInfo(setupFile).absolutePath());
|
||||
|
||||
QEventLoop loop;
|
||||
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
||||
connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit()));
|
||||
|
||||
process.start(binaryWGet, QStringList() << "-O" << QFileInfo(setupFile).fileName() << download_url);
|
||||
m_banner->show(tr("Downloading WMA Decoder Setup, please wait..."), &loop);
|
||||
|
||||
if(process.exitCode() != 0 || QFileInfo(setupFile).size() < 10240)
|
||||
{
|
||||
QFile::remove(setupFile);
|
||||
if(QMessageBox::critical(this, tr("Download Failed"), tr("Failed to download the WMA Decoder setup. Check your internet connection!"), tr("Try Again"), tr("Cancel")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
QFile setupFileContent(setupFile);
|
||||
QCryptographicHash setupFileHash(QCryptographicHash::Sha1);
|
||||
|
||||
setupFileContent.open(QIODevice::ReadOnly);
|
||||
if(setupFileContent.isOpen() && setupFileContent.isReadable())
|
||||
{
|
||||
setupFileHash.addData(setupFileContent.readAll());
|
||||
setupFileContent.close();
|
||||
}
|
||||
|
||||
if(_stricmp(setupFileHash.result().toHex().constData(), download_hash))
|
||||
{
|
||||
qWarning("Hash miscompare:\n Expected %s\n Detected %s\n", download_hash, setupFileHash.result().toHex().constData());
|
||||
QFile::remove(setupFile);
|
||||
if(QMessageBox::critical(this, tr("Download Failed"), tr("The download seems to be corrupted. Please try again!"), tr("Try Again"), tr("Cancel")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
process.start(binaryElevator, QStringList() << QString("/exec=%1").arg(setupFile));
|
||||
loop.exec(QEventLoop::ExcludeUserInputEvents);
|
||||
QFile::remove(setupFile);
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
if(QMessageBox::information(this, tr("WMA Decoder"), tr("The WMA File Decoder has been installed. Please restart LameXP now!"), tr("Quit LameXP"), tr("Postpone")) == 0)
|
||||
{
|
||||
bResult = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
//bool MainWindow::installWMADecoder(void)
|
||||
//{
|
||||
// static const char *download_url = "http://www.nch.com.au/components/wmawav.exe";
|
||||
// static const char *download_hash = "52a3b0e6690faf3f830c336d3c0eadfb7a4e9bc6";
|
||||
//
|
||||
// bool bResult = false;
|
||||
//
|
||||
// QString binaryWGet = lamexp_lookup_tool("wget.exe");
|
||||
// QString binaryElevator = lamexp_lookup_tool("elevator.exe");
|
||||
//
|
||||
// if(binaryWGet.isEmpty() || binaryElevator.isEmpty())
|
||||
// {
|
||||
// throw "Required binary is not available!";
|
||||
// }
|
||||
//
|
||||
// while(true)
|
||||
// {
|
||||
// QString setupFile = QString("%1/%2.exe").arg(lamexp_temp_folder2(), lamexp_rand_str());
|
||||
//
|
||||
// QProcess process;
|
||||
// process.setWorkingDirectory(QFileInfo(setupFile).absolutePath());
|
||||
//
|
||||
// QEventLoop loop;
|
||||
// connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
||||
// connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit()));
|
||||
//
|
||||
// process.start(binaryWGet, QStringList() << "-O" << QFileInfo(setupFile).fileName() << download_url);
|
||||
// m_banner->show(tr("Downloading WMA Decoder Setup, please wait..."), &loop);
|
||||
//
|
||||
// if(process.exitCode() != 0 || QFileInfo(setupFile).size() < 10240)
|
||||
// {
|
||||
// QFile::remove(setupFile);
|
||||
// if(QMessageBox::critical(this, tr("Download Failed"), tr("Failed to download the WMA Decoder setup. Check your internet connection!"), tr("Try Again"), tr("Cancel")) == 0)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// QFile setupFileContent(setupFile);
|
||||
// QCryptographicHash setupFileHash(QCryptographicHash::Sha1);
|
||||
//
|
||||
// setupFileContent.open(QIODevice::ReadOnly);
|
||||
// if(setupFileContent.isOpen() && setupFileContent.isReadable())
|
||||
// {
|
||||
// setupFileHash.addData(setupFileContent.readAll());
|
||||
// setupFileContent.close();
|
||||
// }
|
||||
//
|
||||
// if(_stricmp(setupFileHash.result().toHex().constData(), download_hash))
|
||||
// {
|
||||
// qWarning("Hash miscompare:\n Expected %s\n Detected %s\n", download_hash, setupFileHash.result().toHex().constData());
|
||||
// QFile::remove(setupFile);
|
||||
// if(QMessageBox::critical(this, tr("Download Failed"), tr("The download seems to be corrupted. Please try again!"), tr("Try Again"), tr("Cancel")) == 0)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
// process.start(binaryElevator, QStringList() << QString("/exec=%1").arg(setupFile));
|
||||
// loop.exec(QEventLoop::ExcludeUserInputEvents);
|
||||
// QFile::remove(setupFile);
|
||||
// QApplication::restoreOverrideCursor();
|
||||
//
|
||||
// if(QMessageBox::information(this, tr("WMA Decoder"), tr("The WMA File Decoder has been installed. Please restart LameXP now!"), tr("Quit LameXP"), tr("Postpone")) == 0)
|
||||
// {
|
||||
// bResult = true;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// return bResult;
|
||||
//}
|
||||
|
||||
/*
|
||||
* Check for updates
|
||||
@ -1012,30 +1010,30 @@ void MainWindow::windowShown(void)
|
||||
}
|
||||
|
||||
//Check for WMA support
|
||||
if(m_settings->wmaDecoderNotificationsEnabled())
|
||||
{
|
||||
if(!lamexp_check_tool("wmawav.exe"))
|
||||
{
|
||||
QString messageText;
|
||||
messageText += QString("<nobr>%1</nobr><br>").arg(tr("LameXP has detected that the WMA File Decoder component is not currently installed on your system.").replace("-", "−"));
|
||||
messageText += QString("<nobr>%1</nobr><br><br>").arg(tr("You won't be able to process WMA files as input unless the WMA File Decoder component is installed!").replace("-", "−"));
|
||||
messageText += QString("<nobr>%1</nobr>").arg(tr("Do you want to download and install the WMA File Decoder component now?").replace("-", "−"));
|
||||
int result = QMessageBox::information(this, tr("WMA Decoder Missing"), messageText, tr("Download && Install"), tr("Don't Show Again"), tr("Postpone"));
|
||||
if(result == 0)
|
||||
{
|
||||
if(installWMADecoder())
|
||||
{
|
||||
QApplication::quit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if(result == 1)
|
||||
{
|
||||
m_settings->wmaDecoderNotificationsEnabled(false);
|
||||
actionDisableWmaDecoderNotifications->setChecked(!m_settings->wmaDecoderNotificationsEnabled());
|
||||
}
|
||||
}
|
||||
}
|
||||
//if(m_settings->wmaDecoderNotificationsEnabled())
|
||||
//{
|
||||
// if(!lamexp_check_tool("wmawav.exe"))
|
||||
// {
|
||||
// QString messageText;
|
||||
// messageText += QString("<nobr>%1</nobr><br>").arg(tr("LameXP has detected that the WMA File Decoder component is not currently installed on your system.").replace("-", "−"));
|
||||
// messageText += QString("<nobr>%1</nobr><br><br>").arg(tr("You won't be able to process WMA files as input unless the WMA File Decoder component is installed!").replace("-", "−"));
|
||||
// messageText += QString("<nobr>%1</nobr>").arg(tr("Do you want to download and install the WMA File Decoder component now?").replace("-", "−"));
|
||||
// int result = QMessageBox::information(this, tr("WMA Decoder Missing"), messageText, tr("Download && Install"), tr("Don't Show Again"), tr("Postpone"));
|
||||
// if(result == 0)
|
||||
// {
|
||||
// if(installWMADecoder())
|
||||
// {
|
||||
// QApplication::quit();
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// else if(result == 1)
|
||||
// {
|
||||
// m_settings->wmaDecoderNotificationsEnabled(false);
|
||||
// actionDisableWmaDecoderNotifications->setChecked(!m_settings->wmaDecoderNotificationsEnabled());
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//Add files from the command-line
|
||||
for(int i = 0; i < arguments.count() - 1; i++)
|
||||
@ -1467,28 +1465,28 @@ void MainWindow::disableNeroAacNotificationsActionTriggered(bool checked)
|
||||
/*
|
||||
* Disable WMA Decoder component action
|
||||
*/
|
||||
void MainWindow::disableWmaDecoderNotificationsActionTriggered(bool checked)
|
||||
{
|
||||
if(checked)
|
||||
{
|
||||
if(0 == QMessageBox::question(this, tr("WMA Decoder Notifications"), tr("Do you really want to disable all WMA Decoder notifications?"), tr("Yes"), tr("No"), QString(), 1))
|
||||
{
|
||||
QMessageBox::information(this, tr("WMA Decoder Notifications"), tr("All WMA Decoder notifications have been disabled."));
|
||||
m_settings->wmaDecoderNotificationsEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings->wmaDecoderNotificationsEnabled(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::information(this, tr("WMA Decoder Notifications"), tr("The WMA Decoder notifications have been re-enabled."));
|
||||
m_settings->wmaDecoderNotificationsEnabled(true);
|
||||
}
|
||||
|
||||
actionDisableWmaDecoderNotifications->setChecked(!m_settings->wmaDecoderNotificationsEnabled());
|
||||
}
|
||||
//void MainWindow::disableWmaDecoderNotificationsActionTriggered(bool checked)
|
||||
//{
|
||||
// if(checked)
|
||||
// {
|
||||
// if(0 == QMessageBox::question(this, tr("WMA Decoder Notifications"), tr("Do you really want to disable all WMA Decoder notifications?"), tr("Yes"), tr("No"), QString(), 1))
|
||||
// {
|
||||
// QMessageBox::information(this, tr("WMA Decoder Notifications"), tr("All WMA Decoder notifications have been disabled."));
|
||||
// m_settings->wmaDecoderNotificationsEnabled(false);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// m_settings->wmaDecoderNotificationsEnabled(true);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// QMessageBox::information(this, tr("WMA Decoder Notifications"), tr("The WMA Decoder notifications have been re-enabled."));
|
||||
// m_settings->wmaDecoderNotificationsEnabled(true);
|
||||
// }
|
||||
//
|
||||
// actionDisableWmaDecoderNotifications->setChecked(!m_settings->wmaDecoderNotificationsEnabled());
|
||||
//}
|
||||
|
||||
/*
|
||||
* Disable slow startup action
|
||||
@ -1519,17 +1517,17 @@ void MainWindow::disableSlowStartupNotificationsActionTriggered(bool checked)
|
||||
/*
|
||||
* Download and install WMA Decoder component
|
||||
*/
|
||||
void MainWindow::installWMADecoderActionTriggered(bool checked)
|
||||
{
|
||||
if(QMessageBox::question(this, tr("Install WMA Decoder"), tr("Do you want to download and install the WMA File Decoder component now?"), tr("Download && Install"), tr("Cancel")) == 0)
|
||||
{
|
||||
if(installWMADecoder())
|
||||
{
|
||||
QApplication::quit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void MainWindow::installWMADecoderActionTriggered(bool checked)
|
||||
//{
|
||||
// if(QMessageBox::question(this, tr("Install WMA Decoder"), tr("Do you want to download and install the WMA File Decoder component now?"), tr("Download && Install"), tr("Cancel")) == 0)
|
||||
// {
|
||||
// if(installWMADecoder())
|
||||
// {
|
||||
// QApplication::quit();
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
/*
|
||||
* Import a Cue Sheet file
|
||||
|
@ -74,7 +74,6 @@ private slots:
|
||||
void disableSlowStartupNotificationsActionTriggered(bool checked);
|
||||
void disableSoundsActionTriggered(bool checked);
|
||||
void disableUpdateReminderActionTriggered(bool checked);
|
||||
void disableWmaDecoderNotificationsActionTriggered(bool checked);
|
||||
void documentActionActivated(void);
|
||||
void editMetaButtonClicked(void);
|
||||
void encodeButtonClicked(void);
|
||||
@ -87,7 +86,6 @@ private slots:
|
||||
void handleDelayedFiles(void);
|
||||
void importCueSheetActionTriggered(bool checked);
|
||||
void initOutputFolderModel(void);
|
||||
void installWMADecoderActionTriggered(bool checked);
|
||||
void languageActionActivated(QAction *action);
|
||||
void languageFromFileActionActivated(bool checked);
|
||||
void makeFolderButtonClicked(void);
|
||||
|
@ -66,14 +66,14 @@ bool WaveEncoder::encode(const QString &sourceFile, const AudioFileModel &metaIn
|
||||
size_t srcLen = wcslen(reinterpret_cast<const wchar_t*>(sourceFile.utf16())) + 3;
|
||||
wchar_t *srcBuffer = new wchar_t[srcLen];
|
||||
memset(srcBuffer, 0, srcLen * sizeof(wchar_t));
|
||||
wcscpy_s(srcBuffer, srcLen, reinterpret_cast<const wchar_t*>(sourceFile.utf16()));
|
||||
wcsncpy_s(srcBuffer, srcLen, reinterpret_cast<const wchar_t*>(sourceFile.utf16()), _TRUNCATE);
|
||||
FIX_SEPARATORS (srcBuffer);
|
||||
fileOperation.pFrom = srcBuffer;
|
||||
|
||||
size_t outLen = wcslen(reinterpret_cast<const wchar_t*>(outputFile.utf16())) + 3;
|
||||
wchar_t *outBuffer = new wchar_t[outLen];
|
||||
memset(outBuffer, 0, outLen * sizeof(wchar_t));
|
||||
wcscpy_s(outBuffer, outLen, reinterpret_cast<const wchar_t*>(outputFile.utf16()));
|
||||
wcsncpy_s(outBuffer, outLen, reinterpret_cast<const wchar_t*>(outputFile.utf16()), _TRUNCATE);
|
||||
FIX_SEPARATORS (outBuffer);
|
||||
fileOperation.pTo = outBuffer;
|
||||
|
||||
|
@ -105,6 +105,7 @@ g_lamexp_version =
|
||||
static QDate g_lamexp_version_date;
|
||||
static const char *g_lamexp_months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
static const char *g_lamexp_version_raw_date = __DATE__;
|
||||
static const char *g_lamexp_version_raw_time = __TIME__;
|
||||
|
||||
//Console attached flag
|
||||
static bool g_lamexp_console_attached = false;
|
||||
@ -150,6 +151,15 @@ static bool g_lamexp_console_attached = false;
|
||||
#error Compiler is not supported!
|
||||
#endif
|
||||
|
||||
//Architecture detection
|
||||
#if defined(_M_X64)
|
||||
static const char *g_lamexp_version_arch = "x64";
|
||||
#elif defined(_M_IX86)
|
||||
static const char *g_lamexp_version_arch = "x86";
|
||||
#else
|
||||
#error Architecture is not supported!
|
||||
#endif
|
||||
|
||||
//Official web-site URL
|
||||
static const char *g_lamexp_website_url = "http://lamexp.sourceforge.net/";
|
||||
static const char *g_lamexp_support_url = "http://forum.doom9.org/showthread.php?t=157726";
|
||||
@ -221,7 +231,9 @@ unsigned int lamexp_version_major(void) { return g_lamexp_version.ver_major; }
|
||||
unsigned int lamexp_version_minor(void) { return g_lamexp_version.ver_minor; }
|
||||
unsigned int lamexp_version_build(void) { return g_lamexp_version.ver_build; }
|
||||
const char *lamexp_version_release(void) { return g_lamexp_version.ver_release_name; }
|
||||
const char *lamexp_version_compiler(void) {return g_lamexp_version_compiler; }
|
||||
const char *lamexp_version_time(void) { return g_lamexp_version_raw_time; }
|
||||
const char *lamexp_version_compiler(void) { return g_lamexp_version_compiler; }
|
||||
const char *lamexp_version_arch(void) { return g_lamexp_version_arch; }
|
||||
unsigned int lamexp_toolver_neroaac(void) { return g_lamexp_toolver_neroaac; }
|
||||
|
||||
/*
|
||||
@ -319,6 +331,19 @@ LONG WINAPI lamexp_exception_handler(__in struct _EXCEPTION_POINTERS *ExceptionI
|
||||
return LONG_MAX;
|
||||
}
|
||||
|
||||
void lamexp_invalid_param_handler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t)
|
||||
{
|
||||
if(GetCurrentThreadId() != g_main_thread_id)
|
||||
{
|
||||
HANDLE mainThread = OpenThread(THREAD_TERMINATE, FALSE, g_main_thread_id);
|
||||
if(mainThread) TerminateThread(mainThread, ULONG_MAX);
|
||||
|
||||
}
|
||||
|
||||
FatalAppExit(0, L"Invalid parameter handler invoked, application will exit!");
|
||||
TerminateProcess(GetCurrentProcess(), -1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Qt message handler
|
||||
*/
|
||||
@ -684,6 +709,7 @@ static bool lamexp_check_elevation(void)
|
||||
bool lamexp_init_qt(int argc, char* argv[])
|
||||
{
|
||||
static bool qt_initialized = false;
|
||||
typedef BOOL (WINAPI *SetDllDirectoryProc)(WCHAR *lpPathName);
|
||||
|
||||
//Don't initialized again, if done already
|
||||
if(qt_initialized)
|
||||
@ -691,6 +717,11 @@ bool lamexp_init_qt(int argc, char* argv[])
|
||||
return true;
|
||||
}
|
||||
|
||||
//Secure DLL loading
|
||||
QLibrary kernel32("kernel32.dll");
|
||||
SetDllDirectoryProc pSetDllDirectory = static_cast<SetDllDirectoryProc>(kernel32.resolve("SetDllDirectoryW"));
|
||||
if(pSetDllDirectory != NULL) pSetDllDirectory(L"");
|
||||
|
||||
//Extract executable name from argv[] array
|
||||
char *executableName = argv[0];
|
||||
while(char *temp = strpbrk(executableName, "\\/:?"))
|
||||
|
@ -73,9 +73,11 @@ unsigned int lamexp_version_major(void);
|
||||
unsigned int lamexp_version_minor(void);
|
||||
unsigned int lamexp_version_build(void);
|
||||
const QDate &lamexp_version_date(void);
|
||||
const char *lamexp_version_time(void);
|
||||
const char *lamexp_version_release(void);
|
||||
bool lamexp_version_demo(void);
|
||||
const char *lamexp_version_compiler(void);
|
||||
const char *lamexp_version_arch(void);
|
||||
QDate lamexp_version_expires(void);
|
||||
unsigned int lamexp_toolver_neroaac(void);
|
||||
const char *lamexp_website_url(void);
|
||||
@ -86,6 +88,7 @@ void lamexp_init_console(int argc, char* argv[]);
|
||||
bool lamexp_init_qt(int argc, char* argv[]);
|
||||
int lamexp_init_ipc(void);
|
||||
LONG WINAPI lamexp_exception_handler(__in struct _EXCEPTION_POINTERS *ExceptionInfo);
|
||||
void lamexp_invalid_param_handler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t);
|
||||
void lamexp_message_handler(QtMsgType type, const char *msg);
|
||||
void lamexp_register_tool(const QString &toolName, LockedFile *file, unsigned int version = 0);
|
||||
bool lamexp_check_tool(const QString &toolName);
|
||||
|
@ -53,14 +53,14 @@ static int lamexp_main(int argc, char* argv[])
|
||||
lamexp_init_console(argc, argv);
|
||||
|
||||
//Print version info
|
||||
qDebug("LameXP - Audio Encoder Front-End");
|
||||
qDebug("Version %d.%02d %s, Build %d [%s], compiled with %s", lamexp_version_major(), lamexp_version_minor(), lamexp_version_release(), lamexp_version_build(), lamexp_version_date().toString(Qt::ISODate).toLatin1().constData(), lamexp_version_compiler());
|
||||
qDebug("Copyright (C) 2004-%04d LoRd_MuldeR <MuldeR2@GMX.de>\n", max(lamexp_version_date().year(),QDate::currentDate().year()));
|
||||
qDebug("LameXP - Audio Encoder Front-End v%d.%02d %s (Build #%03d)", lamexp_version_major(), lamexp_version_minor(), lamexp_version_release(), lamexp_version_build());
|
||||
qDebug("Copyright (c) 2004-%04d LoRd_MuldeR <mulder2@gmx.de>. Some rights reserved.", max(lamexp_version_date().year(),QDate::currentDate().year()));
|
||||
qDebug("Built on %s at %s with %s for Win-%s.\n", lamexp_version_date().toString(Qt::ISODate).toLatin1().constData(), lamexp_version_time(), lamexp_version_compiler(), lamexp_version_arch());
|
||||
|
||||
//print license info
|
||||
qDebug("This program is free software: you can redistribute it and/or modify");
|
||||
qDebug("it under the terms of the GNU General Public License <http://www.gnu.org/>.");
|
||||
qDebug("This program comes with ABSOLUTELY NO WARRANTY.\n");
|
||||
qDebug("Note that this program is distributed with ABSOLUTELY NO WARRANTY.\n");
|
||||
|
||||
//Print warning, if this is a "debug" build
|
||||
if(LAMEXP_DEBUG)
|
||||
@ -240,6 +240,7 @@ int main(int argc, char* argv[])
|
||||
__try
|
||||
{
|
||||
SetUnhandledExceptionFilter(lamexp_exception_handler);
|
||||
_set_invalid_parameter_handler(lamexp_invalid_param_handler);
|
||||
return _main(argc, argv);
|
||||
}
|
||||
__except(1)
|
||||
|
@ -78,6 +78,7 @@ g_lamexp_tools[] =
|
||||
{"9b50cf64747d4afbad5d8d9b5a0a2d41c5a58256f47ebdbd8cc920e7e576085dfe1b14ff", CPU_TYPE_ALL, "tta.exe", 21},
|
||||
{"875871c942846f6ad163f9e4949bba2f4331bec678ca5aefe58c961b6825bd0d419a078b", CPU_TYPE_ALL, "valdec.exe", 31},
|
||||
{"e657331e281840878a37eb4fb357cb79f33d528ddbd5f9b2e2f7d2194bed4720e1af8eaf", CPU_TYPE_ALL, "wget.exe", 1114},
|
||||
{"42a541d0fbcbc7ee9777f3519ffeee77f516ed26a01beb891fcc7c66d2a3e238407e6e6b", CPU_TYPE_ALL, "wma2wav.exe", 20110726},
|
||||
{"a258711f7a8a0c75528f3ed4d2c17513ff8598b7e0a9d7db13ca941a3140094ffc2ffb62", CPU_TYPE_ALL, "wupdate.exe", UINT_MAX},
|
||||
{"6b053b37d47a9c8659ebf2de43ad19dcba17b9cd868b26974b9cc8c27b6167e8bf07a5a2", CPU_TYPE_ALL, "wvunpack.exe", 4601},
|
||||
{NULL, NULL, NULL, NULL}
|
||||
@ -223,9 +224,6 @@ void InitializationThread::run()
|
||||
|
||||
//Look for Nero encoder
|
||||
initNeroAac();
|
||||
|
||||
//Look for WMA File decoder
|
||||
initWmaDec();
|
||||
|
||||
delay();
|
||||
m_bSuccess = true;
|
||||
@ -402,85 +400,85 @@ void InitializationThread::initNeroAac(void)
|
||||
}
|
||||
|
||||
|
||||
void InitializationThread::initWmaDec(void)
|
||||
{
|
||||
static const char* wmaDecoderComponentPath = "NCH Software/Components/wmawav/wmawav.exe";
|
||||
|
||||
LockedFile *wmaFileBin = NULL;
|
||||
QFileInfo wmaFileInfo = QFileInfo(QString("%1/%2").arg(lamexp_known_folder(lamexp_folder_programfiles), wmaDecoderComponentPath));
|
||||
|
||||
if(!(wmaFileInfo.exists() && wmaFileInfo.isFile()))
|
||||
{
|
||||
wmaFileInfo.setFile(QString("%1/%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), "wmawav.exe"));
|
||||
}
|
||||
if(!(wmaFileInfo.exists() && wmaFileInfo.isFile()))
|
||||
{
|
||||
qDebug("WMA File Decoder not found -> WMA decoding support will be disabled!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
wmaFileBin = new LockedFile(wmaFileInfo.canonicalFilePath());
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
qWarning("Failed to get excluive lock to WMA File Decoder binary -> WMA decoding support will be disabled!");
|
||||
return;
|
||||
}
|
||||
|
||||
QProcess process;
|
||||
process.setProcessChannelMode(QProcess::MergedChannels);
|
||||
process.setReadChannel(QProcess::StandardOutput);
|
||||
process.start(wmaFileInfo.canonicalFilePath(), QStringList());
|
||||
|
||||
if(!process.waitForStarted())
|
||||
{
|
||||
qWarning("WmaWav process failed to create!");
|
||||
qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData());
|
||||
process.kill();
|
||||
process.waitForFinished(-1);
|
||||
return;
|
||||
}
|
||||
|
||||
bool b_wmaWavFound = false;
|
||||
|
||||
while(process.state() != QProcess::NotRunning)
|
||||
{
|
||||
if(!process.waitForReadyRead())
|
||||
{
|
||||
if(process.state() == QProcess::Running)
|
||||
{
|
||||
qWarning("WmaWav process time out -> killing!");
|
||||
process.kill();
|
||||
process.waitForFinished(-1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
while(process.canReadLine())
|
||||
{
|
||||
QString line = QString::fromUtf8(process.readLine().constData()).simplified();
|
||||
if(line.contains("Usage: wmatowav.exe WMAFileSpec WAVFileSpec", Qt::CaseInsensitive))
|
||||
{
|
||||
b_wmaWavFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!b_wmaWavFound)
|
||||
{
|
||||
qWarning("WmaWav could not be identified -> WMA decoding support will be disabled!\n");
|
||||
LAMEXP_DELETE(wmaFileBin);
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug("Found WMA File Decoder binary:\n%s\n", wmaFileInfo.canonicalFilePath().toUtf8().constData());
|
||||
|
||||
if(wmaFileBin)
|
||||
{
|
||||
lamexp_register_tool(wmaFileInfo.fileName(), wmaFileBin);
|
||||
}
|
||||
}
|
||||
//void InitializationThread::initWmaDec(void)
|
||||
//{
|
||||
// static const char* wmaDecoderComponentPath = "NCH Software/Components/wmawav/wmawav.exe";
|
||||
//
|
||||
// LockedFile *wmaFileBin = NULL;
|
||||
// QFileInfo wmaFileInfo = QFileInfo(QString("%1/%2").arg(lamexp_known_folder(lamexp_folder_programfiles), wmaDecoderComponentPath));
|
||||
//
|
||||
// if(!(wmaFileInfo.exists() && wmaFileInfo.isFile()))
|
||||
// {
|
||||
// wmaFileInfo.setFile(QString("%1/%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), "wmawav.exe"));
|
||||
// }
|
||||
// if(!(wmaFileInfo.exists() && wmaFileInfo.isFile()))
|
||||
// {
|
||||
// qDebug("WMA File Decoder not found -> WMA decoding support will be disabled!\n");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// try
|
||||
// {
|
||||
// wmaFileBin = new LockedFile(wmaFileInfo.canonicalFilePath());
|
||||
// }
|
||||
// catch(...)
|
||||
// {
|
||||
// qWarning("Failed to get excluive lock to WMA File Decoder binary -> WMA decoding support will be disabled!");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// QProcess process;
|
||||
// process.setProcessChannelMode(QProcess::MergedChannels);
|
||||
// process.setReadChannel(QProcess::StandardOutput);
|
||||
// process.start(wmaFileInfo.canonicalFilePath(), QStringList());
|
||||
//
|
||||
// if(!process.waitForStarted())
|
||||
// {
|
||||
// qWarning("WmaWav process failed to create!");
|
||||
// qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData());
|
||||
// process.kill();
|
||||
// process.waitForFinished(-1);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// bool b_wmaWavFound = false;
|
||||
//
|
||||
// while(process.state() != QProcess::NotRunning)
|
||||
// {
|
||||
// if(!process.waitForReadyRead())
|
||||
// {
|
||||
// if(process.state() == QProcess::Running)
|
||||
// {
|
||||
// qWarning("WmaWav process time out -> killing!");
|
||||
// process.kill();
|
||||
// process.waitForFinished(-1);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// while(process.canReadLine())
|
||||
// {
|
||||
// QString line = QString::fromUtf8(process.readLine().constData()).simplified();
|
||||
// if(line.contains("Usage: wmatowav.exe WMAFileSpec WAVFileSpec", Qt::CaseInsensitive))
|
||||
// {
|
||||
// b_wmaWavFound = true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if(!b_wmaWavFound)
|
||||
// {
|
||||
// qWarning("WmaWav could not be identified -> WMA decoding support will be disabled!\n");
|
||||
// LAMEXP_DELETE(wmaFileBin);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// qDebug("Found WMA File Decoder binary:\n%s\n", wmaFileInfo.canonicalFilePath().toUtf8().constData());
|
||||
//
|
||||
// if(wmaFileBin)
|
||||
// {
|
||||
// lamexp_register_tool(wmaFileInfo.fileName(), wmaFileBin);
|
||||
// }
|
||||
//}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// EVENTS
|
||||
|
@ -42,7 +42,6 @@ private:
|
||||
void delay(void);
|
||||
void initTranslations(void);
|
||||
void initNeroAac(void);
|
||||
void initWmaDec(void);
|
||||
|
||||
bool m_bSuccess;
|
||||
lamexp_cpu_t m_cpuFeatures;
|
||||
|
@ -114,7 +114,7 @@ void ProcessThread::processFile()
|
||||
|
||||
qDebug("Process thread %s has started.", m_jobId.toString().toLatin1().constData());
|
||||
emit processStateInitialized(m_jobId, QFileInfo(m_audioFile.filePath()).fileName(), tr("Starting..."), ProgressModel::JobRunning);
|
||||
handleMessage(QString().sprintf("LameXP v%u.%02u (Build #%u), compiled at %s", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_date().toString(Qt::ISODate).toLatin1().constData()));
|
||||
handleMessage(QString().sprintf("LameXP v%u.%02u (Build #%u), compiled on %s at %s", lamexp_version_major(), lamexp_version_minor(), lamexp_version_build(), lamexp_version_date().toString(Qt::ISODate).toLatin1().constData(), lamexp_version_time()));
|
||||
handleMessage("\n-------------------------------\n");
|
||||
|
||||
//Generate output file name
|
||||
|
Loading…
Reference in New Issue
Block a user