diff options
Diffstat (limited to 'src/plugins/Input')
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cuemetadatamodel.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.cpp | 73 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.h | 15 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decoder_cue.cpp | 8 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decodercuefactory.cpp | 17 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decodercuefactory.h | 13 |
7 files changed, 62 insertions, 70 deletions
diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 7a99bd681..6dbbfee34 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,7 +1,7 @@ include(../../../qmmp.pri) TEMPLATE = subdirs -SUBDIRS += vorbis #cue sndfile wavpack +SUBDIRS += vorbis cue #sndfile wavpack contains(CONFIG, WITH_MAD)|contains(CONFIG, WITH_MPG123){ SUBDIRS += mpeg diff --git a/src/plugins/Input/cue/cuemetadatamodel.cpp b/src/plugins/Input/cue/cuemetadatamodel.cpp index 219b1bec3..4043a955c 100644 --- a/src/plugins/Input/cue/cuemetadatamodel.cpp +++ b/src/plugins/Input/cue/cuemetadatamodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2016 by Ilya Kotov * + * Copyright (C) 2009-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -24,7 +24,7 @@ CUEMetaDataModel::CUEMetaDataModel(const QString &url, QObject *parent) : MetaDataModel(parent) { - m_parser = new CUEParser(url); + m_parser = new CUEParser(url, TrackInfo::AllParts); if (m_parser->count() == 0) { qWarning("CUEMetaDataModel: invalid cue file"); diff --git a/src/plugins/Input/cue/cueparser.cpp b/src/plugins/Input/cue/cueparser.cpp index db3750f87..b3b393c87 100644 --- a/src/plugins/Input/cue/cueparser.cpp +++ b/src/plugins/Input/cue/cueparser.cpp @@ -31,10 +31,10 @@ #endif #include "cueparser.h" -CUEParser::CUEParser(const QString &url) +CUEParser::CUEParser(const QString &path, TrackInfo::Parts parts) { - QString fileName = url; - if(url.contains("://")) + QString fileName = path; + if(path.contains("://")) { fileName.remove("cue://"); fileName.remove(QRegExp("#\\d+$")); @@ -98,32 +98,32 @@ CUEParser::CUEParser(const QString &url) 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") { QString path = fileName; - FileInfo info("cue://" + path + 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("cue://" + 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") { @@ -147,9 +147,9 @@ CUEParser::CUEParser(const QString &url) 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()); } } file.close(); @@ -173,23 +173,25 @@ CUEParser::CUEParser(const QString &url) } } //calculate lengths + QList<TrackInfo *> f_list; for(int i = 0; i < m_tracks.count(); ++i) { - QString file_path = m_tracks[i]->file; - if((i < m_tracks.count() - 1) && (file_path == m_tracks[i+1]->file)) - m_tracks[i]->info.setLength(m_tracks[i+1]->offset - m_tracks[i]->offset); - else + if(i == 0 || m_tracks[i - 1]->file != m_tracks[i]->file) { - QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(file_path, false); - qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; - if (l > m_tracks[i]->offset) - m_tracks[i]->info.setLength(l - m_tracks[i]->offset); - else - m_tracks[i]->info.setLength(0); qDeleteAll(f_list); - f_list.clear(); + f_list = MetaDataManager::instance()->createPlayList(m_tracks[i]->file, (parts & TrackInfo::Properties) + ? TrackInfo::NoParts : TrackInfo::Properties); } + if(!f_list.isEmpty()) + m_tracks[i]->info.setValues(f_list.first()->properties()); + + if((i < m_tracks.count() - 1) && ( m_tracks[i]->file == m_tracks[i+1]->file)) + m_tracks[i]->info.setDuration(m_tracks[i+1]->offset - m_tracks[i]->offset); + else if(!f_list.isEmpty()) + m_tracks[i]->info.setDuration(qMax(0LL, f_list.first()->duration() - m_tracks[i]->offset)); } + qDeleteAll(f_list); + f_list.clear(); } CUEParser::~CUEParser() @@ -198,13 +200,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; } @@ -236,9 +237,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 @@ -246,7 +247,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; } @@ -258,7 +259,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/cue/cueparser.h b/src/plugins/Input/cue/cueparser.h index b005a190a..88d9b452b 100644 --- a/src/plugins/Input/cue/cueparser.h +++ b/src/plugins/Input/cue/cueparser.h @@ -25,7 +25,7 @@ #include <QString> #include <QStringList> #include <qmmp/qmmp.h> -#include <qmmp/fileinfo.h> +#include <qmmp/trackinfo.h> /** @@ -34,29 +34,28 @@ class CUEParser { public: - CUEParser(const QString &url); + CUEParser(const QString &path, TrackInfo::Parts parts); ~CUEParser(); - QList<FileInfo*> createPlayList(); + QList<TrackInfo*> createPlayList(); const QString filePath(int track) const; const QStringList dataFiles() 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; QString file; - QMap<Qmmp::ReplayGainKey, double> replayGain; }; - QList <CUETrack * > m_tracks; + QList <CUETrack *> m_tracks; bool m_dirty; QStringList splitLine(const QString &line); qint64 getLength(const QString &str); diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp index b25e2d631..2ba4626e5 100644 --- a/src/plugins/Input/cue/decoder_cue.cpp +++ b/src/plugins/Input/cue/decoder_cue.cpp @@ -22,7 +22,7 @@ #include <QStringList> #include <qmmp/buffer.h> #include <qmmp/output.h> -#include <qmmp/fileinfo.h> +#include <qmmp/trackinfo.h> #include <qmmp/decoderfactory.h> #include <qmmp/soundcore.h> #include "cueparser.h" @@ -58,7 +58,7 @@ DecoderCUE::~DecoderCUE() bool DecoderCUE::initialize() { - m_parser = new CUEParser(m_path); + m_parser = new CUEParser(m_path, TrackInfo::MetaData); if (m_parser->count() == 0) { qWarning("DecoderCUE: invalid cue file"); @@ -77,7 +77,7 @@ bool DecoderCUE::initialize() qWarning("DecoderCUE: unsupported file format"); return false; } - m_length = m_parser->length(m_track); + m_length = m_parser->duration(m_track); m_offset = m_parser->offset(m_track); if(!df->properties().noInput) { @@ -182,7 +182,7 @@ void DecoderCUE::next() if(m_track +1 <= m_parser->count()) { m_track++; - 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; diff --git a/src/plugins/Input/cue/decodercuefactory.cpp b/src/plugins/Input/cue/decodercuefactory.cpp index f200cf95e..1997e24c4 100644 --- a/src/plugins/Input/cue/decodercuefactory.cpp +++ b/src/plugins/Input/cue/decodercuefactory.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 * @@ -53,20 +53,19 @@ Decoder *DecoderCUEFactory::create(const QString &path, QIODevice *input) return new DecoderCUE(path); } -QList<FileInfo *> DecoderCUEFactory::createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredPaths) +QList<TrackInfo *> DecoderCUEFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredPaths) { - Q_UNUSED(useMetaData); - CUEParser parser(fileName); - if(fileName.contains("://")) + CUEParser parser(path, parts); + if(path.contains("://")) { - QList<FileInfo *> list; - int track = fileName.section("#", -1).toInt(); + QList<TrackInfo *> list; + int track = path.section("#", -1).toInt(); if (!parser.count() || track <= 0 || track > parser.count()) return list; list = parser.createPlayList(); - FileInfo *info = list.takeAt(track - 1); + TrackInfo *info = list.takeAt(track - 1); qDeleteAll(list); - return QList<FileInfo *>() << info; + return QList<TrackInfo *>() << info; } else { diff --git a/src/plugins/Input/cue/decodercuefactory.h b/src/plugins/Input/cue/decodercuefactory.h index 54cd712c5..7397cf8b7 100644 --- a/src/plugins/Input/cue/decodercuefactory.h +++ b/src/plugins/Input/cue/decodercuefactory.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 * @@ -20,16 +20,9 @@ #ifndef DECODERCUEFACTORY_H #define DECODERCUEFACTORY_H -#include <QObject> -#include <QString> -#include <QIODevice> -#include <QWidget> -#include <qmmp/decoder.h> -#include <qmmp/output.h> #include <qmmp/decoderfactory.h> -#include <qmmp/fileinfo.h> -#include <qmmp/metadatamodel.h> + class DecoderCUEFactory : public QObject, DecoderFactory { @@ -41,7 +34,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 *ignoredPaths); + QList<TrackInfo *> createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredPaths); MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0); void showSettings(QWidget *parent); void showAbout(QWidget *parent); |
