From 38295c0a56f642697cc5e055a621ef4e153d561d Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Mon, 14 Oct 2013 15:52:44 +0000 Subject: rgscan: added tag writing git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3777 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/rgscan/rgscandialog.cpp | 62 +++++++++++++++++++++++++---- src/plugins/General/rgscan/rgscandialog.h | 6 +++ 2 files changed, 60 insertions(+), 8 deletions(-) (limited to 'src') 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 #include #include +#include +#include #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 info; @@ -66,14 +70,18 @@ RGScanDialog::RGScanDialog(QList 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 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 #include #include +#include #include "ui_rgscandialog.h" class QAction; class PlayListTrack; class ConverterPreset; class RGScanner; +struct ReplayGainInfoItem; /** @author Ilya Kotov @@ -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 m_scanners; + QList m_replayGainItemList; }; #endif // RGSCANDIALOG_H -- cgit v1.2.3-13-gbd6f