From: lordmulder Date: Tue, 3 May 2011 23:15:05 +0000 (+0200) Subject: Initial ATSC A/52 (aka "AC-3", aka "Dolby Digital") encoding support, based on the... X-Git-Tag: Release_403~206 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=be71e483b1cfc9d316c8bac4999d397be7c5f8cf;p=lamexp%2FLameXP.git Initial ATSC A/52 (aka "AC-3", aka "Dolby Digital") encoding support, based on the Aften encoder. --- diff --git a/LameXP_VS2010.vcxproj b/LameXP_VS2010.vcxproj index f81c47fa..86d1641a 100644 --- a/LameXP_VS2010.vcxproj +++ b/LameXP_VS2010.vcxproj @@ -254,6 +254,7 @@ del "$(TargetDir)imageformats\q???d4.dll" + @@ -297,6 +298,7 @@ del "$(TargetDir)imageformats\q???d4.dll" + @@ -325,6 +327,11 @@ del "$(TargetDir)imageformats\q???d4.dll" + + "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)" + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs) + diff --git a/LameXP_VS2010.vcxproj.filters b/LameXP_VS2010.vcxproj.filters index ddd88b91..cd88958a 100644 --- a/LameXP_VS2010.vcxproj.filters +++ b/LameXP_VS2010.vcxproj.filters @@ -283,6 +283,12 @@ Source Files\Misc + + Source Files\Encoders + + + Generated Files\MOC + @@ -536,6 +542,9 @@ Header Files\Misc + + Header Files\Encoders + diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui index 4e8dbf16..2a60f758 100644 --- a/gui/MainWindow.ui +++ b/gui/MainWindow.ui @@ -30,7 +30,7 @@ - 0 + 3 false @@ -738,14 +738,14 @@ - + Wave (PCM) - + FLAC @@ -768,6 +768,13 @@ + + + + Aften A/52 + + + @@ -3164,6 +3171,7 @@ + diff --git a/res/Tools.qrc b/res/Tools.qrc index f05c440a..6c1642ce 100644 --- a/res/Tools.qrc +++ b/res/Tools.qrc @@ -1,6 +1,9 @@ + tools/aften.i386.exe + tools/aften.sse2.exe + tools/aften.x64.exe tools/alac.exe tools/elevator.exe tools/faad.exe diff --git a/res/tools/aften.i386.exe b/res/tools/aften.i386.exe new file mode 100644 index 00000000..e8e8554a Binary files /dev/null and b/res/tools/aften.i386.exe differ diff --git a/res/tools/aften.sse2.exe b/res/tools/aften.sse2.exe new file mode 100644 index 00000000..4b4a89f6 Binary files /dev/null and b/res/tools/aften.sse2.exe differ diff --git a/res/tools/aften.x64.exe b/res/tools/aften.x64.exe new file mode 100644 index 00000000..f8a76ce2 Binary files /dev/null and b/res/tools/aften.x64.exe differ diff --git a/src/Config.h b/src/Config.h index abcef615..991e571f 100644 --- a/src/Config.h +++ b/src/Config.h @@ -30,7 +30,7 @@ #define VER_LAMEXP_MINOR_LO 2 #define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_PATCH 10 -#define VER_LAMEXP_BUILD 480 +#define VER_LAMEXP_BUILD 482 /////////////////////////////////////////////////////////////////////////////// // Tools versions diff --git a/src/Dialog_About.cpp b/src/Dialog_About.cpp index 1a5460dd..4ca26f82 100644 --- a/src/Dialog_About.cpp +++ b/src/Dialog_About.cpp @@ -81,7 +81,7 @@ AboutDialog::AboutDialog(SettingsModel *settings, QWidget *parent, bool firstSta m_rotateNext(false), m_disqueDelay(_I64_MAX) { - const QString versionStr = QString().sprintf + QString versionStr = QString().sprintf ( "Version %d.%02d %s, Build %d [%s], %s, Qt v%s", lamexp_version_major(), @@ -101,8 +101,8 @@ AboutDialog::AboutDialog(SettingsModel *settings, QWidget *parent, bool firstSta QString aboutText; aboutText += QString("

%1

").arg(tr("LameXP − Audio Encoder Front-end")); - aboutText += QString("Copyright (C) 2004-%1 LoRd_MuldeR <MuldeR2@GMX.de>. Some rights reserved.
").arg(max(lamexp_version_date().year(), QDate::currentDate().year())); - aboutText += QString("%1

").arg(versionStr); + aboutText += QString("Copyright (C) 2004-%1 LoRd_MuldeR <MuldeR2@GMX.de>. Some rights reserved.
").arg(max(lamexp_version_date().year(), QDate::currentDate().year())).replace("-", "−"); + aboutText += QString("%1

").arg(versionStr).replace("-", "−"); aboutText += QString("%1
").arg(tr("Please visit %1 for news and updates!").arg(LINK(lamexp_website_url()))); if(LAMEXP_DEBUG) @@ -113,7 +113,7 @@ AboutDialog::AboutDialog(SettingsModel *settings, QWidget *parent, bool firstSta else if(lamexp_version_demo()) { int daysLeft = max(QDate::currentDate().daysTo(lamexp_version_expires()), 0); - aboutText += QString("
%1").arg(tr("Note: This demo (pre-release) version of LameXP will expire at %1. Still %2 days left.").arg(lamexp_version_expires().toString(Qt::ISODate), QString::number(daysLeft))); + aboutText += QString("
%1").arg(tr("Note: This demo (pre-release) version of LameXP will expire at %1. Still %2 days left.").arg(lamexp_version_expires().toString(Qt::ISODate), QString::number(daysLeft))).replace("-", "−"); } aboutText += "

"; diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp index 66731c0f..6047391a 100644 --- a/src/Dialog_MainWindow.cpp +++ b/src/Dialog_MainWindow.cpp @@ -184,6 +184,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S m_encoderButtonGroup->addButton(radioButtonEncoderMP3, SettingsModel::MP3Encoder); m_encoderButtonGroup->addButton(radioButtonEncoderVorbis, SettingsModel::VorbisEncoder); m_encoderButtonGroup->addButton(radioButtonEncoderAAC, SettingsModel::AACEncoder); + m_encoderButtonGroup->addButton(radioButtonEncoderAC3, SettingsModel::AC3Encoder); m_encoderButtonGroup->addButton(radioButtonEncoderFLAC, SettingsModel::FLACEncoder); m_encoderButtonGroup->addButton(radioButtonEncoderPCM, SettingsModel::PCMEncoder); m_modeButtonGroup = new QButtonGroup(this); @@ -193,6 +194,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S radioButtonEncoderMP3->setChecked(m_settings->compressionEncoder() == SettingsModel::MP3Encoder); radioButtonEncoderVorbis->setChecked(m_settings->compressionEncoder() == SettingsModel::VorbisEncoder); radioButtonEncoderAAC->setChecked(m_settings->compressionEncoder() == SettingsModel::AACEncoder); + radioButtonEncoderAC3->setChecked(m_settings->compressionEncoder() == SettingsModel::AC3Encoder); radioButtonEncoderFLAC->setChecked(m_settings->compressionEncoder() == SettingsModel::FLACEncoder); radioButtonEncoderPCM->setChecked(m_settings->compressionEncoder() == SettingsModel::PCMEncoder); radioButtonModeQuality->setChecked(m_settings->compressionRCMode() == SettingsModel::VBRMode); @@ -1041,6 +1043,7 @@ void MainWindow::encodeButtonClicked(void) case SettingsModel::MP3Encoder: case SettingsModel::VorbisEncoder: case SettingsModel::AACEncoder: + case SettingsModel::AC3Encoder: case SettingsModel::FLACEncoder: case SettingsModel::PCMEncoder: break; diff --git a/src/Dialog_Processing.cpp b/src/Dialog_Processing.cpp index 91b61fe3..95ba8e60 100644 --- a/src/Dialog_Processing.cpp +++ b/src/Dialog_Processing.cpp @@ -32,6 +32,7 @@ #include "Encoder_MP3.h" #include "Encoder_Vorbis.h" #include "Encoder_AAC.h" +#include "Encoder_AC3.h" #include "Encoder_FLAC.h" #include "Encoder_Wave.h" #include "Filter_Normalize.h" @@ -600,6 +601,15 @@ void ProcessingDialog::startNextJob(void) encoder = aacEncoder; } break; + case SettingsModel::AC3Encoder: + { + AC3Encoder *ac3Encoder = new AC3Encoder(); + ac3Encoder->setBitrate(m_settings->compressionBitrate()); + ac3Encoder->setRCMode(m_settings->compressionRCMode()); + ac3Encoder->setCustomParams(m_settings->customParametersNeroAAC()); + encoder = ac3Encoder; + } + break; case SettingsModel::FLACEncoder: { FLACEncoder *flacEncoder = new FLACEncoder(); diff --git a/src/Encoder_AC3.cpp b/src/Encoder_AC3.cpp new file mode 100644 index 00000000..1f3cee22 --- /dev/null +++ b/src/Encoder_AC3.cpp @@ -0,0 +1,147 @@ +/////////////////////////////////////////////////////////////////////////////// +// LameXP - Audio Encoder Front-End +// Copyright (C) 2004-2011 LoRd_MuldeR +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// http://www.gnu.org/licenses/gpl-2.0.txt +/////////////////////////////////////////////////////////////////////////////// + +#include "Encoder_AC3.h" + +#include "Global.h" +#include "Model_Settings.h" + +#include +#include + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +AC3Encoder::AC3Encoder(void) +: + m_binary(lamexp_lookup_tool("aften.exe")) +{ + if(m_binary.isEmpty()) + { + throw "Error initializing FLAC encoder. Tool 'aften.exe' is not registred!"; + } +} + +AC3Encoder::~AC3Encoder(void) +{ +} + +bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag) +{ + QProcess process; + QStringList args; + + //args << QString("-%1").arg(QString::number(max(0, min(8, m_configBitrate)))); + + //if(!metaInfo.fileName().isEmpty()) args << "-T" << QString("title=%1").arg(metaInfo.fileName()); + //if(!metaInfo.fileArtist().isEmpty()) args << "-T" << QString("artist=%1").arg(metaInfo.fileArtist()); + //if(!metaInfo.fileAlbum().isEmpty()) args << "-T" << QString("album=%1").arg(metaInfo.fileAlbum()); + //if(!metaInfo.fileGenre().isEmpty()) args << "-T" << QString("genre=%1").arg(metaInfo.fileGenre()); + //if(!metaInfo.fileComment().isEmpty()) args << "-T" << QString("comment=%1").arg(metaInfo.fileComment()); + //if(metaInfo.fileYear()) args << "-T" << QString("date=%1").arg(QString::number(metaInfo.fileYear())); + //if(metaInfo.filePosition()) args << "-T" << QString("track=%1").arg(QString::number(metaInfo.filePosition())); + //if(!metaInfo.fileCover().isEmpty()) args << QString("--picture=%1").arg(metaInfo.fileCover()); + + //if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); + + args << QDir::toNativeSeparators(sourceFile); + args << QDir::toNativeSeparators(outputFile); + + if(!startProcess(process, m_binary, args)) + { + return false; + } + + bool bTimeout = false; + bool bAborted = false; + + QRegExp regExp("progress:(\\s+)(\\d+)%(\\s+)\\|"); + + while(process.state() != QProcess::NotRunning) + { + if(*abortFlag) + { + process.kill(); + bAborted = true; + emit messageLogged("\nABORTED BY USER !!!"); + break; + } + process.waitForReadyRead(); + if(!process.bytesAvailable() && process.state() == QProcess::Running) + { + process.kill(); + qWarning("Aften process timed out <-- killing!"); + emit messageLogged("\nPROCESS TIMEOUT !!!"); + bTimeout = true; + break; + } + while(process.bytesAvailable() > 0) + { + QByteArray line = process.readLine(); + QString text = QString::fromUtf8(line.constData()).simplified(); + if(regExp.lastIndexIn(text) >= 0) + { + bool ok = false; + int progress = regExp.cap(2).toInt(&ok); + if(ok) emit statusUpdated(progress); + } + else if(!text.isEmpty()) + { + emit messageLogged(text); + } + } + } + + process.waitForFinished(); + if(process.state() != QProcess::NotRunning) + { + process.kill(); + process.waitForFinished(-1); + } + + emit statusUpdated(100); + emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); + + if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit) + { + return false; + } + + return true; +} + +QString AC3Encoder::extension(void) +{ + return "ac3"; +} + +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(formatType.compare("PCM", Qt::CaseInsensitive) == 0) + { + return true; + } + } + + return false; +} diff --git a/src/Encoder_AC3.h b/src/Encoder_AC3.h new file mode 100644 index 00000000..47503fa1 --- /dev/null +++ b/src/Encoder_AC3.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////////// +// LameXP - Audio Encoder Front-End +// Copyright (C) 2004-2011 LoRd_MuldeR +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// http://www.gnu.org/licenses/gpl-2.0.txt +/////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "Encoder_Abstract.h" + +#include + +class AC3Encoder : public AbstractEncoder +{ + Q_OBJECT + +public: + AC3Encoder(void); + ~AC3Encoder(void); + + virtual bool encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag); + virtual bool isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion); + virtual QString extension(void); + +private: + const QString m_binary; +}; diff --git a/src/Model_Settings.h b/src/Model_Settings.h index bea3e5ed..a4fb0c8b 100644 --- a/src/Model_Settings.h +++ b/src/Model_Settings.h @@ -60,8 +60,9 @@ public: MP3Encoder = 0, VorbisEncoder = 1, AACEncoder = 2, - FLACEncoder = 3, - PCMEncoder = 4 + AC3Encoder = 3, + FLACEncoder = 4, + PCMEncoder = 5 }; enum RCMode { diff --git a/src/Thread_Initialization.cpp b/src/Thread_Initialization.cpp index b1d634ad..78ad59f1 100644 --- a/src/Thread_Initialization.cpp +++ b/src/Thread_Initialization.cpp @@ -52,6 +52,9 @@ static const struct } g_lamexp_tools[] = { + {"0a6252606c1ceda7b8973e5935ef72d60b8fd64d", CPU_TYPE_X86, "aften.i386.exe", 8}, + {"22253052acba92a0088bbf0aa82a8c505c07b854", CPU_TYPE_SSE, "aften.sse2.exe", 8}, + {"2996a48b01b65a2c1806482654beeea7ffcf1f80", CPU_TYPE_X64, "aften.x64.exe", 8}, {"3b41f85dde8d4a5a0f4cd5f461099d0db24610ba", CPU_TYPE_ALL, "alac.exe", UINT_MAX}, {"fb74ac8b73ad8cba2c3b4e6e61f23401d630dc22", CPU_TYPE_ALL, "elevator.exe", UINT_MAX}, {"80e372d8b20be24102c18284286fcdf5fa14bd86", CPU_TYPE_ALL, "faad.exe", 27},