diff --git a/res/Tools.qrc b/res/Tools.qrc
index 32db05d3..f05c440a 100644
--- a/res/Tools.qrc
+++ b/res/Tools.qrc
@@ -9,14 +9,14 @@
tools/gpgv.gpg
tools/lame.exe
tools/mac.exe
- tools/mediainfo_i386.exe
- tools/mediainfo_x64.exe
+ tools/mediainfo.i386.exe
+ tools/mediainfo.x64.exe
tools/mpcdec.exe
tools/mpg123.exe
tools/oggdec.exe
- tools/oggenc2_i386.exe
- tools/oggenc2_sse2.exe
- tools/oggenc2_x64.exe
+ tools/oggenc2.i386.exe
+ tools/oggenc2.sse2.exe
+ tools/oggenc2.x64.exe
tools/shorten.exe
tools/sox.exe
tools/speexdec.exe
diff --git a/res/tools/mediainfo_i386.exe b/res/tools/mediainfo.i386.exe
similarity index 100%
rename from res/tools/mediainfo_i386.exe
rename to res/tools/mediainfo.i386.exe
diff --git a/res/tools/mediainfo_x64.exe b/res/tools/mediainfo.x64.exe
similarity index 100%
rename from res/tools/mediainfo_x64.exe
rename to res/tools/mediainfo.x64.exe
diff --git a/res/tools/oggenc2_i386.exe b/res/tools/oggenc2.i386.exe
similarity index 100%
rename from res/tools/oggenc2_i386.exe
rename to res/tools/oggenc2.i386.exe
diff --git a/res/tools/oggenc2_sse2.exe b/res/tools/oggenc2.sse2.exe
similarity index 100%
rename from res/tools/oggenc2_sse2.exe
rename to res/tools/oggenc2.sse2.exe
diff --git a/res/tools/oggenc2_x64.exe b/res/tools/oggenc2.x64.exe
similarity index 100%
rename from res/tools/oggenc2_x64.exe
rename to res/tools/oggenc2.x64.exe
diff --git a/src/Config.h b/src/Config.h
index 93a69bba..961ee28f 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -25,7 +25,7 @@
#define VER_LAMEXP_MAJOR 4
#define VER_LAMEXP_MINOR_HI 0
#define VER_LAMEXP_MINOR_LO 2
-#define VER_LAMEXP_BUILD 430
+#define VER_LAMEXP_BUILD 432
#define VER_LAMEXP_SUFFIX Alpha-1
/*
diff --git a/src/Encoder_Vorbis.cpp b/src/Encoder_Vorbis.cpp
index 998b18ba..1b4c69b9 100644
--- a/src/Encoder_Vorbis.cpp
+++ b/src/Encoder_Vorbis.cpp
@@ -32,11 +32,9 @@
VorbisEncoder::VorbisEncoder(void)
:
- m_binary_i386(lamexp_lookup_tool("oggenc2_i386.exe")),
- m_binary_sse2(lamexp_lookup_tool("oggenc2_sse2.exe")),
- m_binary_x64(lamexp_lookup_tool("oggenc2_x64.exe"))
+ m_binary(lamexp_lookup_tool("oggenc2.exe"))
{
- if(m_binary_i386.isEmpty() || m_binary_sse2.isEmpty() || m_binary_x64.isEmpty())
+ if(m_binary.isEmpty())
{
throw "Error initializing Vorbis encoder. Tool 'oggenc2.exe' is not registred!";
}
@@ -55,8 +53,6 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel &meta
QProcess process;
QStringList args;
const QString baseName = QFileInfo(outputFile).fileName();
- lamexp_cpu_t cpuFeatures = lamexp_detect_cpu_features();
- const QString &binary = (cpuFeatures.x64 ? m_binary_x64 : ((cpuFeatures.intel && cpuFeatures.sse && cpuFeatures.sse2) ? m_binary_sse2 : m_binary_i386));
switch(m_configRCMode)
{
@@ -97,7 +93,7 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel &meta
args << "-o" << QDir::toNativeSeparators(outputFile);
args << QDir::toNativeSeparators(sourceFile);
- if(!startProcess(process, binary, args))
+ if(!startProcess(process, m_binary, args))
{
return false;
}
diff --git a/src/Encoder_Vorbis.h b/src/Encoder_Vorbis.h
index 04d2fb64..9a024af9 100644
--- a/src/Encoder_Vorbis.h
+++ b/src/Encoder_Vorbis.h
@@ -40,9 +40,7 @@ public:
virtual void setSamplingRate(int value);
private:
- const QString m_binary_i386;
- const QString m_binary_sse2;
- const QString m_binary_x64;
+ const QString m_binary;
int m_configBitrateMaximum;
int m_configBitrateMinimum;
int m_configSamplingRate;
diff --git a/src/Main.cpp b/src/Main.cpp
index 936bdbb3..1f237cd7 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -122,7 +122,7 @@ int lamexp_main(int argc, char* argv[])
SettingsModel *settingsModel = new SettingsModel();
//Show splash screen
- InitializationThread *poInitializationThread = new InitializationThread();
+ InitializationThread *poInitializationThread = new InitializationThread(&cpuFeatures);
SplashScreen::showSplash(poInitializationThread);
LAMEXP_DELETE(poInitializationThread);
diff --git a/src/Thread_FileAnalyzer.cpp b/src/Thread_FileAnalyzer.cpp
index 3d8a087b..dcb41153 100644
--- a/src/Thread_FileAnalyzer.cpp
+++ b/src/Thread_FileAnalyzer.cpp
@@ -42,12 +42,11 @@
FileAnalyzer::FileAnalyzer(const QStringList &inputFiles)
:
m_inputFiles(inputFiles),
- m_mediaInfoBin_x86(lamexp_lookup_tool("mediainfo_i386.exe")),
- m_mediaInfoBin_x64(lamexp_lookup_tool("mediainfo_x64.exe"))
+ m_mediaInfoBin(lamexp_lookup_tool("mediainfo.exe"))
{
m_bSuccess = false;
- if(m_mediaInfoBin_x86.isEmpty() || m_mediaInfoBin_x64.isEmpty())
+ if(m_mediaInfoBin.isEmpty())
{
qFatal("Invalid path to MediaInfo binary. Tool not initialized properly.");
}
@@ -102,9 +101,6 @@ void FileAnalyzer::run()
const AudioFileModel FileAnalyzer::analyzeFile(const QString &filePath)
{
- lamexp_cpu_t cpuInfo = lamexp_detect_cpu_features();
- const QString mediaInfoBin = cpuInfo.x64 ? m_mediaInfoBin_x64 : m_mediaInfoBin_x86;
-
AudioFileModel audioFile(filePath);
m_currentSection = sectionOther;
m_currentCover = coverNone;
@@ -129,7 +125,7 @@ const AudioFileModel FileAnalyzer::analyzeFile(const QString &filePath)
QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
process.setReadChannel(QProcess::StandardOutput);
- process.start(mediaInfoBin, QStringList() << QDir::toNativeSeparators(filePath));
+ process.start(m_mediaInfoBin, QStringList() << QDir::toNativeSeparators(filePath));
if(!process.waitForStarted())
{
@@ -201,7 +197,7 @@ const AudioFileModel FileAnalyzer::analyzeFile(const QString &filePath)
if(m_currentCover != coverNone)
{
- retrieveCover(audioFile, filePath, mediaInfoBin);
+ retrieveCover(audioFile, filePath);
}
return audioFile;
@@ -404,7 +400,7 @@ bool FileAnalyzer::checkFile_CDDA(QFile &file)
return ((i >= 0) && (j >= 0) && (k >= 0) && (k > j) && (j > i));
}
-void FileAnalyzer::retrieveCover(AudioFileModel &audioFile, const QString &filePath, const QString &mediaInfoBin)
+void FileAnalyzer::retrieveCover(AudioFileModel &audioFile, const QString &filePath)
{
qDebug64("Retrieving cover from: %1", filePath);
QString extension;
@@ -425,7 +421,7 @@ void FileAnalyzer::retrieveCover(AudioFileModel &audioFile, const QString &fileP
QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
process.setReadChannel(QProcess::StandardOutput);
- process.start(mediaInfoBin, QStringList() << "-f" << QDir::toNativeSeparators(filePath));
+ process.start(m_mediaInfoBin, QStringList() << "-f" << QDir::toNativeSeparators(filePath));
if(!process.waitForStarted())
{
diff --git a/src/Thread_FileAnalyzer.h b/src/Thread_FileAnalyzer.h
index c625d2de..b5d61d65 100644
--- a/src/Thread_FileAnalyzer.h
+++ b/src/Thread_FileAnalyzer.h
@@ -73,11 +73,10 @@ private:
unsigned int parseYear(const QString &str);
unsigned int parseDuration(const QString &str);
bool checkFile_CDDA(QFile &file);
- void retrieveCover(AudioFileModel &audioFile, const QString &filePath, const QString &mediaInfoBin);
+ void retrieveCover(AudioFileModel &audioFile, const QString &filePath);
QStringList m_inputFiles;
- const QString m_mediaInfoBin_x86;
- const QString m_mediaInfoBin_x64;
+ const QString m_mediaInfoBin;
section_t m_currentSection;
cover_t m_currentCover;
unsigned int m_filesAccepted;
diff --git a/src/Thread_Initialization.cpp b/src/Thread_Initialization.cpp
index 760037e6..cc34d3e2 100644
--- a/src/Thread_Initialization.cpp
+++ b/src/Thread_Initialization.cpp
@@ -21,7 +21,6 @@
#include "Thread_Initialization.h"
-#include "Global.h"
#include "LockedFile.h"
#include
@@ -39,48 +38,62 @@
// TOOLS
////////////////////////////////////////////////////////////
+#define CPU_TYPE_X86 0x000001 //x86-32
+#define CPU_TYPE_SSE 0x000002 //x86-32 + SSE2 (Intel only!)
+#define CPU_TYPE_X64 0x000004 //x86-64
+
+#define CPU_TYPE_GEN (CPU_TYPE_X86|CPU_TYPE_SSE) //Generic: use for all x86-32 CPU's
+#define CPU_TYPE_ALL (CPU_TYPE_X86|CPU_TYPE_SSE|CPU_TYPE_X64) //All: use for all CPU's (x86-32 and x86-64)
+
static const struct
{
char *pcHash;
+ unsigned int uiCpuType;
char *pcName;
unsigned int uiVersion;
}
g_lamexp_tools[] =
{
- {"3b41f85dde8d4a5a0f4cd5f461099d0db24610ba", "alac.exe", UINT_MAX},
- {"fb74ac8b73ad8cba2c3b4e6e61f23401d630dc22", "elevator.exe", UINT_MAX},
- {"3c647950bccfcc75d0746c0772e7115684be4dc5", "faad.exe", 27},
- {"d33cd86f04bd4067e244d2804466583c7b90a4e2", "flac.exe", 121},
- {"9328a50e89b54ec065637496d9681a7e3eebf915", "gpgv.exe", 1411},
- {"d837bf6ee4dab557d8b02d46c75a24e58980fffa", "gpgv.gpg", UINT_MAX},
- {"b8800842893e2900eea7cda5c2556661333bc5db", "lame.exe", 39916},
- {"a4e929cfaa42fa2e61a3d0c6434c77a06d45aef3", "mac.exe", 406},
- {"9ee3074dc3232c61c0ffd6ae6755f65974695c51", "mediainfo_i386.exe", 743},
- {"3691da33a4efd7625d1bd01cbf5ce6ffd8a12d19", "mediainfo_x64.exe", 743},
- {"aa89763a5ba4d1a5986549b9ee53e005c51940c1", "mpcdec.exe", 435},
- {"38f81efca6c1eeab0b9dc39d06c2ac750267217f", "mpg123.exe", 1132},
- {"8dd7138714c3bcb39f5a3213413addba13d06f1e", "oggdec.exe", UINT_MAX},
- {"14a99d3b1f0b166dbd68db45196da871e58e14ec", "oggenc2_i386.exe", 287602},
- {"36f8d93ef3df6a420a73a9b5cf02dafdaf4321f0", "oggenc2_sse2.exe", 287602},
- {"87ad1af73e9b9db3da3db645e5c2253cb0c2a2ea", "oggenc2_x64.exe", 287602},
- {"0d9035bb62bdf46a2785261f8be5a4a0972abd15", "shorten.exe", 361},
- {"50ead3b852cbfc067a402e6c2d0d0d8879663dec", "sox.exe", 1432},
- {"8671e16497a2d217d3707d4aa418678d02b16bcc", "speexdec.exe", 12},
- {"093bfdec22872ca99e40183937c88785468be989", "tta.exe", 21},
- {"8c842eef65248b46fa6cb9a9e5714f575672d999", "valdec.exe", 31},
- {"62e2805d1b2eb2a4d86a5ca6e6ea58010d05d2a7", "wget.exe", 1114},
- {"a7e8aad52213e339ad985829722f35eab62be182", "wupdate.exe", UINT_MAX},
- {"b7d14b3540d24df13119a55d97623a61412de6e3", "wvunpack.exe", 4601},
- {NULL, NULL, NULL}
+ {"3b41f85dde8d4a5a0f4cd5f461099d0db24610ba", CPU_TYPE_ALL, "alac.exe", UINT_MAX},
+ {"fb74ac8b73ad8cba2c3b4e6e61f23401d630dc22", CPU_TYPE_ALL, "elevator.exe", UINT_MAX},
+ {"3c647950bccfcc75d0746c0772e7115684be4dc5", CPU_TYPE_ALL, "faad.exe", 27},
+ {"d33cd86f04bd4067e244d2804466583c7b90a4e2", CPU_TYPE_ALL, "flac.exe", 121},
+ {"9328a50e89b54ec065637496d9681a7e3eebf915", CPU_TYPE_ALL, "gpgv.exe", 1411},
+ {"d837bf6ee4dab557d8b02d46c75a24e58980fffa", CPU_TYPE_ALL, "gpgv.gpg", UINT_MAX},
+ {"b8800842893e2900eea7cda5c2556661333bc5db", CPU_TYPE_ALL, "lame.exe", 39916},
+ {"a4e929cfaa42fa2e61a3d0c6434c77a06d45aef3", CPU_TYPE_ALL, "mac.exe", 406},
+ {"9ee3074dc3232c61c0ffd6ae6755f65974695c51", CPU_TYPE_GEN, "mediainfo.i386.exe", 743},
+ {"3691da33a4efd7625d1bd01cbf5ce6ffd8a12d19", CPU_TYPE_X64, "mediainfo.x64.exe", 743},
+ {"aa89763a5ba4d1a5986549b9ee53e005c51940c1", CPU_TYPE_ALL, "mpcdec.exe", 435},
+ {"38f81efca6c1eeab0b9dc39d06c2ac750267217f", CPU_TYPE_ALL, "mpg123.exe", 1132},
+ {"8dd7138714c3bcb39f5a3213413addba13d06f1e", CPU_TYPE_ALL, "oggdec.exe", UINT_MAX},
+ {"14a99d3b1f0b166dbd68db45196da871e58e14ec", CPU_TYPE_X86, "oggenc2.i386.exe", 287602},
+ {"36f8d93ef3df6a420a73a9b5cf02dafdaf4321f0", CPU_TYPE_SSE, "oggenc2.sse2.exe", 287602},
+ {"87ad1af73e9b9db3da3db645e5c2253cb0c2a2ea", CPU_TYPE_X64, "oggenc2.x64.exe", 287602},
+ {"0d9035bb62bdf46a2785261f8be5a4a0972abd15", CPU_TYPE_ALL, "shorten.exe", 361},
+ {"50ead3b852cbfc067a402e6c2d0d0d8879663dec", CPU_TYPE_ALL, "sox.exe", 1432},
+ {"8671e16497a2d217d3707d4aa418678d02b16bcc", CPU_TYPE_ALL, "speexdec.exe", 12},
+ {"093bfdec22872ca99e40183937c88785468be989", CPU_TYPE_ALL, "tta.exe", 21},
+ {"8c842eef65248b46fa6cb9a9e5714f575672d999", CPU_TYPE_ALL, "valdec.exe", 31},
+ {"62e2805d1b2eb2a4d86a5ca6e6ea58010d05d2a7", CPU_TYPE_ALL, "wget.exe", 1114},
+ {"a7e8aad52213e339ad985829722f35eab62be182", CPU_TYPE_ALL, "wupdate.exe", UINT_MAX},
+ {"b7d14b3540d24df13119a55d97623a61412de6e3", CPU_TYPE_ALL, "wvunpack.exe", 4601},
+ {NULL, NULL, NULL, NULL}
};
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
-InitializationThread::InitializationThread(void)
+InitializationThread::InitializationThread(const lamexp_cpu_t *cpuFeatures)
{
m_bSuccess = false;
+ memset(&m_cpuFeatures, 0, sizeof(lamexp_cpu_t));
+
+ if(cpuFeatures)
+ {
+ memcpy(&m_cpuFeatures, cpuFeatures, sizeof(lamexp_cpu_t));
+ }
}
////////////////////////////////////////////////////////////
@@ -92,10 +105,15 @@ void InitializationThread::run()
m_bSuccess = false;
delay();
- QMap checksum;
- QMap version;
+ //CPU type selection
+ unsigned int cpuSupport = m_cpuFeatures.x64 ? CPU_TYPE_X64 : ((m_cpuFeatures.intel && m_cpuFeatures.sse && m_cpuFeatures.sse2) ? CPU_TYPE_SSE : CPU_TYPE_X86);
+
+ //Allocate maps
+ QMap mapChecksum;
+ QMap mapVersion;
+ QMap mapCpuType;
- //Init checksums
+ //Init properties
for(int i = 0; i < INT_MAX; i++)
{
if(!g_lamexp_tools[i].pcName && !g_lamexp_tools[i].pcHash && !g_lamexp_tools[i].uiVersion)
@@ -105,8 +123,9 @@ void InitializationThread::run()
else if(g_lamexp_tools[i].pcName && g_lamexp_tools[i].pcHash && g_lamexp_tools[i].uiVersion)
{
const QString currentTool = QString::fromLatin1(g_lamexp_tools[i].pcName);
- checksum.insert(currentTool, QString::fromLatin1(g_lamexp_tools[i].pcHash));
- version.insert(currentTool, g_lamexp_tools[i].uiVersion);
+ mapChecksum.insert(currentTool, QString::fromLatin1(g_lamexp_tools[i].pcHash));
+ mapCpuType.insert(currentTool, g_lamexp_tools[i].uiCpuType);
+ mapVersion.insert(currentTool, g_lamexp_tools[i].uiVersion);
}
else
{
@@ -121,20 +140,29 @@ void InitializationThread::run()
timer.start();
//Extract all files
- for(int i = 0; i < toolsList.count(); i++)
+ while(!toolsList.isEmpty())
{
try
{
- QString toolName = toolsList.at(i).fileName().toLower();
- qDebug("Extracting file: %s", toolName.toLatin1().constData());
- QByteArray toolHash = checksum.take(toolName).toLatin1();
- unsigned int toolVersion = version.take(toolName);
+ QFileInfo currentTool = toolsList.takeFirst();
+ QString toolName = currentTool.fileName().toLower();
+ QString toolShortName = QString("%1.%2").arg(currentTool.baseName().toLower(), currentTool.suffix().toLower());
+
+ QByteArray toolHash = mapChecksum.take(toolName).toLatin1();
+ unsigned int toolCpuType = mapCpuType.take(toolName);
+ unsigned int toolVersion = mapVersion.take(toolName);
+
if(toolHash.size() != 40)
{
throw "The required checksum is missing, take care!";
}
- LockedFile *lockedFile = new LockedFile(QString(":/tools/%1").arg(toolName), QString(lamexp_temp_folder2()).append(QString("/tool_%1").arg(toolName)), toolHash);
- lamexp_register_tool(toolName, lockedFile, toolVersion);
+
+ if(toolCpuType & cpuSupport)
+ {
+ qDebug("Extracting file: %s -> %s", toolName.toLatin1().constData(), toolShortName.toLatin1().constData());
+ LockedFile *lockedFile = new LockedFile(QString(":/tools/%1").arg(toolName), QString("%1/tool_%2").arg(lamexp_temp_folder2(), toolShortName), toolHash);
+ lamexp_register_tool(toolShortName, lockedFile, toolVersion);
+ }
}
catch(char *errorMsg)
{
@@ -143,12 +171,18 @@ void InitializationThread::run()
}
}
- if(!checksum.isEmpty())
+ //Make sure all files were extracted
+ if(!mapChecksum.isEmpty())
{
- qFatal("At least one required tool could not be found:\n%s", toolsDir.filePath(checksum.keys().first()).toLatin1().constData());
+ qFatal("At least one required tool could not be found:\n%s", toolsDir.filePath(mapChecksum.keys().first()).toLatin1().constData());
return;
}
+ //Clean-up
+ mapChecksum.clear();
+ mapVersion.clear();
+ mapCpuType.clear();
+
qDebug("All extracted.\n");
//Check delay
diff --git a/src/Thread_Initialization.h b/src/Thread_Initialization.h
index b109774e..d0242e0e 100644
--- a/src/Thread_Initialization.h
+++ b/src/Thread_Initialization.h
@@ -21,6 +21,7 @@
#pragma once
+#include "Global.h"
#include
////////////////////////////////////////////////////////////
@@ -32,7 +33,7 @@ class InitializationThread: public QThread
Q_OBJECT
public:
- InitializationThread(void);
+ InitializationThread(const lamexp_cpu_t *cpuFeatures);
void run();
bool getSuccess(void) { return !isRunning() && m_bSuccess; }
@@ -42,5 +43,6 @@ private:
void initNeroAac(void);
void initWmaDec(void);
+ lamexp_cpu_t m_cpuFeatures;
bool m_bSuccess;
};