Implemented AbstractEncoderInfo for some more encoders. Remaining encoders not yet working.

This commit is contained in:
LoRd_MuldeR 2013-10-02 19:17:33 +02:00
parent 6c9e3c562f
commit d76c4a1702
14 changed files with 344 additions and 110 deletions

View File

@ -34,7 +34,7 @@
#define VER_LAMEXP_MINOR_LO 9
#define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 1
#define VER_LAMEXP_BUILD 1343
#define VER_LAMEXP_BUILD 1345
#define VER_LAMEXP_CONFG 1338
///////////////////////////////////////////////////////////////////////////////

View File

@ -180,7 +180,6 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_metaData(metaInfo),
m_settings(settingsModel),
m_fileSystemModel(NULL),
m_aacEncoder(SettingsModel::getAacEncoder()),
m_accepted(false),
m_firstTimeShown(true),
m_outputFolderViewCentering(false),
@ -351,7 +350,8 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_encoderButtonGroup->addButton(ui->radioButtonEncoderDCA, SettingsModel::DCAEncoder);
m_encoderButtonGroup->addButton(ui->radioButtonEncoderPCM, SettingsModel::PCMEncoder);
ui->radioButtonEncoderAAC->setEnabled(m_aacEncoder > SettingsModel::AAC_ENCODER_NONE);
const int aacEncoder = EncoderRegistry::getAacEncoder();
ui->radioButtonEncoderAAC->setEnabled(aacEncoder > SettingsModel::AAC_ENCODER_NONE);
m_modeButtonGroup = new QButtonGroup(this);
m_modeButtonGroup->addButton(ui->radioButtonModeQuality, SettingsModel::VBRMode);
@ -412,7 +412,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
SET_CHECKBOX_STATE(ui->checkBoxRenameOutput, m_settings->renameOutputFilesEnabled());
SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmix());
SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResample());
ui->checkBoxNeroAAC2PassMode->setEnabled(m_aacEncoder == SettingsModel::AAC_ENCODER_NERO);
ui->checkBoxNeroAAC2PassMode->setEnabled(aacEncoder == SettingsModel::AAC_ENCODER_NERO);
ui->lineEditCustomParamLAME->setText(m_settings->customParametersLAME());
ui->lineEditCustomParamOggEnc->setText(m_settings->customParametersOggEnc());
@ -955,6 +955,8 @@ void MainWindow::changeEvent(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{
qWarning("\nMainWindow::changeEvent()\n");
int comboBoxIndex[8];
//Backup combobox indices, as retranslateUi() resets
@ -1357,7 +1359,8 @@ void MainWindow::windowShown(void)
}
//Check for AAC support
if(m_aacEncoder == SettingsModel::AAC_ENCODER_NERO)
const int aacEncoder = EncoderRegistry::getAacEncoder();
if(aacEncoder == SettingsModel::AAC_ENCODER_NERO)
{
if(m_settings->neroAacNotificationsEnabled())
{
@ -1375,7 +1378,7 @@ void MainWindow::windowShown(void)
}
else
{
if(m_settings->neroAacNotificationsEnabled() && (m_aacEncoder <= SettingsModel::AAC_ENCODER_NONE))
if(m_settings->neroAacNotificationsEnabled() && (aacEncoder <= SettingsModel::AAC_ENCODER_NONE))
{
QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath();
if(appPath.isEmpty()) appPath = QCoreApplication::applicationDirPath();
@ -3289,18 +3292,25 @@ void MainWindow::playlistEnabledChanged(void)
*/
void MainWindow::updateEncoder(int id)
{
qWarning("\nupdateEncoder(%d)", id);
m_settings->compressionEncoder(id);
const AbstractEncoderInfo *info = EncoderRegistry::getEncoderInfo(id);
qWarning("info->isModeSupported(SettingsModel::VBRMode) = %s", info->isModeSupported(SettingsModel::VBRMode) ? "YES" : "NO");
qWarning("info->isModeSupported(SettingsModel::ABRMode) = %s", info->isModeSupported(SettingsModel::ABRMode) ? "YES" : "NO");
qWarning("info->isModeSupported(SettingsModel::CBRMode) = %s", info->isModeSupported(SettingsModel::CBRMode) ? "YES" : "NO");
//Update UI controls
ui->radioButtonModeQuality->setEnabled(info->isModeSupported(SettingsModel::VBRMode));
ui->radioButtonModeAverageBitrate->setEnabled(info->isModeSupported(SettingsModel::ABRMode));
ui->radioButtonConstBitrate->setEnabled(info->isModeSupported(SettingsModel::CBRMode));
//Initialize checkbox state
if(ui->radioButtonConstBitrate->isEnabled()) ui->radioButtonConstBitrate->setChecked(true);
if(ui->radioButtonModeAverageBitrate->isEnabled()) ui->radioButtonModeAverageBitrate->setChecked(true);
if(ui->radioButtonModeQuality->isEnabled()) ui->radioButtonModeQuality->setChecked(true);
else if(ui->radioButtonModeAverageBitrate->isEnabled()) ui->radioButtonModeAverageBitrate->setChecked(true);
else if(ui->radioButtonConstBitrate->isEnabled()) ui->radioButtonConstBitrate->setChecked(true);
else throw "It appears that the encoder does not support *any* RC mode!";
//Apply current RC mode
const int currentRCMode = EncoderRegistry::loadEncoderMode(m_settings, id);
@ -3884,7 +3894,7 @@ void MainWindow::customParamsHelpRequested(QWidget *obj, QEvent *event)
else if(obj == ui->helpCustomParamOggEnc) showCustomParamsHelpScreen("oggenc2.exe", "--help");
else if(obj == ui->helpCustomParamNeroAAC)
{
switch(m_aacEncoder)
switch(EncoderRegistry::getAacEncoder())
{
case SettingsModel::AAC_ENCODER_QAAC: showCustomParamsHelpScreen("qaac.exe", "--help"); break;
case SettingsModel::AAC_ENCODER_FHG : showCustomParamsHelpScreen("fhgaacenc.exe", ""); break;

View File

@ -228,6 +228,4 @@ private:
CustomEventFilter *m_evenFilterOutputFolderMouse;
CustomEventFilter *m_evenFilterOutputFolderView;
CustomEventFilter *m_evenFilterCompressionTab;
const int m_aacEncoder;
};

View File

@ -32,9 +32,11 @@ static const int g_lameAgorithmQualityLUT[5] = {9, 7, 3, 0, INT_MAX};
static const int g_mp3BitrateLUT[15] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1};
static const int g_lameVBRQualityLUT[11] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, INT_MAX};
///////////////////////////////////////////////////////////////////////////////
// Encoder Info
///////////////////////////////////////////////////////////////////////////////
class : public AbstractEncoderInfo
class MP3EncoderInfo : public AbstractEncoderInfo
{
virtual bool isModeSupported(int mode) const
{
@ -43,8 +45,8 @@ class : public AbstractEncoderInfo
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return true;
break;
return true;
break;
default:
throw "Bad RC mode specified!";
}
@ -71,11 +73,11 @@ class : public AbstractEncoderInfo
switch(mode)
{
case SettingsModel::VBRMode:
return g_lameVBRQualityLUT[index];
return g_lameVBRQualityLUT[qBound(0, index, 9)];
break;
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return g_mp3BitrateLUT[index];
return g_mp3BitrateLUT[qBound(0, index, 13)];
break;
default:
throw "Bad RC mode specified!";
@ -105,9 +107,12 @@ class : public AbstractEncoderInfo
static const char* s_description = "LAME MP3 Encoder";
return s_description;
}
}
g_mp3EncoderInfo;
};
static const MP3EncoderInfo g_mp3EncoderInfo;
///////////////////////////////////////////////////////////////////////////////
// Encoder implementation
///////////////////////////////////////////////////////////////////////////////
MP3Encoder::MP3Encoder(void)

View File

@ -28,6 +28,83 @@
#include <QDir>
#include <QUUid>
///////////////////////////////////////////////////////////////////////////////
// Encoder Info
///////////////////////////////////////////////////////////////////////////////
class OpusEncoderInfo : public AbstractEncoderInfo
{
virtual bool isModeSupported(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return true;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueCount(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return 32;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueAt(int mode, int index) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return qBound(8, (index + 1) * 8, 256);
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueType(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
return TYPE_APPROX_BITRATE;
break;
case SettingsModel::CBRMode:
return TYPE_BITRATE;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual const char *description(void) const
{
static const char* s_description = "Opus-Tools OpusEnc (libopus)";
return s_description;
}
};
static const OpusEncoderInfo g_opusEncoderInfo;
///////////////////////////////////////////////////////////////////////////////
// Encoder implementation
///////////////////////////////////////////////////////////////////////////////
OpusEncoder::OpusEncoder(void)
:
m_binary(lamexp_lookup_tool("opusenc.exe"))
@ -69,16 +146,6 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel &metaIn
break;
}
//switch(m_configOptimizeFor)
//{
//case 0:
// args << "--music";
// break;
//case 1:
// args << "--speech";
// break;
//}
args << "--comp" << QString::number(m_configEncodeComplexity);
switch(m_configFrameSize)
@ -103,7 +170,7 @@ bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel &metaIn
break;
}
args << QString("--bitrate") << QString::number(qMax(0, qMin(500, m_configBitrate * 8)));
args << QString("--bitrate") << QString::number(qBound(8, (m_configBitrate + 1) * 8, 256));
if(!metaInfo.fileName().isEmpty()) args << "--title" << cleanTag(metaInfo.fileName());
if(!metaInfo.fileArtist().isEmpty()) args << "--artist" << cleanTag(metaInfo.fileArtist());
@ -234,3 +301,8 @@ const bool OpusEncoder::needsTimingInfo(void)
{
return true;
}
const AbstractEncoderInfo *OpusEncoder::getEncoderInfo(void)
{
return &g_opusEncoderInfo;
}

View File

@ -45,6 +45,9 @@ public:
virtual void setEncodeComplexity(int complexity);
virtual void setFrameSize(int frameSize);
//Encoder info
static const AbstractEncoderInfo *getEncoderInfo(void);
private:
const QString m_binary;

View File

@ -27,6 +27,91 @@
#include <QProcess>
#include <QDir>
///////////////////////////////////////////////////////////////////////////////
// Encoder Info
///////////////////////////////////////////////////////////////////////////////
class VorbisEncoderInfo : public AbstractEncoderInfo
{
virtual bool isModeSupported(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
return true;
break;
case SettingsModel::CBRMode:
return false;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueCount(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
return 12;
break;
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return 60;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueAt(int mode, int index) const
{
switch(mode)
{
case SettingsModel::VBRMode:
return qBound(-2, index - 2, 10);
break;
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return qBound(32, (index + 4) * 8, 500);
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueType(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
return TYPE_QUALITY_LEVEL;
break;
case SettingsModel::ABRMode:
return TYPE_APPROX_BITRATE;
break;
case SettingsModel::CBRMode:
return TYPE_BITRATE;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual const char *description(void) const
{
static const char* s_description = "OggEnc2 Vorbis Encoder (aoTuV)";
return s_description;
}
};
static const VorbisEncoderInfo g_vorbisEncoderInfo;
///////////////////////////////////////////////////////////////////////////////
// Encoder implementation
///////////////////////////////////////////////////////////////////////////////
VorbisEncoder::VorbisEncoder(void)
:
m_binary(lamexp_lookup_tool("oggenc2.exe"))
@ -54,10 +139,10 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel &meta
switch(m_configRCMode)
{
case SettingsModel::VBRMode:
args << "-q" << QString::number(qMax(-2, qMin(10, m_configBitrate)));
args << "-q" << QString::number(qBound(-2, m_configBitrate - 2, 10));
break;
case SettingsModel::ABRMode:
args << "-b" << QString::number(qMax(32, qMin(500, (m_configBitrate * 8))));
args << "-b" << QString::number(qBound(32, (m_configBitrate + 4) * 8, 500));
break;
default:
throw "Bad rate-control mode!";
@ -66,8 +151,8 @@ bool VorbisEncoder::encode(const QString &sourceFile, const AudioFileModel &meta
if((m_configBitrateMaximum > 0) && (m_configBitrateMinimum > 0) && (m_configBitrateMinimum <= m_configBitrateMaximum))
{
args << "--min-bitrate" << QString::number(qMin(qMax(m_configBitrateMinimum, 32), 500));
args << "--max-bitrate" << QString::number(qMin(qMax(m_configBitrateMaximum, 32), 500));
args << "--min-bitrate" << QString::number(qBound(32, m_configBitrateMinimum, 500));
args << "--max-bitrate" << QString::number(qBound(32, m_configBitrateMaximum, 500));
}
if(m_configSamplingRate > 0)
@ -198,3 +283,8 @@ void VorbisEncoder::setSamplingRate(int value)
{
m_configSamplingRate = value;
}
const AbstractEncoderInfo *VorbisEncoder::getEncoderInfo(void)
{
return &g_vorbisEncoderInfo;
}

View File

@ -40,6 +40,9 @@ public:
virtual void setSamplingRate(int value);
virtual void setBitrate(int bitrate);
//Encoder info
static const AbstractEncoderInfo *getEncoderInfo(void);
private:
const QString m_binary;
int m_configBitrateMaximum;

View File

@ -29,6 +29,85 @@
#define FIX_SEPARATORS(STR) for(int i = 0; STR[i]; i++) { if(STR[i] == L'/') STR[i] = L'\\'; }
///////////////////////////////////////////////////////////////////////////////
// Encoder Info
///////////////////////////////////////////////////////////////////////////////
class WaveEncoderInfo : public AbstractEncoderInfo
{
public:
virtual bool isModeSupported(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
return false;
break;
case SettingsModel::CBRMode:
return true;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueCount(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return 0;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueAt(int mode, int index) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return -1;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual int valueType(int mode) const
{
switch(mode)
{
case SettingsModel::VBRMode:
case SettingsModel::ABRMode:
case SettingsModel::CBRMode:
return TYPE_UNCOMPRESSED;
break;
default:
throw "Bad RC mode specified!";
}
}
virtual const char *description(void) const
{
static const char* s_description = "Wave Audio (PCM)";
return s_description;
}
};
static const WaveEncoderInfo g_waveEncoderInfo;
///////////////////////////////////////////////////////////////////////////////
// Encoder implementation
///////////////////////////////////////////////////////////////////////////////
WaveEncoder::WaveEncoder(void)
{
}
@ -103,3 +182,8 @@ bool WaveEncoder::isFormatSupported(const QString &containerType, const QString
}
return false;
}
const AbstractEncoderInfo *WaveEncoder::getEncoderInfo(void)
{
return &g_waveEncoderInfo;
}

View File

@ -36,4 +36,7 @@ public:
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);
//Encoder info
static const AbstractEncoderInfo *getEncoderInfo(void);
};

View File

@ -424,30 +424,6 @@ void SettingsModel::syncNow(void)
m_configCache->flushValues();
}
////////////////////////////////////////////////////////////
// Static Functions
////////////////////////////////////////////////////////////
int SettingsModel::getAacEncoder(void)
{
if(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll"))
{
return AAC_ENCODER_QAAC;
}
else if(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll") && lamexp_check_tool("nsutil.dll") && lamexp_check_tool("libmp4v2.dll"))
{
return AAC_ENCODER_FHG;
}
else if(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe"))
{
return AAC_ENCODER_NERO;
}
else
{
return AAC_ENCODER_NONE;
}
}
////////////////////////////////////////////////////////////
// Private Functions
////////////////////////////////////////////////////////////

View File

@ -180,9 +180,6 @@ public:
//Misc
void validate(void);
void syncNow(void);
//Static
static int getAacEncoder(void);
private:
SettingsCache *m_configCache;

View File

@ -21,6 +21,7 @@
#include "Registry_Encoder.h"
#include "Global.h"
#include "Model_Settings.h"
#include "Encoder_AAC.h"
#include "Encoder_AAC_FHG.h"
@ -97,7 +98,7 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
/*-------- AACEncoder /*--------*/
case SettingsModel::AACEncoder:
{
switch(SettingsModel::getAacEncoder())
switch(getAacEncoder())
{
case SettingsModel::AAC_ENCODER_QAAC:
{
@ -215,57 +216,23 @@ const AbstractEncoderInfo *EncoderRegistry::getEncoderInfo(const int encoderId)
switch(encoderId)
{
/*-------- MP3Encoder /*--------*/
case SettingsModel::MP3Encoder:
info = MP3Encoder::getEncoderInfo();
break;
/*-------- VorbisEncoder /*--------*/
case SettingsModel::VorbisEncoder:
info = VorbisEncoder::getEncoderInfo();
break;
/*-------- AACEncoder /*--------*/
case SettingsModel::AACEncoder:
{
switch(SettingsModel::getAacEncoder())
case SettingsModel::MP3Encoder: info = MP3Encoder::getEncoderInfo(); break;
case SettingsModel::VorbisEncoder: info = VorbisEncoder::getEncoderInfo(); break;
case SettingsModel::AC3Encoder: info = AC3Encoder::getEncoderInfo(); break;
case SettingsModel::FLACEncoder: info = FLACEncoder::getEncoderInfo(); break;
case SettingsModel::OpusEncoder: info = OpusEncoder::getEncoderInfo(); break;
case SettingsModel::DCAEncoder: info = DCAEncoder::getEncoderInfo(); break;
case SettingsModel::PCMEncoder: info = WaveEncoder::getEncoderInfo(); break;
case SettingsModel::AACEncoder:
switch(getAacEncoder())
{
case SettingsModel::AAC_ENCODER_QAAC:
info = QAACEncoder::getEncoderInfo();
break;
case SettingsModel::AAC_ENCODER_FHG:
info = FHGAACEncoder::getEncoderInfo();
break;
case SettingsModel::AAC_ENCODER_NERO:
info = AACEncoder::getEncoderInfo();
break;
default:
throw "Unknown AAC encoder specified!";
break;
case SettingsModel::AAC_ENCODER_QAAC: info = QAACEncoder::getEncoderInfo(); break;
case SettingsModel::AAC_ENCODER_FHG: info = FHGAACEncoder::getEncoderInfo(); break;
case SettingsModel::AAC_ENCODER_NERO: info = AACEncoder::getEncoderInfo(); break;
default: throw "Unknown AAC encoder specified!";
}
}
break;
/*-------- AC3Encoder /*--------*/
case SettingsModel::AC3Encoder:
info = AC3Encoder::getEncoderInfo();
break;
/*-------- FLACEncoder /*--------*/
case SettingsModel::FLACEncoder:
info = FLACEncoder::getEncoderInfo();
break;
/*-------- OpusEncoder --------*/
case SettingsModel::OpusEncoder:
info = OpusEncoder::getEncoderInfo();
break;
/*-------- DCAEncoder --------*/
case SettingsModel::DCAEncoder:
info = DCAEncoder::getEncoderInfo();
break;
/*-------- PCMEncoder --------*/
case SettingsModel::PCMEncoder:
info = WaveEncoder::getEncoderInfo();
break;
/*-------- default --------*/
default:
throw "Unsupported encoder!";
break;
default: throw "Unsupported encoder!";
}
//Sanity checking
@ -416,3 +383,27 @@ int EncoderRegistry::loadEncoderValue(const SettingsModel *settings, const int e
return value;
}
////////////////////////////////////////////////////////////
// Static Functions
////////////////////////////////////////////////////////////
int EncoderRegistry::getAacEncoder(void)
{
if(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll"))
{
return SettingsModel::AAC_ENCODER_QAAC;
}
else if(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll") && lamexp_check_tool("nsutil.dll") && lamexp_check_tool("libmp4v2.dll"))
{
return SettingsModel::AAC_ENCODER_FHG;
}
else if(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe"))
{
return SettingsModel::AAC_ENCODER_NERO;
}
else
{
return SettingsModel::AAC_ENCODER_NONE;
}
}

View File

@ -40,4 +40,6 @@ public:
static void saveEncoderValue(SettingsModel *settings, const int encoderId, const int rcMode, const int value);
static int loadEncoderValue(const SettingsModel *settings, const int encoderId, const int rcMode);
static int getAacEncoder(void);
};