diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-05-27 09:54:53 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-05-27 09:54:53 +0000 |
| commit | c955fb39c62596a38e63f00bd802aac48f2d7db0 (patch) | |
| tree | cabdd51892af80ab35ae0af0b4ee3d8a060f9c71 /src/plugins/Input/flac | |
| parent | 5b0ac983106a2116cc46b34d57adb3689c8cd4b8 (diff) | |
| download | qmmp-c955fb39c62596a38e63f00bd802aac48f2d7db0.tar.gz qmmp-c955fb39c62596a38e63f00bd802aac48f2d7db0.tar.bz2 qmmp-c955fb39c62596a38e63f00bd802aac48f2d7db0.zip | |
ported flac plugin to new api
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7962 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/flac')
| -rw-r--r-- | src/plugins/Input/flac/cueparser.cpp | 70 | ||||
| -rw-r--r-- | src/plugins/Input/flac/cueparser.h | 17 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoderflacfactory.cpp | 106 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoderflacfactory.h | 11 | ||||
| -rw-r--r-- | src/plugins/Input/flac/flac.pro | 6 | ||||
| -rw-r--r-- | src/plugins/Input/flac/replaygainreader.cpp | 74 | ||||
| -rw-r--r-- | src/plugins/Input/flac/replaygainreader.h | 44 |
8 files changed, 114 insertions, 229 deletions
diff --git a/src/plugins/Input/flac/cueparser.cpp b/src/plugins/Input/flac/cueparser.cpp index 4f248df32..405ce4d6a 100644 --- a/src/plugins/Input/flac/cueparser.cpp +++ b/src/plugins/Input/flac/cueparser.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2017 by Ilya Kotov * + * Copyright (C) 2008-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -28,12 +28,12 @@ #include <qmmp/metadatamanager.h> #include "cueparser.h" -CUEParser::CUEParser(const QByteArray &array, const QString &fileName) +CUEParser::CUEParser(const QByteArray &array, const QString &path) { QString album, genre, date, comment; QTextStream textStream (array); textStream.setCodec("UTF-8"); - m_filePath = fileName; + m_filePath = path; QString artist; double album_peak = 0.0, album_gain = 0.0; while (!textStream.atEnd()) @@ -48,31 +48,31 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) if(m_tracks.isEmpty()) artist = words[1]; else - m_tracks.last()->info.setMetaData(Qmmp::ARTIST, words[1]); + m_tracks.last()->info.setValue(Qmmp::ARTIST, words[1]); } else if (words[0] == "TITLE") { if(m_tracks.isEmpty()) album = words[1]; else - m_tracks.last()->info.setMetaData(Qmmp::TITLE, words[1]); + m_tracks.last()->info.setValue(Qmmp::TITLE, words[1]); } else if (words[0] == "TRACK") { - FileInfo info("flac://" + fileName + QString("#%1").arg(words[1].toInt())); - info.setMetaData(Qmmp::TRACK, words[1].toInt()); - info.setMetaData(Qmmp::ALBUM, album); - info.setMetaData(Qmmp::GENRE, genre); - info.setMetaData(Qmmp::YEAR, date); - info.setMetaData(Qmmp::COMMENT, comment); - info.setMetaData(Qmmp::ARTIST, artist); - info.setMetaData(Qmmp::ALBUMARTIST, artist); + TrackInfo info("flac://" + path + QString("#%1").arg(words[1].toInt())); + info.setValue(Qmmp::TRACK, words[1].toInt()); + info.setValue(Qmmp::ALBUM, album); + info.setValue(Qmmp::GENRE, genre); + info.setValue(Qmmp::YEAR, date); + info.setValue(Qmmp::COMMENT, comment); + info.setValue(Qmmp::ARTIST, artist); + info.setValue(Qmmp::ALBUMARTIST, artist); + info.setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN, album_gain); + info.setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK, album_peak); m_tracks << new CUETrack; m_tracks.last()->info = info; m_tracks.last()->offset = 0; - m_tracks.last()->replayGain.insert(Qmmp::REPLAYGAIN_ALBUM_GAIN, album_gain); - m_tracks.last()->replayGain.insert(Qmmp::REPLAYGAIN_ALBUM_PEAK, album_peak); } else if (words[0] == "INDEX" && words[1] == "01") { @@ -81,7 +81,7 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) m_tracks.last()->offset = getLength(words[2]); int c = m_tracks.count(); if(c > 1) - m_tracks[c - 2]->info.setLength(m_tracks[c - 1]->offset - m_tracks[c - 2]->offset); + m_tracks[c - 2]->info.setDuration(m_tracks[c - 1]->offset - m_tracks[c - 2]->offset); } else if (words[0] == "REM") { @@ -98,9 +98,9 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) else if (words[1] == "REPLAYGAIN_ALBUM_PEAK") album_peak = words[2].toDouble(); else if (words[1] == "REPLAYGAIN_TRACK_GAIN" && !m_tracks.isEmpty()) - m_tracks.last()->replayGain.insert(Qmmp::REPLAYGAIN_TRACK_GAIN, words[2].toDouble()); + m_tracks.last()->info.setValue(Qmmp::REPLAYGAIN_TRACK_GAIN, words[2].toDouble()); else if (words[1] == "REPLAYGAIN_TRACK_PEAK" && !m_tracks.isEmpty()) - m_tracks.last()->replayGain.insert(Qmmp::REPLAYGAIN_TRACK_PEAK, words[2].toDouble()); + m_tracks.last()->info.setValue(Qmmp::REPLAYGAIN_TRACK_PEAK, words[2].toDouble()); } } if(m_tracks.isEmpty()) @@ -108,13 +108,18 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) qWarning("CUEParser: invalid cue file"); return; } - //calculate last item length - QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(m_filePath, false); - qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; - if (l > m_tracks.last()->offset) - m_tracks.last()->info.setLength(l - m_tracks.last()->offset); - else - m_tracks.last()->info.setLength(0); + + QList<TrackInfo *> f_list = MetaDataManager::instance()->createPlayList(m_filePath, TrackInfo::Properties); + if(!f_list.isEmpty()) + { + //calculate last item length + m_tracks.last()->info.setDuration(qMax(0LL, f_list.first()->duration() - m_tracks.last()->offset)); + //add properties + foreach(CUETrack *cueTrack, m_tracks) + cueTrack->info.setValues(f_list.first()->properties()); + qDeleteAll(f_list); + f_list.clear(); + } } CUEParser::~CUEParser() @@ -123,13 +128,12 @@ CUEParser::~CUEParser() m_tracks.clear(); } -QList<FileInfo*> CUEParser::createPlayList() +QList<TrackInfo*> CUEParser::createPlayList() { - QList<FileInfo*> list; + QList<TrackInfo*> list; foreach(CUETrack *track, m_tracks) { - list << new FileInfo(track->info); - list.last()->setLength(track->info.length()/1000); + list << new TrackInfo(track->info); } return list; } @@ -144,9 +148,9 @@ qint64 CUEParser::offset(int track) const return m_tracks.at(track - 1)->offset; } -qint64 CUEParser::length(int track) const +qint64 CUEParser::duration(int track) const { - return m_tracks.at(track - 1)->info.length(); + return m_tracks.at(track - 1)->info.duration(); } int CUEParser::count() const @@ -154,7 +158,7 @@ int CUEParser::count() const return m_tracks.count(); } -FileInfo *CUEParser::info(int track) +TrackInfo *CUEParser::info(int track) { return &m_tracks.at(track - 1)->info; } @@ -166,7 +170,7 @@ const QString CUEParser::trackURL(int track) const const QMap<Qmmp::ReplayGainKey, double> CUEParser::replayGain(int track) const { - return m_tracks.at(track - 1)->replayGain; + return m_tracks.at(track - 1)->info.replayGainInfo(); } QStringList CUEParser::splitLine(const QString &line) diff --git a/src/plugins/Input/flac/cueparser.h b/src/plugins/Input/flac/cueparser.h index 676bef0aa..e173aee58 100644 --- a/src/plugins/Input/flac/cueparser.h +++ b/src/plugins/Input/flac/cueparser.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2016 by Ilya Kotov * + * Copyright (C) 2008-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -26,7 +26,7 @@ #include <QStringList> #include <QUrl> #include <qmmp/qmmp.h> -#include <qmmp/fileinfo.h> +#include <qmmp/trackinfo.h> /** @@ -35,27 +35,26 @@ class CUEParser { public: - CUEParser(const QByteArray &array, const QString &fileName); + CUEParser(const QByteArray &array, const QString &path); ~CUEParser(); - QList<FileInfo*> createPlayList(); + QList<TrackInfo *> createPlayList(); const QString filePath() const; qint64 offset(int track) const; - qint64 length(int track) const; + qint64 duration(int track) const; int count() const; - FileInfo *info(int track); + TrackInfo *info(int track); const QString trackURL(int track) const; const QMap<Qmmp::ReplayGainKey, double> replayGain(int track) const; private: struct CUETrack { - FileInfo info; + TrackInfo info; qint64 offset; - QMap<Qmmp::ReplayGainKey, double> replayGain; }; - QList <CUETrack * > m_tracks; + QList <CUETrack *> m_tracks; QStringList splitLine(const QString &line); qint64 getLength(const QString &str); QString m_filePath; diff --git a/src/plugins/Input/flac/decoder_flac.cpp b/src/plugins/Input/flac/decoder_flac.cpp index 395b0eb6e..29bd4b119 100644 --- a/src/plugins/Input/flac/decoder_flac.cpp +++ b/src/plugins/Input/flac/decoder_flac.cpp @@ -34,7 +34,6 @@ #include <QIODevice> #include <FLAC/all.h> #include <stdint.h> -#include "replaygainreader.h" #include "cueparser.h" #include "decoder_flac.h" @@ -325,8 +324,7 @@ bool DecoderFLAC::initialize() TagLib::StringList fld = xiph_comment->fieldListMap()["DISCNUMBER"]; for(int i = 1; i <= m_parser->count(); i++) { - m_parser->info(i)->setMetaData(Qmmp::DISCNUMBER, - QString::fromUtf8(fld.toString().toCString(true)).trimmed()); + m_parser->info(i)->setValue(Qmmp::DISCNUMBER, TStringToQString(fld.toString())); } } QMap<Qmmp::MetaData, QString> metaData = m_parser->info(m_track)->metaData(); @@ -451,15 +449,10 @@ bool DecoderFLAC::initialize() default: return false; } - if(!m_path.contains("://")) - { - ReplayGainReader rg(m_path); - setReplayGainInfo(rg.replayGainInfo()); - } if(m_parser) { - m_length = m_parser->length(m_track); + m_length = m_parser->duration(m_track); m_offset = m_parser->offset(m_track); length_in_bytes = audioParameters().sampleRate() * audioParameters().frameSize() * m_length/1000; @@ -574,8 +567,8 @@ void DecoderFLAC::next() if(m_parser && m_track +1 <= m_parser->count()) { m_track++; - m_offset = m_parser->length(m_track); - m_length = m_parser->length(m_track); + m_offset = m_parser->duration(m_track); + m_length = m_parser->duration(m_track); length_in_bytes = audioParameters().sampleRate() * audioParameters().channels() * audioParameters().sampleSize() * m_length/1000; diff --git a/src/plugins/Input/flac/decoderflacfactory.cpp b/src/plugins/Input/flac/decoderflacfactory.cpp index 82332d83c..0be3739b0 100644 --- a/src/plugins/Input/flac/decoderflacfactory.cpp +++ b/src/plugins/Input/flac/decoderflacfactory.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2016 by Ilya Kotov * + * Copyright (C) 2008-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -66,9 +66,9 @@ Decoder *DecoderFLACFactory::create(const QString &path, QIODevice *i) return new DecoderFLAC(path, i); } -QList<FileInfo *> DecoderFLACFactory::createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredFiles) +QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles) { - QList <FileInfo*> list; + QList <TrackInfo*> list; TagLib::Ogg::XiphComment *tag = 0; TagLib::FLAC::Properties *ap = 0; @@ -76,67 +76,53 @@ QList<FileInfo *> DecoderFLACFactory::createPlayList(const QString &fileName, bo TagLib::Ogg::FLAC::File *oggFlacFile = 0; //extract metadata of the one cue track - if(fileName.contains("://")) + if(path.contains("://")) { - QString path = fileName; + QString path = path; path.remove("flac://"); path.remove(QRegExp("#\\d+$")); - int track = fileName.section("#", -1).toInt(); - list = createPlayList(path, true, ignoredFiles); + int track = path.section("#", -1).toInt(); + list = createPlayList(path, parts, ignoredFiles); if (list.isEmpty() || track <= 0 || track > list.count()) { qDeleteAll(list); list.clear(); return list; } - FileInfo *info = list.takeAt(track - 1); + TrackInfo *info = list.takeAt(track - 1); qDeleteAll(list); - return QList<FileInfo *>() << info; + return QList<TrackInfo *>() << info; } - TagLib::FileStream stream(QStringToFileName(fileName), true); + TagLib::FileStream stream(QStringToFileName(path), true); - if(fileName.endsWith(".flac", Qt::CaseInsensitive)) + if(path.endsWith(".flac", Qt::CaseInsensitive)) { flacFile = new TagLib::FLAC::File(&stream, TagLib::ID3v2::FrameFactory::instance()); - tag = useMetaData ? flacFile->xiphComment() : 0; + tag = parts ? flacFile->xiphComment() : 0; ap = flacFile->audioProperties(); } - else if(fileName.endsWith(".oga", Qt::CaseInsensitive)) + else if(path.endsWith(".oga", Qt::CaseInsensitive)) { oggFlacFile = new TagLib::Ogg::FLAC::File(&stream); - tag = useMetaData ? oggFlacFile->tag() : 0; + tag = parts ? oggFlacFile->tag() : 0; ap = oggFlacFile->audioProperties(); } else return list; - FileInfo *info = new FileInfo(fileName); - if (tag && !tag->isEmpty()) + TrackInfo *info = new TrackInfo(path); + if(tag && !tag->isEmpty()) { - info->setMetaData(Qmmp::ALBUM, - QString::fromUtf8(tag->album().toCString(true)).trimmed()); - info->setMetaData(Qmmp::ARTIST, - QString::fromUtf8(tag->artist().toCString(true)).trimmed()); - info->setMetaData(Qmmp::COMMENT, - QString::fromUtf8(tag->comment().toCString(true)).trimmed()); - info->setMetaData(Qmmp::GENRE, - QString::fromUtf8(tag->genre().toCString(true)).trimmed()); - info->setMetaData(Qmmp::TITLE, - QString::fromUtf8(tag->title().toCString(true)).trimmed()); - info->setMetaData(Qmmp::YEAR, tag->year()); - info->setMetaData(Qmmp::TRACK, tag->track()); - if (tag->fieldListMap().contains("CUESHEET")) { - CUEParser parser(tag->fieldListMap()["CUESHEET"].toString().toCString(true), fileName); + CUEParser parser(tag->fieldListMap()["CUESHEET"].toString().toCString(true), path); if(tag->contains("DISCNUMBER") && !tag->fieldListMap()["DISCNUMBER"].isEmpty()) { TagLib::StringList fld = tag->fieldListMap()["DISCNUMBER"]; for(int i = 1; i <= parser.count(); i++) { - parser.info(i)->setMetaData(Qmmp::DISCNUMBER, - QString::fromUtf8(fld.toString().toCString(true)).trimmed()); + parser.info(i)->setValue(Qmmp::DISCNUMBER, TStringToQString(fld.toString())); } } list = parser.createPlayList(); @@ -148,20 +134,50 @@ QList<FileInfo *> DecoderFLACFactory::createPlayList(const QString &fileName, bo return list; } - //additional metadata - TagLib::StringList fld; - if(!(fld = tag->fieldListMap()["ALBUMARTIST"]).isEmpty()) - info->setMetaData(Qmmp::ALBUMARTIST, - QString::fromUtf8(fld.front().toCString(true)).trimmed()); - if(!(fld = tag->fieldListMap()["COMPOSER"]).isEmpty()) - info->setMetaData(Qmmp::COMPOSER, - QString::fromUtf8(fld.front().toCString(true)).trimmed()); - if(!(fld = tag->fieldListMap()["DISCNUMBER"]).isEmpty()) - info->setMetaData(Qmmp::DISCNUMBER, - QString::fromUtf8(fld.front().toCString(true)).trimmed()); + if(parts & TrackInfo::MetaData) + { + info->setValue(Qmmp::ALBUM, TStringToQString(tag->album())); + info->setValue(Qmmp::ARTIST, TStringToQString(tag->artist())); + info->setValue(Qmmp::COMMENT, TStringToQString(tag->comment())); + info->setValue(Qmmp::GENRE, TStringToQString(tag->genre())); + info->setValue(Qmmp::TITLE, TStringToQString(tag->title())); + info->setValue(Qmmp::YEAR, tag->year()); + info->setValue(Qmmp::TRACK, tag->track()); + //additional metadata + TagLib::StringList fld; + if(!(fld = tag->fieldListMap()["ALBUMARTIST"]).isEmpty()) + info->setValue(Qmmp::ALBUMARTIST, TStringToQString(fld.front())); + if(!(fld = tag->fieldListMap()["COMPOSER"]).isEmpty()) + info->setValue(Qmmp::COMPOSER, TStringToQString(fld.front())); + if(!(fld = tag->fieldListMap()["DISCNUMBER"]).isEmpty()) + info->setValue(Qmmp::DISCNUMBER, TStringToQString(fld.front())); + } } if(ap) - info->setLength(ap->length()); + { + info->setDuration(ap->lengthInMilliseconds()); + if(parts & TrackInfo::Properties) + { + info->setValue(Qmmp::BITRATE, ap->bitrate()); + info->setValue(Qmmp::SAMPLERATE, ap->sampleRate()); + info->setValue(Qmmp::CHANNELS, ap->channels()); + info->setValue(Qmmp::BITS_PER_SAMPLE, ap->bitsPerSample()); + info->setValue(Qmmp::FORMAT_NAME, flacFile ? "FLAC" : "Ogg FLAC"); + } + } + if((parts & TrackInfo::ReplayGainInfo) && tag && !tag->isEmpty()) + { + TagLib::Ogg::FieldListMap items = tag->fieldListMap(); + if (items.contains("REPLAYGAIN_TRACK_GAIN")) + info->setValue(Qmmp::REPLAYGAIN_TRACK_GAIN,TStringToQString(items["REPLAYGAIN_TRACK_GAIN"].front())); + if (items.contains("REPLAYGAIN_TRACK_PEAK")) + info->setValue(Qmmp::REPLAYGAIN_TRACK_PEAK,TStringToQString(items["REPLAYGAIN_TRACK_PEAK"].front())); + if (items.contains("REPLAYGAIN_ALBUM_GAIN")) + info->setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN,TStringToQString(items["REPLAYGAIN_ALBUM_GAIN"].front())); + if (items.contains("REPLAYGAIN_ALBUM_PEAK")) + info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK,TStringToQString(items["REPLAYGAIN_ALBUM_PEAK"].front())); + } + list << info; if(flacFile) delete flacFile; @@ -170,7 +186,7 @@ QList<FileInfo *> DecoderFLACFactory::createPlayList(const QString &fileName, bo return list; } -MetaDataModel*DecoderFLACFactory::createMetaDataModel(const QString &path, QObject *parent) +MetaDataModel* DecoderFLACFactory::createMetaDataModel(const QString &path, QObject *parent) { if (!path.contains("://") || path.startsWith("flac://")) return new FLACMetaDataModel(path, parent); diff --git a/src/plugins/Input/flac/decoderflacfactory.h b/src/plugins/Input/flac/decoderflacfactory.h index 9e16e7027..ddc0526a3 100644 --- a/src/plugins/Input/flac/decoderflacfactory.h +++ b/src/plugins/Input/flac/decoderflacfactory.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2016 by Ilya Kotov * + * Copyright (C) 2006-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -20,13 +20,6 @@ #ifndef DECODERFLACFACTORY_H #define DECODERFLACFACTORY_H -#include <QObject> -#include <QString> -#include <QIODevice> -#include <QWidget> - -#include <qmmp/decoder.h> -#include <qmmp/output.h> #include <qmmp/decoderfactory.h> class DecoderFLACFactory : public QObject, @@ -40,7 +33,7 @@ public: bool canDecode(QIODevice *input) const; const DecoderProperties properties() const; Decoder *create(const QString &, QIODevice *); - QList<FileInfo *> createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredFiles); + QList<TrackInfo*> createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles); MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0); void showSettings(QWidget *parent); void showAbout(QWidget *parent); diff --git a/src/plugins/Input/flac/flac.pro b/src/plugins/Input/flac/flac.pro index 01285ec27..70c2c7280 100644 --- a/src/plugins/Input/flac/flac.pro +++ b/src/plugins/Input/flac/flac.pro @@ -5,14 +5,12 @@ TARGET = $$PLUGINS_PREFIX/Input/flac HEADERS += decoderflacfactory.h \ decoder_flac.h \ cueparser.h \ - flacmetadatamodel.h \ - replaygainreader.h + flacmetadatamodel.h SOURCES += decoder_flac.cpp \ decoderflacfactory.cpp \ cueparser.cpp \ - flacmetadatamodel.cpp \ - replaygainreader.cpp + flacmetadatamodel.cpp RESOURCES = translations/translations.qrc diff --git a/src/plugins/Input/flac/replaygainreader.cpp b/src/plugins/Input/flac/replaygainreader.cpp deleted file mode 100644 index 88d57cd13..000000000 --- a/src/plugins/Input/flac/replaygainreader.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2009-2016 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include <QtGlobal> -#include <taglib/tag.h> -#include <taglib/fileref.h> -#include <taglib/flacfile.h> -#include <taglib/oggflacfile.h> -#include <taglib/tfilestream.h> -#include <taglib/id3v2framefactory.h> -#include "replaygainreader.h" - -ReplayGainReader::ReplayGainReader(const QString &path) -{ - TagLib::FileStream stream(QStringToFileName(path), true); - if(path.endsWith(".flac", Qt::CaseInsensitive)) - { - TagLib::FLAC::File fileRef(&stream, TagLib::ID3v2::FrameFactory::instance()); - if(fileRef.xiphComment()) - readVorbisComment(fileRef.xiphComment()); - } - else if(path.endsWith(".oga", Qt::CaseInsensitive)) - { - TagLib::Ogg::FLAC::File fileRef(&stream); - if(fileRef.tag()) - readVorbisComment(fileRef.tag()); - } -} - -QMap <Qmmp::ReplayGainKey, double> ReplayGainReader::replayGainInfo() const -{ - return m_values; -} - -void ReplayGainReader::readVorbisComment(TagLib::Ogg::XiphComment *comment) -{ - TagLib::Ogg::FieldListMap items = comment->fieldListMap(); - if (items.contains("REPLAYGAIN_TRACK_GAIN")) - setValue(Qmmp::REPLAYGAIN_TRACK_GAIN,TStringToQString(items["REPLAYGAIN_TRACK_GAIN"].front())); - if (items.contains("REPLAYGAIN_TRACK_PEAK")) - setValue(Qmmp::REPLAYGAIN_TRACK_PEAK,TStringToQString(items["REPLAYGAIN_TRACK_PEAK"].front())); - if (items.contains("REPLAYGAIN_ALBUM_GAIN")) - setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN,TStringToQString(items["REPLAYGAIN_ALBUM_GAIN"].front())); - if (items.contains("REPLAYGAIN_ALBUM_PEAK")) - setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK,TStringToQString(items["REPLAYGAIN_ALBUM_PEAK"].front())); -} - -void ReplayGainReader::setValue(Qmmp::ReplayGainKey key, QString value) -{ - value.remove(" dB"); - if(value.isEmpty()) - return; - bool ok; - double v = value.toDouble(&ok); - if(ok) - m_values[key] = v; -} diff --git a/src/plugins/Input/flac/replaygainreader.h b/src/plugins/Input/flac/replaygainreader.h deleted file mode 100644 index 75f2037ba..000000000 --- a/src/plugins/Input/flac/replaygainreader.h +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2009 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef REPLAYGAINREADER_H -#define REPLAYGAINREADER_H - -#include <QMap> -#include <QString> -#include <taglib/xiphcomment.h> -#include <qmmp/qmmp.h> - -/** - @author Ilya Kotov <forkotov02@ya.ru> -*/ -class ReplayGainReader -{ -public: - ReplayGainReader(const QString &path); - QMap <Qmmp::ReplayGainKey, double> replayGainInfo() const; - -private: - void readVorbisComment(TagLib::Ogg::XiphComment *comment); - void setValue(Qmmp::ReplayGainKey key, QString value); - QMap <Qmmp::ReplayGainKey, double> m_values; -}; - -#endif // REPLAYGAINREADER_H |
