From 188288cea6960dc7153136eb11217ef8382452b5 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Thu, 10 Oct 2013 11:34:03 +0000 Subject: rgscan: fixed class name git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3771 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/rgscan/rgscan.pro | 8 +- src/plugins/General/rgscan/rgscandialog.cpp | 14 +- src/plugins/General/rgscan/rgscandialog.h | 6 +- src/plugins/General/rgscan/rgscaner.cpp | 314 ---------------------------- src/plugins/General/rgscan/rgscaner.h | 71 ------- src/plugins/General/rgscan/rgscanhelper.cpp | 1 - src/plugins/General/rgscan/rgscanhelper.h | 2 +- src/plugins/General/rgscan/rgscanner.cpp | 314 ++++++++++++++++++++++++++++ src/plugins/General/rgscan/rgscanner.h | 71 +++++++ 9 files changed, 400 insertions(+), 401 deletions(-) delete mode 100644 src/plugins/General/rgscan/rgscaner.cpp delete mode 100644 src/plugins/General/rgscan/rgscaner.h create mode 100644 src/plugins/General/rgscan/rgscanner.cpp create mode 100644 src/plugins/General/rgscan/rgscanner.h (limited to 'src') diff --git a/src/plugins/General/rgscan/rgscan.pro b/src/plugins/General/rgscan/rgscan.pro index 752e665c2..56ae3471a 100644 --- a/src/plugins/General/rgscan/rgscan.pro +++ b/src/plugins/General/rgscan/rgscan.pro @@ -42,14 +42,14 @@ INSTALLS += target HEADERS += rgscanfactory.h \ rgscanhelper.h \ rgscandialog.h \ - rgscaner.h \ - gain_analysis.h + gain_analysis.h \ + rgscanner.h win32:HEADERS += ../../../../src/qmmpui/general.h SOURCES += rgscanfactory.cpp \ rgscanhelper.cpp \ rgscandialog.cpp \ - rgscaner.cpp \ - gain_analysis.c + gain_analysis.c \ + rgscanner.cpp FORMS += rgscandialog.ui diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp index 57ca145f4..4414c34d8 100644 --- a/src/plugins/General/rgscan/rgscandialog.cpp +++ b/src/plugins/General/rgscan/rgscandialog.cpp @@ -25,7 +25,7 @@ #include #include #include -#include "rgscaner.h" +#include "rgscanner.h" #include "gain_analysis.h" #include "rgscandialog.h" @@ -73,7 +73,7 @@ void RGScanDialog::on_calculateButton_clicked() for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) { QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString(); - RGScaner *scaner = new RGScaner(); + RGScanner *scaner = new RGScanner(); if(!scaner->prepare(url)) { @@ -96,7 +96,7 @@ void RGScanDialog::onScanFinished(QString url) { if(url != m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString()) continue; - RGScaner *scanner = findScannerByUrl(url); + RGScanner *scanner = findScannerByUrl(url); if(!scanner) qFatal("RGScanDialog: unable to find scanner by URL!"); m_ui.tableWidget->setItem(i, 2, new QTableWidgetItem(tr("%1 dB").arg(scanner->gain()))); @@ -106,7 +106,7 @@ void RGScanDialog::onScanFinished(QString url) bool stopped = true; - foreach (RGScaner *scanner, m_scanners) + foreach (RGScanner *scanner, m_scanners) { if(scanner->isRunning()) stopped = false; @@ -154,7 +154,7 @@ void RGScanDialog::stop() { if(m_scanners.isEmpty()) return; - foreach (RGScaner *scaner, m_scanners) + foreach (RGScanner *scaner, m_scanners) { scaner->stop(); } @@ -163,9 +163,9 @@ void RGScanDialog::stop() m_scanners.clear(); } -RGScaner *RGScanDialog::findScannerByUrl(const QString &url) +RGScanner *RGScanDialog::findScannerByUrl(const QString &url) { - foreach (RGScaner *scanner, m_scanners) + foreach (RGScanner *scanner, m_scanners) { if(scanner->url() == url) return scanner; diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h index 5db2f2008..eeacbb632 100644 --- a/src/plugins/General/rgscan/rgscandialog.h +++ b/src/plugins/General/rgscan/rgscandialog.h @@ -28,7 +28,7 @@ class QAction; class PlayListTrack; class ConverterPreset; -class RGScaner; +class RGScanner; /** @author Ilya Kotov @@ -47,9 +47,9 @@ private slots: private: void stop(); - RGScaner *findScannerByUrl(const QString &url); + RGScanner *findScannerByUrl(const QString &url); Ui::RGScanDialog m_ui; - QList m_scanners; + QList m_scanners; }; #endif // RGSCANDIALOG_H diff --git a/src/plugins/General/rgscan/rgscaner.cpp b/src/plugins/General/rgscan/rgscaner.cpp deleted file mode 100644 index 203a2a7ab..000000000 --- a/src/plugins/General/rgscan/rgscaner.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2013 by Ilya Kotov * - * forkotov02@hotmail.ru * - * * - * 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. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include -#include -#include -#include -#include "rgscaner.h" - -RGScaner::RGScaner() -{ - m_gain = 0.; - m_peak = 0.; - m_user_stop = false; - m_is_running = false; - m_has_values = false; - m_handle = 0; - m_decoder = 0; - m_source = 0; -} - -RGScaner::~RGScaner() -{ - stop(); - deinit(); - if(m_handle) - { - DeinitGainAbalysis(m_handle); - m_handle = 0; - } -} - -bool RGScaner::prepare(const QString &url) -{ - deinit(); - m_url = url; - QString name = m_url.section("/", -1); - InputSource *source = InputSource::create(url, 0); - if(!source->initialize()) - { - delete source; - qWarning("RGScaner: Invalid url"); - return false; - } - - if(source->ioDevice() && !source->ioDevice()->open(QIODevice::ReadOnly)) - { - delete source; - qWarning("RGScaner: [%s] unable to open input stream, error: %s", - qPrintable(name), - qPrintable(source->ioDevice()->errorString())); - return false; - } - - DecoderFactory *factory = Decoder::findByPath(source->url()); - - if(!factory) - { - qWarning("RGScaner: [%s] unable to find factory", qPrintable(name)); - delete source; - return false; - } - qDebug("RGScaner: [%s] selected decoder: %s", - qPrintable(factory->properties().shortName), qPrintable(name)); - - if(factory->properties().noInput && source->ioDevice()) - source->ioDevice()->close(); - - Decoder *decoder = factory->create(source->url(), source->ioDevice()); - if(!decoder->initialize()) - { - qWarning("RGScaner: [%s] invalid file format", qPrintable(name)); - delete source; - delete decoder; - return false; - } - m_decoder = decoder; - m_source = source; - m_user_stop = false; - m_has_values = false; - return true; -} - -void RGScaner::stop() -{ - m_mutex.lock(); - m_user_stop = true; - m_mutex.unlock(); -} - -bool RGScaner::isRunning() -{ - return m_is_running; -} - -bool RGScaner::hasValues() const -{ - return m_has_values; -} - -double RGScaner::gain() const -{ - return m_gain; -} - -double RGScaner::peak() const -{ - return m_peak; -} - -QString RGScaner::url() const -{ - return m_url; -} - -GainHandle_t *RGScaner::handle() -{ - return m_handle; -} - -void RGScaner::run() -{ - if(m_user_stop) - return; - QString name = m_url.section("/", -1); - qDebug("RGScaner: [%s] staring thread", qPrintable(name)); - m_is_running = true; - bool error = false; - - AudioParameters ap = m_decoder->audioParameters(); - Qmmp::AudioFormat format = ap.format(); - bool headroom = m_decoder->hasHeadroom(); - const int buf_size = 8192; //samples - double out_left[buf_size], out_right[buf_size]; //replay gain buffers - float float_buf[buf_size]; //float buffer - char char_buf[buf_size*ap.sampleSize()]; //char buffer - qint64 totalSamples = m_decoder->totalTime() * ap.sampleRate() * ap.channels() / 1000; - qint64 sample_counter = 0; - qint64 samples = 0; - double max = 0; - - if(m_handle) - DeinitGainAbalysis(m_handle); - InitGainAnalysis(&m_handle, ap.sampleRate()); - - forever - { - if(headroom) - { - samples = m_decoder->read(float_buf, buf_size); - - if(samples < 0) - { - error = true; - break; - } - else if(samples == 0) - break; - - if(ap.channels() == 2) - { - for(int i = 0; i < (samples >> 1); ++i) - { - out_left[i] = float_buf[i*2]*32768.0; - out_right[i] = float_buf[i*2+1]*32768.0; - max = qMax(fabs(out_left[i]), max); - max = qMax(fabs(out_right[i]), max); - } - } - else if(ap.channels() == 1) - { - for(int i = 0; i < samples; ++i) - { - out_left[i] = float_buf[i]*32768.0; - max = qMax(fabs(out_left[i]), max); - } - } - } - else - { - qint64 len = m_decoder->read(char_buf, buf_size*ap.sampleSize()); - - if(samples < 0) - { - error = true; - break; - } - else if(samples == 0) - break; - - samples = len / ap.sampleSize(); - - if(ap.channels() == 2) - { - for(int i = 0; i < (samples >> 1); ++i) - { - switch (format) - { - case Qmmp::PCM_S8: - out_left[i] = char_buf[i*2]*32768.0/128.0; - out_right[i] = char_buf[i*2+1]*32768.0/128.0; - break; - case Qmmp::PCM_S16LE: - out_left[i] = ((short *)char_buf)[i*2]; - out_right[i] = ((short *)char_buf)[i*2+1]; - break; - case Qmmp::PCM_S24LE: - out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 23)); - out_right[i] = ((qint32 *)char_buf)[i*2+1]*32768.0/((1U << 23)); - break; - case Qmmp::PCM_S32LE: - out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 31)); - out_right[i] = ((qint32 *)char_buf)[i*2+1]*32768.0/((1U << 31)); - break; - default: - break; - } - max = qMax(fabs(out_left[i]), max); - max = qMax(fabs(out_right[i]), max); - } - } - else if(ap.channels() == 1) - { - for(int i = 0; i < samples; ++i) - { - switch (format) - { - case Qmmp::PCM_S8: - out_left[i] = char_buf[i*2]*32768.0/128.0; - break; - case Qmmp::PCM_S16LE: - out_left[i] = ((short *)char_buf)[i*2]; - break; - case Qmmp::PCM_S24LE: - out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 23)); - break; - case Qmmp::PCM_S32LE: - out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 31)); - break; - default: - break; - } - max = qMax(fabs(out_left[i]), max); - } - } - } - - size_t samples_per_channel = samples >> ((ap.channels() == 2) ? 1 : 0); - - AnalyzeSamples(m_handle, out_left, out_right, samples_per_channel, ap.channels()); - sample_counter += samples; - emit progress(100 * sample_counter / totalSamples); - - m_mutex.lock(); - if(m_user_stop) - { - m_mutex.unlock(); - break; - } - m_mutex.unlock(); - } - - if(error) - { - qWarning("RGScaner: [%s] finished with error", qPrintable(name)); - } - else if(m_user_stop) - { - qDebug("RGScaner: [%s] stopped by user", qPrintable(name)); - } - else - { - m_gain = GetTitleGain(m_handle); - m_peak = max/32768.0; - emit progress(100); - qDebug("RGScaner: [%s] peak=%f, gain=%f", qPrintable(name), m_peak, m_gain); - qDebug("RGScaner: [%s] finished with success ", qPrintable(name)); - m_has_values = true; - } - deinit(); - emit finished(m_url); - m_is_running = false; -} - -void RGScaner::deinit() -{ - if(m_decoder) - { - delete m_decoder; - m_decoder = 0; - } - if(m_source) - { - delete m_source; - m_source = 0; - } -} diff --git a/src/plugins/General/rgscan/rgscaner.h b/src/plugins/General/rgscan/rgscaner.h deleted file mode 100644 index 9878389a5..000000000 --- a/src/plugins/General/rgscan/rgscaner.h +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2013 by Ilya Kotov * - * forkotov02@hotmail.ru * - * * - * 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. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef RGSCANER_H -#define RGSCANER_H - -#include -#include -#include -#include -#include -#include -#include "gain_analysis.h" - - -/** - @author Ilya Kotov -*/ - -class RGScaner : public QObject, public QRunnable -{ - Q_OBJECT -public: - explicit RGScaner(); - ~RGScaner(); - - bool prepare(const QString &url); - void stop(); - bool isRunning(); - bool hasValues() const; - double gain() const; - double peak() const; - QString url() const; - GainHandle_t *handle(); - -signals: - void progress(int percent); - void finished(const QString &url); - -private: - void run(); - void deinit(); - InputSource *m_source; - Decoder *m_decoder; - QMutex m_mutex; - bool m_user_stop, m_is_running, m_has_values; - QString m_url; - double m_gain; - double m_peak; - GainHandle_t *m_handle; - -}; - -#endif // RGSCANER_H diff --git a/src/plugins/General/rgscan/rgscanhelper.cpp b/src/plugins/General/rgscan/rgscanhelper.cpp index c668390ca..9e710d1fa 100644 --- a/src/plugins/General/rgscan/rgscanhelper.cpp +++ b/src/plugins/General/rgscan/rgscanhelper.cpp @@ -24,7 +24,6 @@ #include #include #include -#include "rgscaner.h" #include "rgscandialog.h" #include "rgscanhelper.h" diff --git a/src/plugins/General/rgscan/rgscanhelper.h b/src/plugins/General/rgscan/rgscanhelper.h index 230bb95ec..4c0c6893e 100644 --- a/src/plugins/General/rgscan/rgscanhelper.h +++ b/src/plugins/General/rgscan/rgscanhelper.h @@ -24,7 +24,7 @@ #include class QAction; -class RGScaner; +class RGScanner; /** @author Ilya Kotov diff --git a/src/plugins/General/rgscan/rgscanner.cpp b/src/plugins/General/rgscan/rgscanner.cpp new file mode 100644 index 000000000..1fed3c83c --- /dev/null +++ b/src/plugins/General/rgscan/rgscanner.cpp @@ -0,0 +1,314 @@ +/*************************************************************************** + * Copyright (C) 2013 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include "rgscanner.h" + +RGScanner::RGScanner() +{ + m_gain = 0.; + m_peak = 0.; + m_user_stop = false; + m_is_running = false; + m_has_values = false; + m_handle = 0; + m_decoder = 0; + m_source = 0; +} + +RGScanner::~RGScanner() +{ + stop(); + deinit(); + if(m_handle) + { + DeinitGainAbalysis(m_handle); + m_handle = 0; + } +} + +bool RGScanner::prepare(const QString &url) +{ + deinit(); + m_url = url; + QString name = m_url.section("/", -1); + InputSource *source = InputSource::create(url, 0); + if(!source->initialize()) + { + delete source; + qWarning("RGScaner: Invalid url"); + return false; + } + + if(source->ioDevice() && !source->ioDevice()->open(QIODevice::ReadOnly)) + { + delete source; + qWarning("RGScaner: [%s] unable to open input stream, error: %s", + qPrintable(name), + qPrintable(source->ioDevice()->errorString())); + return false; + } + + DecoderFactory *factory = Decoder::findByPath(source->url()); + + if(!factory) + { + qWarning("RGScaner: [%s] unable to find factory", qPrintable(name)); + delete source; + return false; + } + qDebug("RGScaner: [%s] selected decoder: %s", + qPrintable(factory->properties().shortName), qPrintable(name)); + + if(factory->properties().noInput && source->ioDevice()) + source->ioDevice()->close(); + + Decoder *decoder = factory->create(source->url(), source->ioDevice()); + if(!decoder->initialize()) + { + qWarning("RGScaner: [%s] invalid file format", qPrintable(name)); + delete source; + delete decoder; + return false; + } + m_decoder = decoder; + m_source = source; + m_user_stop = false; + m_has_values = false; + return true; +} + +void RGScanner::stop() +{ + m_mutex.lock(); + m_user_stop = true; + m_mutex.unlock(); +} + +bool RGScanner::isRunning() +{ + return m_is_running; +} + +bool RGScanner::hasValues() const +{ + return m_has_values; +} + +double RGScanner::gain() const +{ + return m_gain; +} + +double RGScanner::peak() const +{ + return m_peak; +} + +QString RGScanner::url() const +{ + return m_url; +} + +GainHandle_t *RGScanner::handle() +{ + return m_handle; +} + +void RGScanner::run() +{ + if(m_user_stop) + return; + QString name = m_url.section("/", -1); + qDebug("RGScaner: [%s] staring thread", qPrintable(name)); + m_is_running = true; + bool error = false; + + AudioParameters ap = m_decoder->audioParameters(); + Qmmp::AudioFormat format = ap.format(); + bool headroom = m_decoder->hasHeadroom(); + const int buf_size = 8192; //samples + double out_left[buf_size], out_right[buf_size]; //replay gain buffers + float float_buf[buf_size]; //float buffer + char char_buf[buf_size*ap.sampleSize()]; //char buffer + qint64 totalSamples = m_decoder->totalTime() * ap.sampleRate() * ap.channels() / 1000; + qint64 sample_counter = 0; + qint64 samples = 0; + double max = 0; + + if(m_handle) + DeinitGainAbalysis(m_handle); + InitGainAnalysis(&m_handle, ap.sampleRate()); + + forever + { + if(headroom) + { + samples = m_decoder->read(float_buf, buf_size); + + if(samples < 0) + { + error = true; + break; + } + else if(samples == 0) + break; + + if(ap.channels() == 2) + { + for(int i = 0; i < (samples >> 1); ++i) + { + out_left[i] = float_buf[i*2]*32768.0; + out_right[i] = float_buf[i*2+1]*32768.0; + max = qMax(fabs(out_left[i]), max); + max = qMax(fabs(out_right[i]), max); + } + } + else if(ap.channels() == 1) + { + for(int i = 0; i < samples; ++i) + { + out_left[i] = float_buf[i]*32768.0; + max = qMax(fabs(out_left[i]), max); + } + } + } + else + { + qint64 len = m_decoder->read(char_buf, buf_size*ap.sampleSize()); + + if(samples < 0) + { + error = true; + break; + } + else if(samples == 0) + break; + + samples = len / ap.sampleSize(); + + if(ap.channels() == 2) + { + for(int i = 0; i < (samples >> 1); ++i) + { + switch (format) + { + case Qmmp::PCM_S8: + out_left[i] = char_buf[i*2]*32768.0/128.0; + out_right[i] = char_buf[i*2+1]*32768.0/128.0; + break; + case Qmmp::PCM_S16LE: + out_left[i] = ((short *)char_buf)[i*2]; + out_right[i] = ((short *)char_buf)[i*2+1]; + break; + case Qmmp::PCM_S24LE: + out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 23)); + out_right[i] = ((qint32 *)char_buf)[i*2+1]*32768.0/((1U << 23)); + break; + case Qmmp::PCM_S32LE: + out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 31)); + out_right[i] = ((qint32 *)char_buf)[i*2+1]*32768.0/((1U << 31)); + break; + default: + break; + } + max = qMax(fabs(out_left[i]), max); + max = qMax(fabs(out_right[i]), max); + } + } + else if(ap.channels() == 1) + { + for(int i = 0; i < samples; ++i) + { + switch (format) + { + case Qmmp::PCM_S8: + out_left[i] = char_buf[i*2]*32768.0/128.0; + break; + case Qmmp::PCM_S16LE: + out_left[i] = ((short *)char_buf)[i*2]; + break; + case Qmmp::PCM_S24LE: + out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 23)); + break; + case Qmmp::PCM_S32LE: + out_left[i] = ((qint32 *)char_buf)[i*2]*32768.0/((1U << 31)); + break; + default: + break; + } + max = qMax(fabs(out_left[i]), max); + } + } + } + + size_t samples_per_channel = samples >> ((ap.channels() == 2) ? 1 : 0); + + AnalyzeSamples(m_handle, out_left, out_right, samples_per_channel, ap.channels()); + sample_counter += samples; + emit progress(100 * sample_counter / totalSamples); + + m_mutex.lock(); + if(m_user_stop) + { + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } + + if(error) + { + qWarning("RGScaner: [%s] finished with error", qPrintable(name)); + } + else if(m_user_stop) + { + qDebug("RGScaner: [%s] stopped by user", qPrintable(name)); + } + else + { + m_gain = GetTitleGain(m_handle); + m_peak = max/32768.0; + emit progress(100); + qDebug("RGScaner: [%s] peak=%f, gain=%f", qPrintable(name), m_peak, m_gain); + qDebug("RGScaner: [%s] finished with success ", qPrintable(name)); + m_has_values = true; + } + deinit(); + emit finished(m_url); + m_is_running = false; +} + +void RGScanner::deinit() +{ + if(m_decoder) + { + delete m_decoder; + m_decoder = 0; + } + if(m_source) + { + delete m_source; + m_source = 0; + } +} diff --git a/src/plugins/General/rgscan/rgscanner.h b/src/plugins/General/rgscan/rgscanner.h new file mode 100644 index 000000000..f302ca08b --- /dev/null +++ b/src/plugins/General/rgscan/rgscanner.h @@ -0,0 +1,71 @@ +/*************************************************************************** + * Copyright (C) 2013 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef RGSCANNER_H +#define RGSCANNER_H + +#include +#include +#include +#include +#include +#include +#include "gain_analysis.h" + + +/** + @author Ilya Kotov +*/ + +class RGScanner : public QObject, public QRunnable +{ + Q_OBJECT +public: + explicit RGScanner(); + ~RGScanner(); + + bool prepare(const QString &url); + void stop(); + bool isRunning(); + bool hasValues() const; + double gain() const; + double peak() const; + QString url() const; + GainHandle_t *handle(); + +signals: + void progress(int percent); + void finished(const QString &url); + +private: + void run(); + void deinit(); + InputSource *m_source; + Decoder *m_decoder; + QMutex m_mutex; + bool m_user_stop, m_is_running, m_has_values; + QString m_url; + double m_gain; + double m_peak; + GainHandle_t *m_handle; + +}; + +#endif // RGSCANNER_H -- cgit v1.2.3-13-gbd6f