aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-10 11:30:40 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-10 11:30:40 +0000
commit32dc2e325f765da1292d255cb937c3ad02ae0774 (patch)
tree6e8d0f421011089061987eb9911783360517d9c5 /src/plugins
parentbc573bf071708d28a97be273b75d313b23e2a85a (diff)
downloadqmmp-32dc2e325f765da1292d255cb937c3ad02ae0774.tar.gz
qmmp-32dc2e325f765da1292d255cb937c3ad02ae0774.tar.bz2
qmmp-32dc2e325f765da1292d255cb937c3ad02ae0774.zip
rgscan: added error handling
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3770 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp58
-rw-r--r--src/plugins/General/rgscan/rgscandialog.h3
-rw-r--r--src/plugins/General/rgscan/rgscaner.cpp110
-rw-r--r--src/plugins/General/rgscan/rgscaner.h6
4 files changed, 121 insertions, 56 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp
index 79e213a20..57ca145f4 100644
--- a/src/plugins/General/rgscan/rgscandialog.cpp
+++ b/src/plugins/General/rgscan/rgscandialog.cpp
@@ -43,6 +43,9 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q
if(track->length() == 0 || track->url().contains("://"))
continue;
+ if(!track->url().toLower().endsWith(".mp3"))
+ continue;
+
QString text = formatter.parse(track);
QTableWidgetItem *item = new QTableWidgetItem(text);
item->setData(Qt::UserRole, track->url());
@@ -71,9 +74,15 @@ void RGScanDialog::on_calculateButton_clicked()
{
QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString();
RGScaner *scaner = new RGScaner();
- m_scaners.append(scaner);
- scaner->prepare(url);
+
+ if(!scaner->prepare(url))
+ {
+ m_ui.tableWidget->setItem(i, 2, new QTableWidgetItem(tr("Error")));
+ delete scaner;
+ continue;
+ }
scaner->setAutoDelete(false);
+ m_scanners.append(scaner);
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);
@@ -82,19 +91,24 @@ void RGScanDialog::on_calculateButton_clicked()
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(tr("%1 dB").arg(m_scaners.at(i)->gain())));
- m_ui.tableWidget->setItem(i, 4, new QTableWidgetItem(QString::number(m_scaners.at(i)->peak())));
+ RGScaner *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())));
+ m_ui.tableWidget->setItem(i, 4, new QTableWidgetItem(QString::number(scanner->peak())));
+ break;
}
bool stopped = true;
- foreach (RGScaner *scaner, m_scaners)
+ foreach (RGScaner *scanner, m_scanners)
{
- if(scaner->isRunning())
+ if(scanner->isRunning())
stopped = false;
}
@@ -105,15 +119,15 @@ void RGScanDialog::onScanFinished(QString url)
double album_peak = 0.;
- GainHandle_t **a = (GainHandle_t **) malloc(m_scaners.count()*sizeof(GainHandle_t *));
+ GainHandle_t **a = (GainHandle_t **) malloc(m_scanners.count()*sizeof(GainHandle_t *));
- for(int i = 0; i < m_scaners.count(); ++i)
+ for(int i = 0; i < m_scanners.count(); ++i)
{
- a[i] = m_scaners.at(i)->handle();
- album_peak = qMax(m_scaners.at(i)->peak(), album_peak);
+ a[i] = m_scanners.at(i)->handle();
+ album_peak = qMax(m_scanners.at(i)->peak(), album_peak);
}
- double album_gain = GetAlbumGain(a, m_scaners.count());
+ double album_gain = GetAlbumGain(a, m_scanners.count());
free(a);
for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i)
@@ -122,8 +136,8 @@ void RGScanDialog::onScanFinished(QString url)
m_ui.tableWidget->setItem(i, 5, new QTableWidgetItem(QString::number(album_peak)));
}
- qDeleteAll(m_scaners);
- m_scaners.clear();
+ qDeleteAll(m_scanners);
+ m_scanners.clear();
m_ui.writeButton->setEnabled(true);
}
@@ -138,13 +152,23 @@ void RGScanDialog::reject()
void RGScanDialog::stop()
{
- if(m_scaners.isEmpty())
+ if(m_scanners.isEmpty())
return;
- foreach (RGScaner *scaner, m_scaners)
+ foreach (RGScaner *scaner, m_scanners)
{
scaner->stop();
}
QThreadPool::globalInstance()->waitForDone();
- qDeleteAll(m_scaners);
- m_scaners.clear();
+ qDeleteAll(m_scanners);
+ m_scanners.clear();
+}
+
+RGScaner *RGScanDialog::findScannerByUrl(const QString &url)
+{
+ foreach (RGScaner *scanner, m_scanners)
+ {
+ if(scanner->url() == url)
+ return scanner;
+ }
+ return 0;
}
diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h
index 55279e59b..5db2f2008 100644
--- a/src/plugins/General/rgscan/rgscandialog.h
+++ b/src/plugins/General/rgscan/rgscandialog.h
@@ -47,8 +47,9 @@ private slots:
private:
void stop();
+ RGScaner *findScannerByUrl(const QString &url);
Ui::RGScanDialog m_ui;
- QList<RGScaner *> m_scaners;
+ QList<RGScaner *> m_scanners;
};
#endif // RGSCANDIALOG_H
diff --git a/src/plugins/General/rgscan/rgscaner.cpp b/src/plugins/General/rgscan/rgscaner.cpp
index 2f1d5cc01..203a2a7ab 100644
--- a/src/plugins/General/rgscan/rgscaner.cpp
+++ b/src/plugins/General/rgscan/rgscaner.cpp
@@ -18,10 +18,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#include <stdio.h>
-#include <stdint.h>
#include <QStringList>
-#include <QThread>
#include <math.h>
#include <qmmp/inputsourcefactory.h>
#include <qmmp/decoderfactory.h>
@@ -33,6 +30,7 @@ RGScaner::RGScaner()
m_peak = 0.;
m_user_stop = false;
m_is_running = false;
+ m_has_values = false;
m_handle = 0;
m_decoder = 0;
m_source = 0;
@@ -41,26 +39,19 @@ RGScaner::RGScaner()
RGScaner::~RGScaner()
{
stop();
+ deinit();
if(m_handle)
{
DeinitGainAbalysis(m_handle);
m_handle = 0;
}
- if(m_decoder)
- {
- delete m_decoder;
- m_decoder = 0;
- }
- if(m_source)
- {
- delete m_source;
- m_source = 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())
{
@@ -69,35 +60,33 @@ bool RGScaner::prepare(const QString &url)
return false;
}
- if(source->ioDevice())
+ if(source->ioDevice() && !source->ioDevice()->open(QIODevice::ReadOnly))
{
- if(!source->ioDevice()->open(QIODevice::ReadOnly))
- {
- delete source;
- qWarning("RGScaner: unable to open input stream, error: %s",
- qPrintable(m_source->ioDevice()->errorString()));
- return false;
- }
+ 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: unsupported file format");
+ qWarning("RGScaner: [%s] unable to find factory", qPrintable(name));
delete source;
return false;
}
- qDebug("RGScaner: selected decoder: %s",qPrintable(factory->properties().shortName));
+ 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: invalid file format");
+ qWarning("RGScaner: [%s] invalid file format", qPrintable(name));
delete source;
delete decoder;
return false;
@@ -105,6 +94,7 @@ bool RGScaner::prepare(const QString &url)
m_decoder = decoder;
m_source = source;
m_user_stop = false;
+ m_has_values = false;
return true;
}
@@ -120,6 +110,11 @@ bool RGScaner::isRunning()
return m_is_running;
}
+bool RGScaner::hasValues() const
+{
+ return m_has_values;
+}
+
double RGScaner::gain() const
{
return m_gain;
@@ -130,6 +125,11 @@ double RGScaner::peak() const
return m_peak;
}
+QString RGScaner::url() const
+{
+ return m_url;
+}
+
GainHandle_t *RGScaner::handle()
{
return m_handle;
@@ -139,9 +139,10 @@ 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;
- qDebug("RGScaner: staring thread %lu", QThread::currentThreadId());
- m_user_stop = false;
+ bool error = false;
AudioParameters ap = m_decoder->audioParameters();
Qmmp::AudioFormat format = ap.format();
@@ -165,8 +166,13 @@ void RGScaner::run()
{
samples = m_decoder->read(float_buf, buf_size);
- if(samples <= 0)
- break; //TODO add error handler
+ if(samples < 0)
+ {
+ error = true;
+ break;
+ }
+ else if(samples == 0)
+ break;
if(ap.channels() == 2)
{
@@ -191,8 +197,13 @@ void RGScaner::run()
{
qint64 len = m_decoder->read(char_buf, buf_size*ap.sampleSize());
- if(len <= 0)
- break; //TODO add error handler
+ if(samples < 0)
+ {
+ error = true;
+ break;
+ }
+ else if(samples == 0)
+ break;
samples = len / ap.sampleSize();
@@ -266,11 +277,38 @@ void RGScaner::run()
m_mutex.unlock();
}
- m_gain = GetTitleGain(m_handle);
- m_peak = max/32768.0;
- qDebug("RGScaner: peak = %f", m_peak);
- qDebug("RGScaner: thread %lu finished", QThread::currentThreadId());
- emit progress(100);
+ 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
index 79c2b058e..9878389a5 100644
--- a/src/plugins/General/rgscan/rgscaner.h
+++ b/src/plugins/General/rgscan/rgscaner.h
@@ -44,8 +44,10 @@ public:
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:
@@ -54,11 +56,11 @@ signals:
private:
void run();
+ void deinit();
InputSource *m_source;
Decoder *m_decoder;
QMutex m_mutex;
- bool m_user_stop;
- bool m_is_running;
+ bool m_user_stop, m_is_running, m_has_values;
QString m_url;
double m_gain;
double m_peak;