OSDN Git Service

Don't try to encode from source files that aren't supported by the encoder. No real...
authorlordmulder <mulder2@gmx.de>
Thu, 25 Nov 2010 17:09:31 +0000 (18:09 +0100)
committerlordmulder <mulder2@gmx.de>
Thu, 25 Nov 2010 17:09:31 +0000 (18:09 +0100)
src/Config.h
src/Dialog_Processing.cpp
src/Encoder_Abstract.h
src/Encoder_MP3.cpp
src/Encoder_MP3.h
src/Thread_Process.cpp

index 82cbc6e..30ee4c7 100644 (file)
@@ -25,7 +25,7 @@
 #define VER_LAMEXP_MAJOR                               4
 #define VER_LAMEXP_MINOR_HI                            0
 #define VER_LAMEXP_MINOR_LO                            0
-#define VER_LAMEXP_BUILD                               78
+#define VER_LAMEXP_BUILD                               79
 #define VER_LAMEXP_SUFFIX                              TechPreview
 
 /*
index 03ea635..4942449 100644 (file)
@@ -264,13 +264,13 @@ void ProcessingDialog::doneEncoding(void)
        
        if(m_userAborted)
        {
-               label_progress->setText("Process was aborted by the user!");
+               label_progress->setText(QString("Process was aborted by the user after %1 files!").arg(QString::number(m_succeededFiles)));
        }
        else
        {
                if(m_failedFiles)
                {
-                       label_progress->setText(QString("Error: %1 of %2 files failed. See the log for details!").arg(QString::number(m_failedFiles), QString::number(m_failedFiles + m_succeededFiles)));
+                       label_progress->setText(QString("Error: %1 of %2 files failed. Double-click failed items for detailed information!").arg(QString::number(m_failedFiles), QString::number(m_failedFiles + m_succeededFiles)));
                }
                else
                {
@@ -282,6 +282,7 @@ void ProcessingDialog::doneEncoding(void)
        button_closeDialog->setEnabled(true);
        button_AbortProcess->setEnabled(false);
 
+       view_log->scrollToBottom();
        m_progressIndicator->stop();
        progressBar->setValue(100);
 }
index ff0507a..ec9fcfe 100644 (file)
@@ -37,12 +37,16 @@ public:
        AbstractEncoder(void);
        ~AbstractEncoder(void);
 
+       //Internal encoder API
        virtual bool encode(const AudioFileModel &sourceFile, const QString &outputFile, volatile bool *abortFlag) = 0;
+       virtual bool isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) = 0;
        virtual QString extension(void) = 0;
 
+       //Common setter methods
        void setBitrate(int bitrate);
        void setRCMode(int mode);
 
+       //Auxiliary functions
        bool startProcess(QProcess &process, const QString &program, const QStringList &args);
        static QString commandline2string(const QString &program, const QStringList &arguments);
 
index 962adb4..e00cd39 100644 (file)
@@ -147,3 +147,29 @@ QString MP3Encoder::extension(void)
 {
        return "mp3";
 }
+
+bool MP3Encoder::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;
+               }
+       }
+       else if(containerType.compare("MPEG Audio", Qt::CaseInsensitive) == 0)
+       {
+               if(formatType.compare("MPEG Audio", Qt::CaseInsensitive) == 0)
+               {
+                       if(formatProfile.compare("Layer 3", Qt::CaseInsensitive) == 0 || formatProfile.compare("Layer 2", Qt::CaseInsensitive) == 0)
+                       {
+                               if(formatVersion.compare("Version 1", Qt::CaseInsensitive) == 0 || formatVersion.compare("Version 2", Qt::CaseInsensitive) == 0)
+                               {
+                                       return true;
+                               }
+                       }
+               }
+       }
+
+       return false;
+}
index 7c99cce..bed3a6e 100644 (file)
@@ -34,6 +34,7 @@ public:
        ~MP3Encoder(void);
 
        virtual bool encode(const AudioFileModel &sourceFile, 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:
index 9c90397..ba02d74 100644 (file)
@@ -76,6 +76,15 @@ void ProcessThread::run()
        if(outFileName.isEmpty())
        {
                emit processStateChanged(m_jobId, "Not found!", ProgressModel::JobFailed);
+               emit processStateFinished(m_jobId, outFileName, false);
+               return;
+       }
+
+       if(!m_encoder->isFormatSupported(m_audioFile.formatContainerType(), m_audioFile.formatContainerProfile(), m_audioFile.formatAudioType(), m_audioFile.formatAudioProfile(), m_audioFile.formatAudioVersion()))
+       {
+               handleMessage(QString("The format of this file is NOT supported:\n%1\n\nContainer Format:\t%2\nAudio Format:\t%3").arg(m_audioFile.filePath(), m_audioFile.formatContainerInfo(), m_audioFile.formatAudioCompressInfo()));
+               emit processStateChanged(m_jobId, "Unsupported!", ProgressModel::JobFailed);
+               emit processStateFinished(m_jobId, outFileName, false);
                return;
        }
 
@@ -120,8 +129,20 @@ QString ProcessThread::generateOutFileName(void)
        QFileInfo sourceFile(m_audioFile.filePath());
        if(!sourceFile.exists() || !sourceFile.isFile())
        {
+               handleMessage(QString("The source audio file could not be found:\n%1").arg(sourceFile.absoluteFilePath()));
+               return QString();
+       }
+
+       QFile readTest(sourceFile.canonicalFilePath());
+       if(!readTest.open(QIODevice::ReadOnly))
+       {
+               handleMessage(QString("The source audio file could not be opened for reading:\n%1").arg(readTest.fileName()));
                return QString();
        }
+       else
+       {
+               readTest.close();
+       }
 
        QString baseName = sourceFile.completeBaseName();
        QDir targetDir(m_outputDirectory.isEmpty() ? sourceFile.canonicalPath() : m_outputDirectory);
@@ -131,10 +152,23 @@ QString ProcessThread::generateOutFileName(void)
                targetDir.mkpath(".");
                if(!targetDir.exists())
                {
+                       handleMessage(QString("The target output directory doesn't exist and could NOT be created:\n%1").arg(targetDir.absolutePath()));
                        return QString();
                }
        }
        
+       QFile writeTest(QString("%1/%2").arg(targetDir.canonicalPath(), QUuid::createUuid().toString()));
+       if(!writeTest.open(QIODevice::ReadWrite))
+       {
+               handleMessage(QString("The target output directory is NOT writable:\n%1").arg(targetDir.absolutePath()));
+               return QString();
+       }
+       else
+       {
+               writeTest.close();
+               writeTest.remove();
+       }
+
        QString outFileName = QString("%1/%2.%3").arg(targetDir.canonicalPath(), baseName, "mp3");
        while(QFileInfo(outFileName).exists())
        {