aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-24 11:54:42 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-24 11:54:42 +0000
commit9705552640a9c340df9c8a8b3c3ce07ede56c278 (patch)
tree33582ea7f8cd495c406e0c1365a619fdaf833d82 /src/plugins
parent2a4e61ddc4cd272a487a2665b907071ada7ce31a (diff)
downloadqmmp-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/plugins')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp50
-rw-r--r--src/plugins/General/rgscan/rgscandialog.h4
-rw-r--r--src/plugins/General/rgscan/rgscaner.cpp74
-rw-r--r--src/plugins/General/rgscan/rgscaner.h9
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;
};