OSDN Git Service

Set creation/modified time of the encoded file the same value as the original file...
[lamexp/LameXP.git] / src / Registry_Encoder.cpp
index b938281..00f9371 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2015 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"
@@ -33,6 +34,7 @@
 #include "Encoder_MP3.h"
 #include "Encoder_Vorbis.h"
 #include "Encoder_Opus.h"
+#include "Encoder_MAC.h"
 #include "Encoder_Wave.h"
 
 #define IS_VBR(RC_MODE) ((RC_MODE) == SettingsModel::VBRMode)
@@ -105,6 +107,13 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
                                        encoder = aacEncoder;
                                }
                                break;
+                       case SettingsModel::AAC_ENCODER_FDK:
+                               {
+                                       FDKAACEncoder *aacEncoder = new FDKAACEncoder();
+                                       aacEncoder->setProfile(settings->aacEncProfile());
+                                       encoder = aacEncoder;
+                               }
+                               break;
                        case SettingsModel::AAC_ENCODER_NERO:
                                {
                                        AACEncoder *aacEncoder = new AACEncoder();
@@ -114,7 +123,7 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
                                }
                                break;
                        default:
-                               THROW("makeEncoder(): Unknown AAC encoder specified!");
+                               MUTILS_THROW("makeEncoder(): Unknown AAC encoder specified!");
                                break;
                        }
                }
@@ -154,6 +163,13 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
                        encoder = dcaEncoder;
                }
                break;
+       /*-------- MACEncoder --------*/
+       case SettingsModel::MACEncoder:
+               {
+                       MACEncoder *macEncoder = new MACEncoder();
+                       encoder = macEncoder;
+               }
+               break;
        /*-------- PCMEncoder --------*/
        case SettingsModel::PCMEncoder:
                {
@@ -163,13 +179,13 @@ AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const Sett
                break;
        /*-------- default --------*/
        default:
-               THROW("Unsupported encoder!");
+               MUTILS_THROW("Unsupported encoder!");
        }
 
        //Sanity checking
        if(!encoder)
        {
-               THROW("No encoder instance has been assigend!");
+               MUTILS_THROW("No encoder instance has been assigend!");
        }
 
        //Apply common settings
@@ -190,29 +206,31 @@ 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::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;
-                               default: THROW("Unknown AAC encoder specified!");
+                               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;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 
        //Sanity checking
        if(!info)
        {
-               THROW("No encoder instance has been assigend!");
+               MUTILS_THROW("No encoder instance has been assigend!");
        }
 
        return info;
@@ -239,7 +257,7 @@ void EncoderRegistry::saveEncoderMode(SettingsModel *settings, const int encoder
        //Sanity checking
        if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
        {
-               THROW("Unknown rate-control mode!");
+               MUTILS_THROW("Unknown rate-control mode!");
        }
 
        //Store the encoder bitrate/quality value
@@ -252,8 +270,9 @@ void EncoderRegistry::saveEncoderMode(SettingsModel *settings, const int encoder
                case SettingsModel::FLACEncoder:   STORE_MODE(FLAC,    rcMode); break;
                case SettingsModel::OpusEncoder:   STORE_MODE(OpusEnc, rcMode); break;
                case SettingsModel::DCAEncoder:    STORE_MODE(DcaEnc,  rcMode); break;
+               case SettingsModel::MACEncoder:    STORE_MODE(MacEnc,  rcMode); break;
                case SettingsModel::PCMEncoder:    STORE_MODE(Wave,    rcMode); break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 }
 
@@ -271,8 +290,9 @@ int EncoderRegistry::loadEncoderMode(const SettingsModel *settings, const int en
                case SettingsModel::FLACEncoder:   LOAD_MODE(rcMode, FLAC);    break;
                case SettingsModel::OpusEncoder:   LOAD_MODE(rcMode, OpusEnc); break;
                case SettingsModel::DCAEncoder:    LOAD_MODE(rcMode, DcaEnc);  break;
+               case SettingsModel::MACEncoder:    LOAD_MODE(rcMode, MacEnc);  break;
                case SettingsModel::PCMEncoder:    LOAD_MODE(rcMode, Wave);    break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 
        return rcMode;
@@ -303,7 +323,7 @@ void EncoderRegistry::saveEncoderValue(SettingsModel *settings, const int encode
        //Sanity checking
        if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
        {
-               THROW("Unknown rate-control mode!");
+               MUTILS_THROW("Unknown rate-control mode!");
        }
 
        //Store the encoder bitrate/quality value
@@ -316,8 +336,9 @@ void EncoderRegistry::saveEncoderValue(SettingsModel *settings, const int encode
                case SettingsModel::FLACEncoder:   STORE_VALUE(FLAC,    rcMode, value); break;
                case SettingsModel::OpusEncoder:   STORE_VALUE(OpusEnc, rcMode, value); break;
                case SettingsModel::DCAEncoder:    STORE_VALUE(DcaEnc,  rcMode, value); break;
+               case SettingsModel::MACEncoder:    STORE_VALUE(MacEnc,  rcMode, value); break;
                case SettingsModel::PCMEncoder:    STORE_VALUE(Wave,    rcMode, value); break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 }
 
@@ -328,7 +349,7 @@ int EncoderRegistry::loadEncoderValue(const SettingsModel *settings, const int e
        //Sanity checking
        if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
        {
-               THROW("Unknown rate-control mode!");
+               MUTILS_THROW("Unknown rate-control mode!");
        }
 
        //Load the encoder bitrate/quality value
@@ -341,8 +362,9 @@ int EncoderRegistry::loadEncoderValue(const SettingsModel *settings, const int e
                case SettingsModel::FLACEncoder:   LOAD_VALUE(value, FLAC,    rcMode); break;
                case SettingsModel::OpusEncoder:   LOAD_VALUE(value, OpusEnc, rcMode); break;
                case SettingsModel::DCAEncoder:    LOAD_VALUE(value, DcaEnc,  rcMode); break;
+               case SettingsModel::MACEncoder:    LOAD_VALUE(value, MacEnc,  rcMode); break;
                case SettingsModel::PCMEncoder:    LOAD_VALUE(value, Wave,    rcMode); break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 
        return value;
@@ -364,7 +386,7 @@ while(0)
 } \
 while(0)
 
-void EncoderRegistry::saveEncoderCustomParams(SettingsModel *settings, const int encoderId, const QString params)
+void EncoderRegistry::saveEncoderCustomParams(SettingsModel *settings, const int encoderId, const QString &params)
 {
        //Store the encoder bitrate/quality value
        switch(encoderId)
@@ -376,8 +398,9 @@ void EncoderRegistry::saveEncoderCustomParams(SettingsModel *settings, const int
                case SettingsModel::FLACEncoder:   STORE_PARAMS(FLAC,    params.trimmed()); break;
                case SettingsModel::OpusEncoder:   STORE_PARAMS(OpusEnc, params.trimmed()); break;
                case SettingsModel::DCAEncoder:    STORE_PARAMS(DcaEnc,  params.trimmed()); break;
+               case SettingsModel::MACEncoder:    STORE_PARAMS(MacEnc,  params.trimmed()); break;
                case SettingsModel::PCMEncoder:    STORE_PARAMS(Wave,    params.trimmed()); break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 }
 
@@ -395,8 +418,9 @@ QString EncoderRegistry::loadEncoderCustomParams(const SettingsModel *settings,
                case SettingsModel::FLACEncoder:   LOAD_PARAMS(params, FLAC);    break;
                case SettingsModel::OpusEncoder:   LOAD_PARAMS(params, OpusEnc); break;
                case SettingsModel::DCAEncoder:    LOAD_PARAMS(params, DcaEnc);  break;
+               case SettingsModel::MACEncoder:    LOAD_PARAMS(params, MacEnc);  break;
                case SettingsModel::PCMEncoder:    LOAD_PARAMS(params, Wave);    break;
-               default: THROW("Unsupported encoder!");
+               default: MUTILS_THROW("Unsupported encoder!");
        }
 
        return params;
@@ -419,6 +443,7 @@ void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
        RESET_SETTING(settings, compressionAbrBitrateDcaEnc);
        RESET_SETTING(settings, compressionAbrBitrateFLAC);
        RESET_SETTING(settings, compressionAbrBitrateLAME);
+       RESET_SETTING(settings, compressionAbrBitrateMacEnc);
        RESET_SETTING(settings, compressionAbrBitrateOggEnc);
        RESET_SETTING(settings, compressionAbrBitrateOpusEnc);
        RESET_SETTING(settings, compressionAbrBitrateWave);
@@ -428,6 +453,7 @@ void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
        RESET_SETTING(settings, compressionCbrBitrateDcaEnc);
        RESET_SETTING(settings, compressionCbrBitrateFLAC);
        RESET_SETTING(settings, compressionCbrBitrateLAME);
+       RESET_SETTING(settings, compressionCbrBitrateMacEnc);
        RESET_SETTING(settings, compressionCbrBitrateOggEnc);
        RESET_SETTING(settings, compressionCbrBitrateOpusEnc);
        RESET_SETTING(settings, compressionCbrBitrateWave);
@@ -437,6 +463,7 @@ void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
        RESET_SETTING(settings, compressionRCModeDcaEnc);
        RESET_SETTING(settings, compressionRCModeFLAC);
        RESET_SETTING(settings, compressionRCModeLAME);
+       RESET_SETTING(settings, compressionRCModeMacEnc);
        RESET_SETTING(settings, compressionRCModeOggEnc);
        RESET_SETTING(settings, compressionRCModeOpusEnc);
        RESET_SETTING(settings, compressionRCModeWave);
@@ -446,26 +473,53 @@ void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
        RESET_SETTING(settings, compressionVbrQualityDcaEnc);
        RESET_SETTING(settings, compressionVbrQualityFLAC);
        RESET_SETTING(settings, compressionVbrQualityLAME);
+       RESET_SETTING(settings, compressionVbrQualityMacEnc);
        RESET_SETTING(settings, compressionVbrQualityOggEnc);
        RESET_SETTING(settings, compressionVbrQualityOpusEnc);
        RESET_SETTING(settings, compressionVbrQualityWave);
 }
 
 ////////////////////////////////////////////////////////////
+// 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
 ////////////////////////////////////////////////////////////
 
 int EncoderRegistry::getAacEncoder(void)
 {
-       if(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll"))
+       if(lamexp_tools_check("qaac.exe") && lamexp_tools_check("libsoxr.dll") && lamexp_tools_check("libsoxconvolver.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"))
+       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;
        }
-       else if(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe"))
+       else if(lamexp_tools_check("neroAacEnc.exe") && lamexp_tools_check("neroAacDec.exe") && lamexp_tools_check("neroAacTag.exe"))
        {
                return SettingsModel::AAC_ENCODER_NERO;
        }