OSDN Git Service

Removed some Debug outputs.
[lamexp/LameXP.git] / src / Thread_CueSplitter.cpp
index d957924..a219b36 100644 (file)
@@ -1,11 +1,12 @@
 ///////////////////////////////////////////////////////////////////////////////
 // LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2012 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
 // the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// (at your option) any later version, but always including the *additional*
+// restrictions defined in the "License.txt" file.
 //
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,6 +22,7 @@
 
 #include "Thread_CueSplitter.h"
 
+//Internal
 #include "Global.h"
 #include "LockedFile.h"
 #include "Model_AudioFile.h"
 #include "Registry_Decoder.h"
 #include "Decoder_Abstract.h"
 
+//MUtils
+#include <MUtils/Global.h>
+#include <MUtils/OSSupport.h>
+
+//Qt
 #include <QDir>
 #include <QFileInfo>
 #include <QProcess>
@@ -35,6 +42,7 @@
 #include <QTime>
 #include <QDebug>
 
+//CRT
 #include <math.h>
 #include <float.h>
 #include <limits>
@@ -48,7 +56,7 @@ CueSplitter::CueSplitter(const QString &outputDir, const QString &baseName, CueS
        m_model(model),
        m_outputDir(outputDir),
        m_baseName(baseName),
-       m_soxBin(lamexp_lookup_tool("sox.exe"))
+       m_soxBin(lamexp_tools_lookup("sox.exe"))
 {
        if(m_soxBin.isEmpty())
        {
@@ -64,7 +72,7 @@ CueSplitter::CueSplitter(const QString &outputDir, const QString &baseName, CueS
        for(int i = 0; i < nInputFiles; i++)
        {
                m_inputFilesInfo.insert(inputFilesInfo[i].filePath(), inputFilesInfo[i]);
-               qDebug("File %02d: <%s>", i, inputFilesInfo[i].filePath().toUtf8().constData());
+               qDebug("File %02d: <%s>", i, MUTILS_UTF8(inputFilesInfo[i].filePath()));
        }
        
        qDebug("All input files added.");
@@ -75,7 +83,7 @@ CueSplitter::~CueSplitter(void)
 {
        while(!m_tempFiles.isEmpty())
        {
-               lamexp_remove_file(m_tempFiles.takeFirst());
+               MUtils::remove_file(m_tempFiles.takeFirst());
        }
 }
 
@@ -95,7 +103,7 @@ void CueSplitter::run()
        
        if(!QDir(m_outputDir).exists())
        {
-               qWarning("Output directory \"%s\" does not exist!", m_outputDir.toUtf8().constData());
+               qWarning("Output directory \"%s\" does not exist!", MUTILS_UTF8(m_outputDir));
                return;
        }
        
@@ -108,10 +116,10 @@ void CueSplitter::run()
        //Decompress all input files
        for(int i = 0; i < nInputFiles; i++)
        {
-               AudioFileModel &inputFileInfo = m_inputFilesInfo[inputFileList.at(i)];
-               if(inputFileInfo.formatContainerType().compare("Wave", Qt::CaseInsensitive) || inputFileInfo.formatAudioType().compare("PCM", Qt::CaseInsensitive))
+               const AudioFileModel_TechInfo &inputFileInfo = m_inputFilesInfo[inputFileList.at(i)].techInfo();
+               if(inputFileInfo.containerType().compare("Wave", Qt::CaseInsensitive) || inputFileInfo.audioType().compare("PCM", Qt::CaseInsensitive))
                {
-                       AbstractDecoder *decoder = DecoderRegistry::lookup(inputFileInfo.formatContainerType(), inputFileInfo.formatContainerProfile(), inputFileInfo.formatAudioType(), inputFileInfo.formatAudioProfile(), inputFileInfo.formatAudioVersion());
+                       AbstractDecoder *decoder = DecoderRegistry::lookup(inputFileInfo.containerType(), inputFileInfo.containerProfile(), inputFileInfo.audioType(), inputFileInfo.audioProfile(), inputFileInfo.audioVersion());
                        if(decoder)
                        {
                                m_activeFile = shortName(QFileInfo(inputFileList.at(i)).fileName());
@@ -119,7 +127,7 @@ void CueSplitter::run()
                                emit fileSelected(m_activeFile);
                                emit progressValChanged(i+1);
                                
-                               QString tempFile = QString("%1/~%2.wav").arg(m_outputDir, lamexp_rand_str());
+                               QString tempFile = QString("%1/~%2.wav").arg(m_outputDir, MUtils::rand_str());
                                connect(decoder, SIGNAL(statusUpdated(int)), this, SLOT(handleUpdate(int)), Qt::DirectConnection);
                                
                                if(decoder->decode(inputFileList.at(i), tempFile, &m_abortFlag))
@@ -130,11 +138,11 @@ void CueSplitter::run()
                                else
                                {
                                        qWarning("Failed to decompress file: <%s>", inputFileList.at(i).toLatin1().constData());
-                                       lamexp_remove_file(tempFile);
+                                       MUtils::remove_file(tempFile);
                                }
                                
                                m_activeFile.clear();
-                               LAMEXP_DELETE(decoder);
+                               MUTILS_DELETE(decoder);
                        }
                        else
                        {
@@ -162,26 +170,22 @@ void CueSplitter::run()
                nTracksTotal += m_model->getTrackCount(i);
        }
 
-       emit progressMaxChanged(nTracksTotal);
+       emit progressMaxChanged(10 * nTracksTotal);
        emit progressValChanged(0);
 
-       QString albumPerformer = m_model->getAlbumPerformer();
-       QString albumTitle = m_model->getAlbumTitle();
-       QString albumGenre = m_model->getAlbumGenre();
-       unsigned int albumYear = m_model->getAlbumYear();
+       const AudioFileModel_MetaInfo *albumInfo = m_model->getAlbumInfo();
 
        //Now split all files
        for(int i = 0; i < nFiles; i++)
        {
                int nTracks = m_model->getTrackCount(i);
                QString trackFile = m_model->getFileName(i);
-               int maxProgress = 0;
 
                //Process all tracks
                for(int j = 0; j < nTracks; j++)
                {
-                       emit progressValChanged(++nTracksComplete);
-                       int trackNo = m_model->getTrackNo(i, j);
+                       const AudioFileModel_MetaInfo *trackInfo = m_model->getTrackInfo(i, j);
+                       const int trackNo = trackInfo->position();
                        double trackOffset = std::numeric_limits<double>::quiet_NaN();
                        double trackLength = std::numeric_limits<double>::quiet_NaN();
                        m_model->getTrackIndex(i, j, &trackOffset, &trackLength);
@@ -193,50 +197,27 @@ void CueSplitter::run()
                        }
                        
                        //Setup meta info
-                       AudioFileModel trackMetaInfo(QString().sprintf("cue://File%02d/Track%02d", i, j));
-                       trackMetaInfo.setFileName(m_model->getTrackTitle(i, j));
-                       trackMetaInfo.setFileArtist(m_model->getTrackPerformer(i, j));
-                       trackMetaInfo.setFileGenre(m_model->getTrackGenre(i, j));
-                       trackMetaInfo.setFileYear(m_model->getTrackYear(i, j));
-                       trackMetaInfo.setFilePosition(trackNo);
+                       AudioFileModel_MetaInfo trackMetaInfo(*trackInfo);
                        
                        //Apply album meta data on files
-                       if(trackMetaInfo.fileName().trimmed().isEmpty())
-                       {
-                               trackMetaInfo.setFileName(QString().sprintf("Track %02d", trackNo));
-                       }
-                       if(!albumTitle.isEmpty())
-                       {
-                               trackMetaInfo.setFileAlbum(albumTitle);
-                       }
-                       if(!albumPerformer.isEmpty() && trackMetaInfo.fileArtist().isEmpty())
-                       {
-                               trackMetaInfo.setFileArtist(albumPerformer);
-                       }
-                       if(!albumGenre.isEmpty() && trackMetaInfo.fileGenre().isEmpty())
-                       {
-                               trackMetaInfo.setFileGenre(albumGenre);
-                       }
-                       if((albumYear > 0) && (trackMetaInfo.fileYear() == 0))
+                       if(trackMetaInfo.title().trimmed().isEmpty())
                        {
-                               trackMetaInfo.setFileYear(albumYear);
-                       }
-                       if(_finite(trackLength))
-                       {
-                               trackMetaInfo.setFileDuration(static_cast<unsigned int>(abs(trackLength)));
+                               trackMetaInfo.setTitle(QString().sprintf("Track %02d", trackNo));
                        }
+                       trackMetaInfo.update(*albumInfo, false);
 
                        //Generate output file name
-                       QString trackTitle = trackMetaInfo.fileName().isEmpty() ? QString().sprintf("Track %02d", trackNo) : trackMetaInfo.fileName();
-                       QString outputFile = QString("%1/[%2] %3 - %4.wav").arg(m_outputDir, QString().sprintf("%02d", trackNo), lamexp_clean_filename(m_baseName), lamexp_clean_filename(trackTitle));
+                       QString trackTitle = trackMetaInfo.title().isEmpty() ? QString().sprintf("Track %02d", trackNo) : trackMetaInfo.title();
+                       QString outputFile = QString("%1/[%2] %3 - %4.wav").arg(m_outputDir, QString().sprintf("%02d", trackNo), MUtils::clean_file_name(m_baseName), MUtils::clean_file_name(trackTitle));
                        for(int n = 2; QFileInfo(outputFile).exists(); n++)
                        {
-                               outputFile = QString("%1/[%2] %3 - %4 (%5).wav").arg(m_outputDir, QString().sprintf("%02d", trackNo), lamexp_clean_filename(m_baseName), lamexp_clean_filename(trackTitle), QString::number(n));
+                               outputFile = QString("%1/[%2] %3 - %4 (%5).wav").arg(m_outputDir, QString().sprintf("%02d", trackNo), MUtils::clean_file_name(m_baseName), MUtils::clean_file_name(trackTitle), QString::number(n));
                        }
 
                        //Call split function
                        emit fileSelected(shortName(QFileInfo(outputFile).fileName()));
-                       splitFile(outputFile,  trackNo, trackFile, trackOffset, trackLength, trackMetaInfo, maxProgress);
+                       splitFile(outputFile, trackNo, trackFile, trackOffset, trackLength, trackMetaInfo, nTracksComplete);
+                       emit progressValChanged(nTracksComplete += 10);
 
                        if(m_abortFlag)
                        {
@@ -247,6 +228,9 @@ void CueSplitter::run()
                }
        }
 
+       emit progressValChanged(10 * nTracksTotal);
+       MUtils::OS::sleep_ms(333);
+
        qDebug("All files were split.\n");
        m_bSuccess = true;
 }
@@ -257,22 +241,25 @@ void CueSplitter::run()
 
 void CueSplitter::handleUpdate(int progress)
 {
-       emit fileSelected(QString("%1 [%2%]").arg(m_activeFile, QString::number(progress)));
+       //QString("%1 [%2]").arg(m_activeFile, QString::number(progress)))
 }
 
 ////////////////////////////////////////////////////////////
 // Privtae Functions
 ////////////////////////////////////////////////////////////
 
-void CueSplitter::splitFile(const QString &output, const int trackNo, const QString &file, const double offset, const double length, const AudioFileModel &metaInfo, int &maxProgress)
+void CueSplitter::splitFile(const QString &output, const int trackNo, const QString &file, const double offset, const double length, const AudioFileModel_MetaInfo &metaInfo, const int baseProgress)
 {
        qDebug("[Track %02d]", trackNo);
-       qDebug("File: <%s>", file.toUtf8().constData());
+       qDebug("File: <%s>", MUTILS_UTF8(file));
        qDebug("Offset: <%f> <%s>", offset, indexToString(offset).toLatin1().constData());
        qDebug("Length: <%f> <%s>", length, indexToString(length).toLatin1().constData());
-       qDebug("Artist: <%s>", metaInfo.fileArtist().toUtf8().constData());
-       qDebug("Title: <%s>", metaInfo.fileName().toUtf8().constData());
+       qDebug("Artist: <%s>", MUTILS_UTF8(metaInfo.artist()));
+       qDebug("Title: <%s>", MUTILS_UTF8(metaInfo.title()));
+       qDebug("Album: <%s>", MUTILS_UTF8(metaInfo.album()));
        
+       int prevProgress = baseProgress;
+
        if(!m_decompressedFiles.contains(file))
        {
                qWarning("Unknown or unsupported input file, skipping!");
@@ -282,14 +269,15 @@ void CueSplitter::splitFile(const QString &output, const int trackNo, const QStr
 
        QString baseName = shortName(QFileInfo(output).fileName());
        QString decompressedInput = m_decompressedFiles[file];
-       qDebug("Input: <%s>", decompressedInput.toUtf8().constData());
+       qDebug("Input: <%s>", MUTILS_UTF8(decompressedInput));
        
-       emit fileSelected(QString("%1 [%2%]").arg(baseName, QString::number(maxProgress)));
-
-       AudioFileModel outFileInfo(metaInfo);
-       outFileInfo.setFilePath(output);
-       outFileInfo.setFormatContainerType("Wave");
-       outFileInfo.setFormatAudioType("PCM");
+       AudioFileModel outFileInfo(output);
+       outFileInfo.setMetaInfo(metaInfo);
+       
+       AudioFileModel_TechInfo &outFileTechInfo = outFileInfo.techInfo();
+       outFileTechInfo.setContainerType("Wave");
+       outFileTechInfo.setAudioType("PCM");
+       outFileTechInfo.setDuration(static_cast<unsigned int>(abs(length)));
 
        QStringList args;
        args << "-S" << "-V3";
@@ -316,9 +304,8 @@ void CueSplitter::splitFile(const QString &output, const int trackNo, const QStr
        QRegExp rxDuration("Duration\\s*:\\s*(\\d\\d):(\\d\\d):(\\d\\d).(\\d\\d)", Qt::CaseInsensitive);
 
        QProcess process;
-       process.setProcessChannelMode(QProcess::MergedChannels);
-       process.setReadChannel(QProcess::StandardOutput);
-       process.setWorkingDirectory(m_outputDir);
+       MUtils::init_process(process, m_outputDir);
+
        process.start(m_soxBin, args);
                
        if(!process.waitForStarted())
@@ -356,27 +343,31 @@ void CueSplitter::splitFile(const QString &output, const int trackNo, const QStr
                                int progress = rxProgress.cap(1).toInt(&ok);
                                if(ok)
                                {
-                                       maxProgress = qMax(maxProgress, progress);
-                                       emit fileSelected(QString("%1 [%2%]").arg(baseName, QString::number(maxProgress)));
+                                       const int newProgress = baseProgress + qRound(static_cast<double>(qBound(0, progress, 100)) / 10.0);
+                                       if(newProgress > prevProgress)
+                                       {
+                                               emit progressValChanged(newProgress);
+                                               prevProgress = newProgress;
+                                       }
                                }
                        }
                        else if(rxChannels.lastIndexIn(text) >= 0)
                        {
                                bool ok = false;
                                unsigned int channels = rxChannels.cap(1).toUInt(&ok);
-                               if(ok) outFileInfo.setFormatAudioChannels(channels);
+                               if(ok) outFileInfo.techInfo().setAudioChannels(channels);
                        }
                        else if(rxSamplerate.lastIndexIn(text) >= 0)
                        {
                                bool ok = false;
                                unsigned int samplerate = rxSamplerate.cap(1).toUInt(&ok);
-                               if(ok) outFileInfo.setFormatAudioSamplerate(samplerate);
+                               if(ok) outFileInfo.techInfo().setAudioSamplerate(samplerate);
                        }
                        else if(rxPrecision.lastIndexIn(text) >= 0)
                        {
                                bool ok = false;
                                unsigned int precision = rxPrecision.cap(1).toUInt(&ok);
-                               if(ok) outFileInfo.setFormatAudioBitdepth(precision);
+                               if(ok) outFileInfo.techInfo().setAudioBitdepth(precision);
                        }
                        else if(rxDuration.lastIndexIn(text) >= 0)
                        {
@@ -392,7 +383,7 @@ void CueSplitter::splitFile(const QString &output, const int trackNo, const QStr
                                                qDebug("Duration updated from SoX info!");
                                                int duration = intputLen - static_cast<int>(floor(offset + 0.5));
                                                if(duration < 0) qWarning("Track is out of bounds: Track offset exceeds input file duration!");
-                                               outFileInfo.setFileDuration(qMax(0, duration));
+                                               outFileInfo.techInfo().setDuration(qMax(0, duration));
                                        }
                                        else
                                        {