OSDN Git Service

Happy new year 2019!
[lamexp/LameXP.git] / src / Registry_Encoder.cpp
index 6a2e122..b367830 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2019 LoRd_MuldeR <MuldeR2@GMX.de>
 //
 // 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
@@ -26,6 +26,7 @@
 #include "Model_Settings.h"
 #include "Encoder_AAC.h"
 #include "Encoder_AAC_FHG.h"
+#include "Encoder_AAC_FDK.h"
 #include "Encoder_AAC_QAAC.h"
 #include "Encoder_AC3.h"
 #include "Encoder_DCA.h"
 // Create encoder instance
 ////////////////////////////////////////////////////////////
 
-AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const SettingsModel *settings, bool *nativeResampling)
+AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const SettingsModel *settings)
 {
        int rcMode = -1;
        AbstractEncoder *encoder =  NULL;
-       *nativeResampling = false;
 
        //Create new encoder instance and apply encoder-specific settings
        switch(encoderId)
@@ -56,17 +56,12 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
        /*-------- MP3Encoder /*--------*/
        case SettingsModel::MP3Encoder:
                {
-                       MP3Encoder *mp3Encoder = new MP3Encoder();
+                       MP3Encoder *const mp3Encoder = new MP3Encoder();
                        mp3Encoder->setAlgoQuality(settings->lameAlgoQuality());
                        if(settings->bitrateManagementEnabled())
                        {
                                mp3Encoder->setBitrateLimits(settings->bitrateManagementMinRate(), settings->bitrateManagementMaxRate());
                        }
-                       if(settings->samplingRate() > 0)
-                       {
-                               mp3Encoder->setSamplingRate(SettingsModel::samplingRates[settings->samplingRate()]);
-                               *nativeResampling = true;
-                       }
                        mp3Encoder->setChannelMode(settings->lameChannelMode());
                        encoder = mp3Encoder;
                }
@@ -74,16 +69,11 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
        /*-------- VorbisEncoder /*--------*/
        case SettingsModel::VorbisEncoder:
                {
-                       VorbisEncoder *vorbisEncoder = new VorbisEncoder();
+                       VorbisEncoder *const vorbisEncoder = new VorbisEncoder();
                        if(settings->bitrateManagementEnabled())
                        {
                                vorbisEncoder->setBitrateLimits(settings->bitrateManagementMinRate(), settings->bitrateManagementMaxRate());
                        }
-                       if(settings->samplingRate() > 0)
-                       {
-                               vorbisEncoder->setSamplingRate(SettingsModel::samplingRates[settings->samplingRate()]);
-                               *nativeResampling = true;
-                       }
                        encoder = vorbisEncoder;
                }
                break;
@@ -94,21 +84,29 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
                        {
                        case SettingsModel::AAC_ENCODER_QAAC:
                                {
-                                       QAACEncoder *aacEncoder = new QAACEncoder();
+                                       QAACEncoder *const aacEncoder = new QAACEncoder();
                                        aacEncoder->setProfile(settings->aacEncProfile());
+                                       aacEncoder->setAlgoQuality(settings->lameAlgoQuality());
                                        encoder = aacEncoder;
                                }
                                break;
                        case SettingsModel::AAC_ENCODER_FHG:
                                {
-                                       FHGAACEncoder *aacEncoder = new FHGAACEncoder();
+                                       FHGAACEncoder *const aacEncoder = new FHGAACEncoder();
+                                       aacEncoder->setProfile(settings->aacEncProfile());
+                                       encoder = aacEncoder;
+                               }
+                               break;
+                       case SettingsModel::AAC_ENCODER_FDK:
+                               {
+                                       FDKAACEncoder *const aacEncoder = new FDKAACEncoder();
                                        aacEncoder->setProfile(settings->aacEncProfile());
                                        encoder = aacEncoder;
                                }
                                break;
                        case SettingsModel::AAC_ENCODER_NERO:
                                {
-                                       AACEncoder *aacEncoder = new AACEncoder();
+                                       AACEncoder *const aacEncoder = new AACEncoder();
                                        aacEncoder->setEnable2Pass(settings->neroAACEnable2Pass());
                                        aacEncoder->setProfile(settings->aacEncProfile());
                                        encoder = aacEncoder;
@@ -123,7 +121,7 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
        /*-------- AC3Encoder /*--------*/
        case SettingsModel::AC3Encoder:
                {
-                       AC3Encoder *ac3Encoder = new AC3Encoder();
+                       AC3Encoder *const ac3Encoder = new AC3Encoder();
                        ac3Encoder->setAudioCodingMode(settings->aftenAudioCodingMode());
                        ac3Encoder->setDynamicRangeCompression(settings->aftenDynamicRangeCompression());
                        ac3Encoder->setExponentSearchSize(settings->aftenExponentSearchSize());
@@ -134,14 +132,14 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
        /*-------- FLACEncoder /*--------*/
        case SettingsModel::FLACEncoder:
                {
-                       FLACEncoder *flacEncoder = new FLACEncoder();
+                       FLACEncoder *const flacEncoder = new FLACEncoder();
                        encoder = flacEncoder;
                }
                break;
        /*-------- OpusEncoder --------*/
        case SettingsModel::OpusEncoder:
                {
-                       OpusEncoder *opusEncoder = new OpusEncoder();
+                       OpusEncoder *const opusEncoder = new OpusEncoder();
                        opusEncoder->setOptimizeFor(settings->opusOptimizeFor());
                        opusEncoder->setEncodeComplexity(settings->opusComplexity());
                        opusEncoder->setFrameSize(settings->opusFramesize());
@@ -151,21 +149,21 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
        /*-------- DCAEncoder --------*/
        case SettingsModel::DCAEncoder:
                {
-                       DCAEncoder *dcaEncoder = new DCAEncoder();
+                       DCAEncoder *const dcaEncoder = new DCAEncoder();
                        encoder = dcaEncoder;
                }
                break;
        /*-------- MACEncoder --------*/
        case SettingsModel::MACEncoder:
                {
-                       MACEncoder *macEncoder = new MACEncoder();
+                       MACEncoder *const macEncoder = new MACEncoder();
                        encoder = macEncoder;
                }
                break;
        /*-------- PCMEncoder --------*/
        case SettingsModel::PCMEncoder:
                {
-                       WaveEncoder *waveEncoder = new WaveEncoder();
+                       WaveEncoder *const waveEncoder = new WaveEncoder();
                        encoder = waveEncoder;
                }
                break;
@@ -198,20 +196,21 @@ const AbstractEncoderInfo *EncoderRegistry::getEncoderInfo(const int encoderId)
 
        switch(encoderId)
        {
-               case SettingsModel::MP3Encoder:    info = MP3Encoder::getEncoderInfo();    break;
+               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::MACEncoder:    info = MACEncoder::getEncoderInfo();    break;
-               case SettingsModel::PCMEncoder:    info = WaveEncoder::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::MACEncoder:    info = MACEncoder   ::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_QAAC: info = QAACEncoder  ::getEncoderInfo(); break;
                                case SettingsModel::AAC_ENCODER_FHG:  info = FHGAACEncoder::getEncoderInfo(); break;
-                               case SettingsModel::AAC_ENCODER_NERO: info = AACEncoder::getEncoderInfo();    break;
+                               case SettingsModel::AAC_ENCODER_FDK:  info = FDKAACEncoder::getEncoderInfo(); break;
+                               case SettingsModel::AAC_ENCODER_NERO: info = AACEncoder   ::getEncoderInfo(); break;
                                default: MUTILS_THROW("Unknown AAC encoder specified!");
                        }
                        break;
@@ -471,6 +470,24 @@ void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
 }
 
 ////////////////////////////////////////////////////////////
+// Get File Extensions
+////////////////////////////////////////////////////////////
+
+QStringList EncoderRegistry::getOutputFileExtensions(void)
+{
+       QStringList list;
+       for(int encoderId = SettingsModel::MP3Encoder; encoderId < SettingsModel::ENCODER_COUNT; encoderId++)
+       {
+               if((encoderId == SettingsModel::AACEncoder) && (getAacEncoder() == SettingsModel::AAC_ENCODER_NONE))
+               {
+                       continue;
+               }
+               list << QString::fromLatin1(getEncoderInfo(encoderId)->extension());
+       }
+       return list;
+}
+
+////////////////////////////////////////////////////////////
 // Static Functions
 ////////////////////////////////////////////////////////////
 
@@ -480,6 +497,14 @@ int EncoderRegistry::getAacEncoder(void)
        {
                return SettingsModel::AAC_ENCODER_QAAC;
        }
+       else if(lamexp_tools_check("qaac64.exe") && lamexp_tools_check("libsoxr64.dll") && lamexp_tools_check("libsoxconvolver64.dll"))
+       {
+               return SettingsModel::AAC_ENCODER_QAAC;
+       }
+       else if(lamexp_tools_check("fdkaac.exe"))
+       {
+               return SettingsModel::AAC_ENCODER_FDK;
+       }
        else if(lamexp_tools_check("fhgaacenc.exe") && lamexp_tools_check("enc_fhgaac.dll") && lamexp_tools_check("nsutil.dll") && lamexp_tools_check("libmp4v2.dll"))
        {
                return SettingsModel::AAC_ENCODER_FHG;