aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp91
-rw-r--r--src/plugins/General/rgscan/rgscandialog.h14
-rw-r--r--src/plugins/General/rgscan/rgscanner.cpp9
3 files changed, 87 insertions, 27 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp
index 88de4a58f..af7d9b7fb 100644
--- a/src/plugins/General/rgscan/rgscandialog.cpp
+++ b/src/plugins/General/rgscan/rgscandialog.cpp
@@ -28,6 +28,9 @@
#include <qmmp/metadatamanager.h>
#include <taglib/mpegfile.h>
#include <taglib/apetag.h>
+#include <taglib/flacfile.h>
+#include <taglib/xiphcomment.h>
+#include <taglib/oggflacfile.h>
#include "rgscanner.h"
#include "gain_analysis.h"
#include "rgscandialog.h"
@@ -47,25 +50,33 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q
m_ui.tableWidget->verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 2);
m_ui.tableWidget->verticalHeader()->setResizeMode(QHeaderView::Fixed);
- MetaDataFormatter formatter("%p%if(%p&%t, - ,)%t - %l");
-
- //FIXME remove dupliacates
- foreach(PlayListTrack *track , tracks)
+ QStringList paths;
+ MetaDataFormatter formatter("%if(%p&%t,%p - %t,%f) - %l");
+ foreach(PlayListTrack *track, tracks)
{
+ //skip streams
if(track->length() == 0 || track->url().contains("://"))
continue;
-
- if(!track->url().toLower().endsWith(".mp3"))
+ //skip duplicates
+ if(paths.contains(track->url()))
continue;
- QString text = formatter.parse(track);
- QTableWidgetItem *item = new QTableWidgetItem(text);
- item->setData(Qt::UserRole, track->url());
- m_ui.tableWidget->insertRow(m_ui.tableWidget->rowCount());
- m_ui.tableWidget->setItem(m_ui.tableWidget->rowCount() - 1, 0, item);
- QProgressBar *progressBar = new QProgressBar(this);
- progressBar->setRange(0, 100);
- m_ui.tableWidget->setCellWidget(m_ui.tableWidget->rowCount() - 1, 1, progressBar);
+ QString ext = track->url().section(".", -1).toLower();
+ if(ext == "mp3" || //mpeg 1 layer 3
+ ext == "flac" || //flac
+ ext == "oga") //native flac
+ {
+ paths.append(track->url());
+ QString name = formatter.parse(track);
+ QTableWidgetItem *item = new QTableWidgetItem(name);
+ item->setData(Qt::UserRole, track->url());
+ item->setData(Qt::ToolTipRole, track->url());
+ m_ui.tableWidget->insertRow(m_ui.tableWidget->rowCount());
+ m_ui.tableWidget->setItem(m_ui.tableWidget->rowCount() - 1, 0, item);
+ QProgressBar *progressBar = new QProgressBar(this);
+ progressBar->setRange(0, 100);
+ m_ui.tableWidget->setCellWidget(m_ui.tableWidget->rowCount() - 1, 1, progressBar);
+ }
}
m_ui.tableWidget->resizeColumnsToContents();
@@ -254,6 +265,34 @@ TagLib::String RGScanDialog::peakToString(double value)
return QStringToTString_qt4(QString("%1").arg(value, 0, 'f', 6));
}
+void RGScanDialog::writeAPETag(TagLib::APE::Tag *tag, ReplayGainInfoItem *item)
+{
+ 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]));
+ }
+}
+
+void RGScanDialog::writeVorbisComment(TagLib::Ogg::XiphComment *tag, ReplayGainInfoItem *item)
+{
+ if(m_ui.trackCheckBox->isChecked())
+ {
+ tag->addField("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
+ tag->addField("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ }
+ if(m_ui.albumCheckBox->isChecked())
+ {
+ tag->addField("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
+ tag->addField("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ }
+}
+
void RGScanDialog::on_writeButton_clicked()
{
if(m_replayGainItemList.isEmpty())
@@ -263,19 +302,25 @@ void RGScanDialog::on_writeButton_clicked()
foreach (ReplayGainInfoItem *item, m_replayGainItemList)
{
- TagLib::MPEG::File file(qPrintable(item->url));
- TagLib::APE::Tag *tag = file.APETag(true);
+ QString ext = item->url.section(".", -1).toLower();
- if(m_ui.trackCheckBox->isChecked())
+ if(ext == "mp3") //mpeg 1 layer 3
+ {
+ TagLib::MPEG::File file(qPrintable(item->url));
+ writeAPETag(file.APETag(true), item);
+ file.save(TagLib::MPEG::File::APE, false);
+ }
+ else if(ext == "flac") //flac
{
- tag->addValue("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
- tag->addValue("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ TagLib::FLAC::File file(qPrintable(item->url));
+ writeVorbisComment(file.xiphComment(true), item);
+ file.save();
}
- if(m_ui.albumCheckBox->isChecked())
+ else if(ext == "oga")
{
- tag->addValue("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
- tag->addValue("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ TagLib::Ogg::FLAC::File file(qPrintable(item->url));
+ writeVorbisComment(file.tag(), item);
+ file.save();
}
- file.save(TagLib::MPEG::File::APE, false);
}
}
diff --git a/src/plugins/General/rgscan/rgscandialog.h b/src/plugins/General/rgscan/rgscandialog.h
index 83dda5d84..d196959cc 100644
--- a/src/plugins/General/rgscan/rgscandialog.h
+++ b/src/plugins/General/rgscan/rgscandialog.h
@@ -33,6 +33,18 @@ class ConverterPreset;
class RGScanner;
struct ReplayGainInfoItem;
+namespace TagLib
+{
+ namespace APE
+ {
+ class Tag;
+ }
+ namespace Ogg
+ {
+ class XiphComment;
+ }
+}
+
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
*/
@@ -55,6 +67,8 @@ private:
QString getAlbumName(const QString &url);
TagLib::String gainToString(double value);
TagLib::String peakToString(double value);
+ void writeAPETag(TagLib::APE::Tag *tag, ReplayGainInfoItem *item);
+ void writeVorbisComment(TagLib::Ogg::XiphComment *tag, ReplayGainInfoItem *item);
Ui::RGScanDialog m_ui;
QList<RGScanner *> m_scanners;
QList<ReplayGainInfoItem*> m_replayGainItemList;
diff --git a/src/plugins/General/rgscan/rgscanner.cpp b/src/plugins/General/rgscan/rgscanner.cpp
index fcc9158f2..f40eeb599 100644
--- a/src/plugins/General/rgscan/rgscanner.cpp
+++ b/src/plugins/General/rgscan/rgscanner.cpp
@@ -77,8 +77,8 @@ bool RGScanner::prepare(const QString &url)
delete source;
return false;
}
- qDebug("RGScanner: [%s] selected decoder: %s",
- qPrintable(factory->properties().shortName), qPrintable(name));
+ qDebug("RGScanner: [%s] selected decoder: %s",qPrintable(name),
+ qPrintable(factory->properties().shortName));
if(factory->properties().noInput && source->ioDevice())
source->ioDevice()->close();
@@ -195,14 +195,15 @@ void RGScanner::run()
}
else
{
+
qint64 len = m_decoder->read(char_buf, buf_size*ap.sampleSize());
- if(samples < 0)
+ if(len < 0)
{
error = true;
break;
}
- else if(samples == 0)
+ else if(len == 0)
break;
samples = len / ap.sampleSize();