diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-14 15:52:44 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-10-14 15:52:44 +0000 |
| commit | 38295c0a56f642697cc5e055a621ef4e153d561d (patch) | |
| tree | 4afb713d84dc1a3a9ba18b1dd4ff5b45bde09f11 /src | |
| parent | a7c51e611231659574e6d41785539dab7c673fd5 (diff) | |
| download | qmmp-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.cpp | 62 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.h | 6 |
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 |
