X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2FDecoder_AC3.cpp;h=e5a4f3720111a9939d6c88c327dffbe8d36eb9ea;hb=de53a6e1979692ca566072d8615652460aa6b4f9;hp=77bdf365f75ab8ca9ba6d9b200fd730c114a0491;hpb=c435e4e1c1ff3d25197d153c884d6288042286e0;p=lamexp%2FLameXP.git diff --git a/src/Decoder_AC3.cpp b/src/Decoder_AC3.cpp index 77bdf365..e5a4f372 100644 --- a/src/Decoder_AC3.cpp +++ b/src/Decoder_AC3.cpp @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// // LameXP - Audio Encoder Front-End -// Copyright (C) 2004-2014 LoRd_MuldeR +// Copyright (C) 2004-2023 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 @@ -47,103 +47,71 @@ AC3Decoder::~AC3Decoder(void) { } -bool AC3Decoder::decode(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag) +bool AC3Decoder::decode(const QString &sourceFile, const QString &outputFile, QAtomicInt &abortFlag) { QProcess process; QStringList args; args << QDir::toNativeSeparators(sourceFile); - args << "-i" << "-w" << QDir::toNativeSeparators(outputFile); + args << "-w" << QDir::toNativeSeparators(outputFile); if(!startProcess(process, m_binary, args)) { return false; } - bool bTimeout = false; - bool bAborted = false; + int prevProgress = -1; + QRegExp regExp("\\b\\s*(\\d+)\\.(\\d+)?%(\\s+)Frames", Qt::CaseInsensitive); - QRegExp regExp("\\b(\\s*)(\\d+)\\.(\\d+)%(\\s+)Frames"); - - while(process.state() != QProcess::NotRunning) + const result_t result = awaitProcess(process, abortFlag, [this, &prevProgress, ®Exp](const QString &text) { - if(*abortFlag) - { - process.kill(); - bAborted = true; - emit messageLogged("\nABORTED BY USER !!!"); - break; - } - process.waitForReadyRead(m_processTimeoutInterval); - if(!process.bytesAvailable() && process.state() == QProcess::Running) + if (regExp.lastIndexIn(text) >= 0) { - process.kill(); - qWarning("Valdec 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(2).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())); - - if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) - { return false; - } - - return true; + }); + + return (result == RESULT_SUCCESS); } -bool AC3Decoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) +bool AC3Decoder::isFormatSupported(const QString &containerType, const QString& /*containerProfile*/, const QString &formatType, const QString& /*formatProfile*/, const QString& /*formatVersion*/) { - if(containerType.compare("AC-3", Qt::CaseInsensitive) == 0) + static const QLatin1String ac3("AC-3"), eac3("E-AC-3"), dts("DTS"); + if(containerType.compare(ac3, Qt::CaseInsensitive) == 0) { - if(formatType.compare("AC-3", Qt::CaseInsensitive) == 0) + if(formatType.compare(ac3, Qt::CaseInsensitive) == 0) { return true; } } - if(containerType.compare("E-AC-3", Qt::CaseInsensitive) == 0) + if(containerType.compare(eac3, Qt::CaseInsensitive) == 0) { - if(formatType.compare("E-AC-3", Qt::CaseInsensitive) == 0) + if(formatType.compare(eac3, Qt::CaseInsensitive) == 0) { return true; } } - else if(containerType.compare("DTS", Qt::CaseInsensitive) == 0) + + else if(containerType.compare(dts, Qt::CaseInsensitive) == 0) { - if(formatType.compare("DTS", Qt::CaseInsensitive) == 0) + if(formatType.compare(dts, Qt::CaseInsensitive) == 0) { return true; } } - else if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) + else if(containerType.compare(QLatin1String("Wave"), Qt::CaseInsensitive) == 0) { - if(formatType.compare("AC-3", Qt::CaseInsensitive) == 0 || formatType.compare("E-AC-3", Qt::CaseInsensitive) == 0 || formatType.compare("DTS", Qt::CaseInsensitive) == 0) + if((formatType.compare(ac3, Qt::CaseInsensitive) == 0) || (formatType.compare(eac3, Qt::CaseInsensitive) == 0) || (formatType.compare(dts, Qt::CaseInsensitive) == 0)) { return true; } @@ -152,8 +120,20 @@ bool AC3Decoder::isFormatSupported(const QString &containerType, const QString & return false; } -QStringList AC3Decoder::supportedTypes(void) +const AbstractDecoder::supportedType_t *AC3Decoder::supportedTypes(void) { - return QStringList() << "AC-3 / ATSC A/52 (*.ac3 *.eac3 *.wav)" << "Digital Theater System (*.dts)"; -} + static const char *exts[][4] = + { + { "ac3", "eac3", "wav", NULL }, + { "dts", "wav", NULL } + }; + static const supportedType_t s_supportedTypes[] = + { + { "AC-3 / ATSC A/52", exts[0] }, + { "Digital Theater System", exts[1] }, + { NULL, NULL } + }; + + return s_supportedTypes; +}