aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-14 15:52:44 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-10-14 15:52:44 +0000
commit38295c0a56f642697cc5e055a621ef4e153d561d (patch)
tree4afb713d84dc1a3a9ba18b1dd4ff5b45bde09f11 /src
parenta7c51e611231659574e6d41785539dab7c673fd5 (diff)
downloadqmmp-38295c0a56f642697cc5e055a621ef4e153d561d.tar.gz
qmmp-38295c0a56f642697cc5e055a621ef4e153d561d.tar.bz2
qmmp-38295c0a56f642697cc5e055a621ef4e153d561d.zip
rgscan: added tag writing
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3777 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp62
-rw-r--r--src/plugins/General/rgscan/rgscandialog.h6
2 files changed, 60 insertions, 8 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp
index 56d1f800e..7f5832127 100644
--- a/src/plugins/General/rgscan/rgscandialog.cpp
+++ b/src/plugins/General/rgscan/rgscandialog.cpp
@@ -26,10 +26,14 @@
#include <qmmpui/metadataformatter.h>
#include <qmmpui/filedialog.h>
#include <qmmp/metadatamanager.h>
+#include <taglib/mpegfile.h>
+#include <taglib/apetag.h>
#include "rgscanner.h"
#include "gain_analysis.h"
#include "rgscandialog.h"
+#define QStringToTString_qt4(s) TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8)
+
struct ReplayGainInfoItem
{
QMap<Qmmp::ReplayGainKey, double> info;
@@ -66,14 +70,18 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q
m_ui.tableWidget->resizeColumnsToContents();
m_ui.writeButton->setEnabled(false);
-
+ //read settings
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
- restoreGeometry(settings.value("RGScaner/geometry").toByteArray());
+ restoreGeometry(settings.value("RGScanner/geometry").toByteArray());
+ m_ui.trackCheckBox->setChecked(settings.value("RGScanner/write_track",true).toBool());
+ m_ui.albumCheckBox->setChecked(settings.value("RGScanner/write_album",true).toBool());
}
RGScanDialog::~RGScanDialog()
{
stop();
+ qDeleteAll(m_replayGainItemList);
+ m_replayGainItemList.clear();
}
void RGScanDialog::on_calculateButton_clicked()
@@ -161,13 +169,15 @@ void RGScanDialog::onScanFinished(QString url)
//clear scanners
qDeleteAll(m_scanners);
m_scanners.clear();
-
+ //clear previous replaygain information
+ qDeleteAll(m_replayGainItemList);
+ m_replayGainItemList.clear();
//update table
- QList<ReplayGainInfoItem*> replayGainItemList = itemGroupMap.values();
+ m_replayGainItemList = itemGroupMap.values();
for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i)
{
QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString();
- foreach (ReplayGainInfoItem *item, replayGainItemList)
+ foreach (ReplayGainInfoItem *item, m_replayGainItemList)
{
if(item->url == url)
{
@@ -180,8 +190,6 @@ void RGScanDialog::onScanFinished(QString url)
}
//clear items
- qDeleteAll(replayGainItemList);
- replayGainItemList.clear();
itemGroupMap.clear();
m_ui.writeButton->setEnabled(true);
@@ -191,7 +199,9 @@ void RGScanDialog::onScanFinished(QString url)
void RGScanDialog::reject()
{
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
- settings.setValue("RGScaner/geometry", saveGeometry());
+ settings.setValue("RGScanner/geometry", saveGeometry());
+ settings.setValue("RGScanner/write_track", m_ui.trackCheckBox->isChecked());
+ settings.setValue("RGScanner/write_album", m_ui.albumCheckBox->isChecked());
QDialog::reject();
}
@@ -227,3 +237,39 @@ QString RGScanDialog::getAlbumName(const QString &url)
qDeleteAll(infoList);
return album;
}
+
+TagLib::String RGScanDialog::gainToString(double value)
+{
+ return QStringToTString_qt4(QString("%1 dB").arg(value, 0, 'f', 2));
+}
+
+TagLib::String RGScanDialog::peakToString(double value)
+{
+ return QStringToTString_qt4(QString("%1").arg(value, 0, 'f', 6));
+}
+
+void RGScanDialog::on_writeButton_clicked()
+{
+ if(m_replayGainItemList.isEmpty())
+ return;
+
+ qDebug("RGScanDialog: writing ReplayGain values...");
+
+ foreach (ReplayGainInfoItem *item, m_replayGainItemList)
+ {
+ TagLib::MPEG::File file(qPrintable(item->url));
+ TagLib::APE::Tag *tag = file.APETag(true);
+
+ if(m_ui.trackCheckBox->isChecked())
+ {
+ tag->addValue("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
+ tag->addValue("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ }
+ if(m_ui.albumCheckBox->isChecked())
+ {
+ tag->addValue("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
+ tag->addValue("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ }
+ file.save(TagLib::MPEG::File::APE);
+ }
+}
diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h
index b83f907fb..83dda5d84 100644
--- a/src/plugins/General/rgscan/rgscandialog.h
+++ b/src/plugins/General/rgscan/rgscandialog.h
@@ -24,12 +24,14 @@
#include <QDialog>
#include <QStringList>
#include <qmmp/qmmp.h>
+#include <taglib/tstring.h>
#include "ui_rgscandialog.h"
class QAction;
class PlayListTrack;
class ConverterPreset;
class RGScanner;
+struct ReplayGainInfoItem;
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
@@ -45,13 +47,17 @@ private slots:
void on_calculateButton_clicked();
void onScanFinished(QString url);
void reject();
+ void on_writeButton_clicked();
private:
void stop();
RGScanner *findScannerByUrl(const QString &url);
QString getAlbumName(const QString &url);
+ TagLib::String gainToString(double value);
+ TagLib::String peakToString(double value);
Ui::RGScanDialog m_ui;
QList<RGScanner *> m_scanners;
+ QList<ReplayGainInfoItem*> m_replayGainItemList;
};
#endif // RGSCANDIALOG_H