X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2FFilter_Normalize.cpp;h=9862e15324dc3a699eb866b62a4263c854fe3ab6;hb=781314ce09d97adc894a5cccf835054d877beb3b;hp=93d22a540f649f057dc833f3aa99cc9d25da007a;hpb=cc38035087d0ea2fddf3b41375de94abc43886f4;p=lamexp%2FLameXP.git diff --git a/src/Filter_Normalize.cpp b/src/Filter_Normalize.cpp index 93d22a54..9862e153 100644 --- a/src/Filter_Normalize.cpp +++ b/src/Filter_Normalize.cpp @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// // LameXP - Audio Encoder Front-End -// Copyright (C) 2004-2014 LoRd_MuldeR +// Copyright (C) 2004-2020 LoRd_MuldeR // // 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 +// 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, but always including the *additional* -// restrictions defined in the "License.txt" file. +// (at your option) any later version; always including the non-optional +// LAMEXP GNU GENERAL PUBLIC LICENSE ADDENDUM. See "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 @@ -22,103 +22,98 @@ #include "Filter_Normalize.h" +//Internal #include "Global.h" +//MUtils +#include +#include + +//Qt #include #include #include -NormalizeFilter::NormalizeFilter(int peakVolume, int equalizationMode) +static double dbToLinear(const double &value) +{ + return pow(10.0, value / 20.0); +} + +NormalizeFilter::NormalizeFilter(const int &peakVolume, const bool &dnyAudNorm, const bool &channelsCoupled, const int &filterSize) : - m_binary(lamexp_lookup_tool("sox.exe")) + m_binary(lamexp_tools_lookup("sox.exe")), + m_useDynAudNorm(dnyAudNorm), + m_peakVolume(qMin(-50, qMax(-3200, peakVolume))), + m_channelsCoupled(channelsCoupled), + m_filterLength(qBound(3, filterSize + (1 - (filterSize % 2)), 301)) { if(m_binary.isEmpty()) { - THROW("Error initializing SoX filter. Tool 'sox.exe' is not registred!"); + MUTILS_THROW("Error initializing SoX filter. Tool 'sox.exe' is not registred!"); } - - m_peakVolume = qMin(-50, qMax(-3200, peakVolume)); - m_equalizationMode = qMin(2, qMax(0, equalizationMode)); } NormalizeFilter::~NormalizeFilter(void) { } -bool NormalizeFilter::apply(const QString &sourceFile, const QString &outputFile, AudioFileModel_TechInfo *formatInfo, volatile bool *abortFlag) +AbstractFilter::FilterResult NormalizeFilter::apply(const QString &sourceFile, const QString &outputFile, AudioFileModel_TechInfo *const formatInfo, QAtomicInt &abortFlag) { QProcess process; QStringList args; - QString eqMode = (m_equalizationMode == 0) ? "-n" : ((m_equalizationMode == 1) ? "-ne" : "-nb"); - - process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); args << "-V3" << "-S"; args << "--temp" << "."; args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); - args << "gain"; - args << eqMode << QString().sprintf("%.2f", static_cast(m_peakVolume) / 100.0); - if(!startProcess(process, m_binary, args)) + if(!m_useDynAudNorm) { - return false; + args << "gain"; + args << (m_channelsCoupled ? "-n" : "-nb"); + args << QString().sprintf("%.2f", static_cast(m_peakVolume) / 100.0); + } + else + { + args << "dynaudnorm"; + args << "-p" << QString().sprintf("%.2f", qBound(0.1, dbToLinear(static_cast(m_peakVolume) / 100.0), 1.0)); + args << "-g" << QString().sprintf("%d", m_filterLength); + if(!m_channelsCoupled) + { + args << "-n"; + } } - bool bTimeout = false; - bool bAborted = false; + if(!startProcess(process, m_binary, args, QFileInfo(outputFile).canonicalPath())) + { + return AbstractFilter::FILTER_FAILURE; + } + int prevProgress = -1; QRegExp regExp("In:(\\d+)(\\.\\d+)*%"); - while(process.state() != QProcess::NotRunning) + const result_t result = awaitProcess(process, abortFlag, [this, &prevProgress, ®Exp](const QString &text) { - if(*abortFlag) + if (regExp.lastIndexIn(text) >= 0) { - process.kill(); - bAborted = true; - emit messageLogged("\nABORTED BY USER !!!"); - break; - } - process.waitForReadyRead(m_processTimeoutInterval); - if(!process.bytesAvailable() && process.state() == QProcess::Running) - { - process.kill(); - qWarning("SoX process timed out <-- killing!"); - emit messageLogged("\nPROCESS TIMEOUT !!!"); - bTimeout = true; - break; - } - while(process.bytesAvailable() > 0) - { - QByteArray line = process.readLine(); - QString text = QString::fromUtf8(line.constData()).simplified(); - if(regExp.lastIndexIn(text) >= 0) + qint32 newProgress; + if (MUtils::regexp_parse_int32(regExp, newProgress)) { - bool ok = false; - int progress = regExp.cap(1).toInt(&ok); - if(ok) emit statusUpdated(progress); - } - else if(!text.isEmpty()) - { - emit messageLogged(text); + if (newProgress > prevProgress) + { + emit statusUpdated(newProgress); + prevProgress = NEXT_PROGRESS(newProgress); + } } + return true; } - } - - process.waitForFinished(); - if(process.state() != QProcess::NotRunning) - { - process.kill(); - process.waitForFinished(-1); - } - - emit statusUpdated(100); - emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); + return false; + }); - if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) + if (result != RESULT_SUCCESS) { - return false; + return AbstractFilter::FILTER_FAILURE; } - return true; + return AbstractFilter::FILTER_SUCCESS; }