aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/cue
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/cue')
-rw-r--r--src/plugins/Input/cue/cuemetadatamodel.cpp4
-rw-r--r--src/plugins/Input/cue/cueparser.cpp73
-rw-r--r--src/plugins/Input/cue/cueparser.h15
-rw-r--r--src/plugins/Input/cue/decoder_cue.cpp8
-rw-r--r--src/plugins/Input/cue/decodercuefactory.cpp17
-rw-r--r--src/plugins/Input/cue/decodercuefactory.h13
6 files changed, 61 insertions, 69 deletions
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);