diff options
Diffstat (limited to 'src/plugins/General/rgscan')
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.cpp | 91 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.h | 14 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscanner.cpp | 9 |
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(); |
