diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-10 11:30:40 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-10 11:30:40 +0000 |
| commit | 32dc2e325f765da1292d255cb937c3ad02ae0774 (patch) | |
| tree | 6e8d0f421011089061987eb9911783360517d9c5 /src/plugins/General/rgscan | |
| parent | bc573bf071708d28a97be273b75d313b23e2a85a (diff) | |
| download | qmmp-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/General/rgscan')
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.cpp | 58 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.h | 3 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.cpp | 110 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.h | 6 |
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; |
