aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/flac/decoderflacfactory.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-06-09 21:00:38 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-06-09 21:00:38 +0000
commite9de5431a1a5e9d7808cae45c234bb5cb9fd473a (patch)
tree29809d99a1732a537c203b205b69b30b4d65dd2f /src/plugins/Input/flac/decoderflacfactory.cpp
parentce79cbc21b6559f54d11da95fef7364616c3d872 (diff)
downloadqmmp-e9de5431a1a5e9d7808cae45c234bb5cb9fd473a.tar.gz
qmmp-e9de5431a1a5e9d7808cae45c234bb5cb9fd473a.tar.bz2
qmmp-e9de5431a1a5e9d7808cae45c234bb5cb9fd473a.zip
continue optimization, fixed memory leak
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8008 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/flac/decoderflacfactory.cpp')
-rw-r--r--src/plugins/Input/flac/decoderflacfactory.cpp74
1 files changed, 43 insertions, 31 deletions
diff --git a/src/plugins/Input/flac/decoderflacfactory.cpp b/src/plugins/Input/flac/decoderflacfactory.cpp
index 0c67c7871..bf62307ab 100644
--- a/src/plugins/Input/flac/decoderflacfactory.cpp
+++ b/src/plugins/Input/flac/decoderflacfactory.cpp
@@ -68,13 +68,6 @@ Decoder *DecoderFLACFactory::create(const QString &path, QIODevice *i)
QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles)
{
- QList <TrackInfo*> list;
- TagLib::Ogg::XiphComment *tag = 0;
- TagLib::FLAC::Properties *ap = 0;
-
- TagLib::FLAC::File *flacFile = 0;
- TagLib::Ogg::FLAC::File *oggFlacFile = 0;
-
//extract metadata of the one cue track
if(path.contains("://"))
{
@@ -82,7 +75,7 @@ QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackI
filePath.remove("flac://");
filePath.remove(QRegExp("#\\d+$"));
int track = filePath.section("#", -1).toInt();
- list = createPlayList(filePath, parts, ignoredFiles);
+ QList<TrackInfo *> list = createPlayList(filePath, TrackInfo::Properties, ignoredFiles);
if (list.isEmpty() || track <= 0 || track > list.count())
{
qDeleteAll(list);
@@ -94,44 +87,65 @@ QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackI
return QList<TrackInfo *>() << info;
}
+ TrackInfo *info = new TrackInfo(path);
+
+ if(parts == TrackInfo::NoParts)
+ return QList<TrackInfo *>() << info;
+
+ TagLib::Ogg::XiphComment *tag = 0;
+ TagLib::FLAC::Properties *ap = 0;
+
+ TagLib::FLAC::File *flacFile = 0;
+ TagLib::Ogg::FLAC::File *oggFlacFile = 0;
+
TagLib::FileStream stream(QStringToFileName(path), true);
if(path.endsWith(".flac", Qt::CaseInsensitive))
{
flacFile = new TagLib::FLAC::File(&stream, TagLib::ID3v2::FrameFactory::instance());
- tag = parts ? flacFile->xiphComment() : 0;
+ tag = flacFile->xiphComment();
ap = flacFile->audioProperties();
}
else if(path.endsWith(".oga", Qt::CaseInsensitive))
{
oggFlacFile = new TagLib::Ogg::FLAC::File(&stream);
- tag = parts ? oggFlacFile->tag() : 0;
+ tag = oggFlacFile->tag();
ap = oggFlacFile->audioProperties();
}
else
- return list;
+ {
+ delete info;
+ return QList<TrackInfo *>();
+ }
- TrackInfo *info = new TrackInfo(path);
if((parts & TrackInfo::MetaData) && tag && !tag->isEmpty())
{
if (tag->fieldListMap().contains("CUESHEET"))
{
- CUEParser parser(tag->fieldListMap()["CUESHEET"].toString().toCString(true), path);
+ delete info;
+
+ QByteArray data(tag->fieldListMap()["CUESHEET"].toString().toCString(true));
+ QString diskNumber;
+
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)->setValue(Qmmp::DISCNUMBER, TStringToQString(fld.toString()));
- }
+ diskNumber = TStringToQString(fld.toString()).trimmed();
}
- list = parser.createPlayList();
- delete info;
+
if(flacFile)
delete flacFile;
if(oggFlacFile)
delete oggFlacFile;
- return list;
+
+ CUEParser parser(data, path);
+ if(!diskNumber.isEmpty())
+ {
+ for(int i = 1; i <= parser.count(); ++i)
+ parser.info(i)->setValue(Qmmp::DISCNUMBER, diskNumber);
+ }
+
+ return parser.createPlayList();
}
info->setValue(Qmmp::ALBUM, TStringToQString(tag->album()));
@@ -151,18 +165,17 @@ QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackI
info->setValue(Qmmp::DISCNUMBER, TStringToQString(fld.front()));
}
- if(ap)
+
+ if((parts & TrackInfo::Properties) && ap)
{
+ 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");
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();
@@ -176,12 +189,11 @@ QList<TrackInfo*> DecoderFLACFactory::createPlayList(const QString &path, TrackI
info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK,TStringToQString(items["REPLAYGAIN_ALBUM_PEAK"].front()));
}
- list << info;
if(flacFile)
delete flacFile;
if(oggFlacFile)
delete oggFlacFile;
- return list;
+ return QList<TrackInfo *>() << info;
}
MetaDataModel* DecoderFLACFactory::createMetaDataModel(const QString &path, QObject *parent)