diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-24 11:54:42 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-24 11:54:42 +0000 |
| commit | 9705552640a9c340df9c8a8b3c3ce07ede56c278 (patch) | |
| tree | 33582ea7f8cd495c406e0c1365a619fdaf833d82 /src | |
| parent | 2a4e61ddc4cd272a487a2665b907071ada7ce31a (diff) | |
| download | qmmp-9705552640a9c340df9c8a8b3c3ce07ede56c278.tar.gz qmmp-9705552640a9c340df9c8a8b3c3ce07ede56c278.tar.bz2 qmmp-9705552640a9c340df9c8a8b3c3ce07ede56c278.zip | |
rgscan: added slots
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3722 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.cpp | 50 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.h | 4 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.cpp | 74 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.h | 9 |
4 files changed, 95 insertions, 42 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp index 5e8a39891..35c46502d 100644 --- a/src/plugins/General/rgscan/rgscandialog.cpp +++ b/src/plugins/General/rgscan/rgscandialog.cpp @@ -34,6 +34,8 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q m_ui.tableWidget->verticalHeader()->setResizeMode(QHeaderView::Fixed); MetaDataFormatter formatter("%p%if(%p&%t, - ,)%t - %l"); + + //FIXME remove dupliacates foreach(PlayListTrack *track , tracks) { if(track->length() == 0 || track->url().contains("://")) @@ -54,7 +56,9 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q } RGScanDialog::~RGScanDialog() -{} +{ + stop(); +} void RGScanDialog::on_calculateButton_clicked() { @@ -62,9 +66,51 @@ void RGScanDialog::on_calculateButton_clicked() { QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString(); RGScaner *scaner = new RGScaner(); - scaner->setAutoDelete(true); + m_scaners.append(scaner); scaner->prepare(url); + scaner->setAutoDelete(false); connect(scaner, SIGNAL(progress(int)), m_ui.tableWidget->cellWidget(i, 1), SLOT(setValue(int))); + connect(scaner, SIGNAL(finished(QString)), SLOT(onScanFinished(QString))); QThreadPool::globalInstance()->start(scaner); } } + +void RGScanDialog::onScanFinished(QString url) +{ + for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) + { + if(url != m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString()) + continue; + m_ui.tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(m_scaners.at(i)->gain()))); + } + + bool stopped = true; + + foreach (RGScaner *scaner, m_scaners) + { + if(scaner->isRunning()) + stopped = false; + } + + if(stopped) + { + qDebug("RGScanDialog: all threads finished"); + QThreadPool::globalInstance()->waitForDone(); + qDeleteAll(m_scaners); + m_scaners.clear(); + } +} + +void RGScanDialog::stop() +{ + if(m_scaners.isEmpty()) + return; + foreach (RGScaner *scaner, m_scaners) + { + scaner->stop(); + } + QThreadPool::globalInstance()->waitForDone(); + + qDeleteAll(m_scaners); + m_scaners.clear(); +} diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h index 4ab1492b6..b2e88dd94 100644 --- a/src/plugins/General/rgscan/rgscandialog.h +++ b/src/plugins/General/rgscan/rgscandialog.h @@ -28,6 +28,7 @@ class QAction; class PlayListTrack; class ConverterPreset; +class RGScaner; /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -41,9 +42,12 @@ public: private slots: void on_calculateButton_clicked(); + void onScanFinished(QString url); private: + void stop(); Ui::RGScanDialog m_ui; + QList<RGScaner *> m_scaners; }; #endif // RGSCANDIALOG_H diff --git a/src/plugins/General/rgscan/rgscaner.cpp b/src/plugins/General/rgscan/rgscaner.cpp index f2e5ba8b1..1fda543e0 100644 --- a/src/plugins/General/rgscan/rgscaner.cpp +++ b/src/plugins/General/rgscan/rgscaner.cpp @@ -30,36 +30,20 @@ #include <taglib/fileref.h> #include <taglib/tag.h> #include <taglib/mpegfile.h> +#include <stdio.h> +#include <stdint.h> #include "gain_analysis.h" #include "rgscaner.h" #define QStringToTString_qt4(s) TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8) -//static functions -/*static inline void s8_to_s16_2(qint8 *in, qint16 *out, qint64 samples) -{ - for(qint64 i = 0; i < samples; ++i) - out[i] = in[i] << 8; - return; -} - -static inline void s24_to_s16_2(qint32 *in, qint16 *out, qint64 samples) +RGScaner::RGScaner() { - for(qint64 i = 0; i < samples; ++i) - out[i] = in[i] >> 8; - return; + m_gain = 0.; + m_user_stop = false; + m_is_running = false; } -static inline void s32_to_s16_2(qint32 *in, qint16 *out, qint64 samples) -{ - for(qint64 i = 0; i < samples; ++i) - out[i] = in[i] >> 16; - return; -}*/ - -RGScaner::RGScaner() -{} - RGScaner::~RGScaner() { stop(); @@ -67,6 +51,7 @@ RGScaner::~RGScaner() bool RGScaner::prepare(const QString &url) { + m_url = url; InputSource *source = InputSource::create(url, 0); if(!source->initialize()) { @@ -115,32 +100,38 @@ bool RGScaner::prepare(const QString &url) void RGScaner::stop() { - /*m_mutex.lock(); + m_mutex.lock(); m_user_stop = true; m_mutex.unlock(); wait(); - m_presets.clear(); - qDeleteAll(m_inputs.values()); - m_inputs.clear(); - qDeleteAll(m_decoders); - m_decoders.clear();*/ +} + +bool RGScaner::isRunning() +{ + return m_is_running; +} + +double RGScaner::gain() +{ + return m_gain; } void RGScaner::run() { + m_is_running = true; qDebug("RGScaner: staring thread %lu", QThread::currentThreadId()); m_user_stop = false; - const int buf_size = 8192; + const int buf_size = 8192; //samples AudioParameters ap = m_decoder->audioParameters(); - Qmmp::AudioFormat format = ap.format(); - unsigned char output_buf[(format == Qmmp::PCM_S8) ? buf_size : buf_size * 2]; + //Qmmp::AudioFormat format = ap.format(); + unsigned char output_buf[buf_size]; qint64 output_at = 0; qint64 total = 0; - quint64 len = 0; + qint64 len = 0; qint64 totalSize = m_decoder->totalTime() * ap.sampleRate() * ap.channels() * ap.sampleSize() / 1000; - double out_left[8192/4]; - double out_right[8192/4]; + double out_left[buf_size/4]; + double out_right[buf_size/4]; GainHandle_t *handle = 0; @@ -170,12 +161,19 @@ void RGScaner::run() } else if (len <= 0) break; - } - qDebug("gain=%f",GetTitleGain(handle)); + m_mutex.lock(); + if(m_user_stop) + { + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } + m_gain = GetTitleGain(handle); qDebug("RGScaner: thread %ld finished", QThread::currentThreadId()); + m_is_running = false; emit progress(100); - emit finished(); + emit finished(m_url); } - diff --git a/src/plugins/General/rgscan/rgscaner.h b/src/plugins/General/rgscan/rgscaner.h index 899b55961..c9014ddd1 100644 --- a/src/plugins/General/rgscan/rgscaner.h +++ b/src/plugins/General/rgscan/rgscaner.h @@ -39,12 +39,14 @@ public: ~RGScaner(); bool prepare(const QString &url); + void stop(); + bool isRunning(); + double gain(); - void stop(); signals: void progress(int percent); - void finished(); + void finished(const QString &url); //void desriptionChanged(QString text); //void error(QString text); @@ -54,6 +56,9 @@ private: Decoder *m_decoder; QMutex m_mutex; bool m_user_stop; + bool m_is_running; + QString m_url; + double m_gain; }; |
