aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/rgscan
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-11 08:31:25 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-11 08:31:25 +0000
commit37370fab0f1cecc947432f4ff3212bef8b2a9305 (patch)
treed954740fdd359914d9a3d4db11054230340ea2c5 /src/plugins/General/rgscan
parent098d64aab49c6862b54ff6252a077d3ef018925e (diff)
downloadqmmp-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/plugins/General/rgscan')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp81
-rw-r--r--src/plugins/General/rgscan/rgscandialog.h2
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;
};