diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-11 08:31:25 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-11 08:31:25 +0000 |
| commit | 37370fab0f1cecc947432f4ff3212bef8b2a9305 (patch) | |
| tree | d954740fdd359914d9a3d4db11054230340ea2c5 /src | |
| parent | 098d64aab49c6862b54ff6252a077d3ef018925e (diff) | |
| download | qmmp-37370fab0f1cecc947432f4ff3212bef8b2a9305.tar.gz qmmp-37370fab0f1cecc947432f4ff3212bef8b2a9305.tar.bz2 qmmp-37370fab0f1cecc947432f4ff3212bef8b2a9305.zip | |
rgscan: added album peak/gain calculation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3774 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.cpp | 81 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.h | 2 |
2 files changed, 70 insertions, 13 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp index 4414c34d8..56d1f800e 100644 --- a/src/plugins/General/rgscan/rgscandialog.cpp +++ b/src/plugins/General/rgscan/rgscandialog.cpp @@ -25,10 +25,18 @@ #include <qmmpui/playlisttrack.h> #include <qmmpui/metadataformatter.h> #include <qmmpui/filedialog.h> +#include <qmmp/metadatamanager.h> #include "rgscanner.h" #include "gain_analysis.h" #include "rgscandialog.h" +struct ReplayGainInfoItem +{ + QMap<Qmmp::ReplayGainKey, double> info; + QString url; + GainHandle_t *handle; +}; + RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : QDialog(parent) { m_ui.setupUi(this); @@ -70,6 +78,7 @@ RGScanDialog::~RGScanDialog() void RGScanDialog::on_calculateButton_clicked() { + m_ui.writeButton->setEnabled(false); for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) { QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString(); @@ -117,27 +126,63 @@ void RGScanDialog::onScanFinished(QString url) qDebug("RGScanDialog: all threads finished"); QThreadPool::globalInstance()->waitForDone(); - double album_peak = 0.; - - GainHandle_t **a = (GainHandle_t **) malloc(m_scanners.count()*sizeof(GainHandle_t *)); + QMultiMap<QString, ReplayGainInfoItem*> itemGroupMap; //items grouped by album - for(int i = 0; i < m_scanners.count(); ++i) + //group by album name + foreach (RGScanner *scanner, m_scanners) { - a[i] = m_scanners.at(i)->handle(); - album_peak = qMax(m_scanners.at(i)->peak(), album_peak); + ReplayGainInfoItem *item = new ReplayGainInfoItem; + item->info[Qmmp::REPLAYGAIN_TRACK_GAIN] = scanner->gain(); + item->info[Qmmp::REPLAYGAIN_TRACK_PEAK] = scanner->peak(); + item->url = scanner->url(); + item->handle = scanner->handle(); + QString album = getAlbumName(item->url); + itemGroupMap.insert(album, item); } + //calculate album peak and gain + foreach (QString album, itemGroupMap.keys()) + { + QList<ReplayGainInfoItem*> items = itemGroupMap.values(album); + GainHandle_t **a = (GainHandle_t **) malloc(items.count()*sizeof(GainHandle_t *)); + double album_peak = 0; + for(int i = 0; i < items.count(); ++i) + { + a[i] = items[i]->handle; + album_peak = qMax(items[i]->info[Qmmp::REPLAYGAIN_TRACK_PEAK], album_peak); + } + double album_gain = GetAlbumGain(a, items.count()); + free(a); + foreach (ReplayGainInfoItem *item, items) + { + item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK] = album_peak; + item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN] = album_gain; + } + } + //clear scanners + qDeleteAll(m_scanners); + m_scanners.clear(); - double album_gain = GetAlbumGain(a, m_scanners.count()); - free(a); - + //update table + QList<ReplayGainInfoItem*> replayGainItemList = itemGroupMap.values(); for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) { - m_ui.tableWidget->setItem(i, 3, new QTableWidgetItem(tr("%1 dB").arg(album_gain))); - m_ui.tableWidget->setItem(i, 5, new QTableWidgetItem(QString::number(album_peak))); + QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString(); + foreach (ReplayGainInfoItem *item, replayGainItemList) + { + if(item->url == url) + { + double album_gain = item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]; + double album_peak = item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]; + m_ui.tableWidget->setItem(i, 3, new QTableWidgetItem(tr("%1 dB").arg(album_gain))); + m_ui.tableWidget->setItem(i, 5, new QTableWidgetItem(QString::number(album_peak))); + } + } } - qDeleteAll(m_scanners); - m_scanners.clear(); + //clear items + qDeleteAll(replayGainItemList); + replayGainItemList.clear(); + itemGroupMap.clear(); m_ui.writeButton->setEnabled(true); } @@ -172,3 +217,13 @@ RGScanner *RGScanDialog::findScannerByUrl(const QString &url) } return 0; } + +QString RGScanDialog::getAlbumName(const QString &url) +{ + QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(url); + if(infoList.isEmpty()) + return QString(); + QString album = infoList.first()->metaData(Qmmp::ALBUM); + qDeleteAll(infoList); + return album; +} diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h index eeacbb632..b83f907fb 100644 --- a/src/plugins/General/rgscan/rgscandialog.h +++ b/src/plugins/General/rgscan/rgscandialog.h @@ -23,6 +23,7 @@ #include <QDialog> #include <QStringList> +#include <qmmp/qmmp.h> #include "ui_rgscandialog.h" class QAction; @@ -48,6 +49,7 @@ private slots: private: void stop(); RGScanner *findScannerByUrl(const QString &url); + QString getAlbumName(const QString &url); Ui::RGScanDialog m_ui; QList<RGScanner *> m_scanners; }; |
