From e9de5431a1a5e9d7808cae45c234bb5cb9fd473a Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sat, 9 Jun 2018 21:00:38 +0000 Subject: 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 --- src/plugins/Input/flac/decoderflacfactory.cpp | 74 ++++++++++++++++----------- 1 file changed, 43 insertions(+), 31 deletions(-) (limited to 'src/plugins/Input/flac/decoderflacfactory.cpp') 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 DecoderFLACFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles) { - QList 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 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 list = createPlayList(filePath, TrackInfo::Properties, ignoredFiles); if (list.isEmpty() || track <= 0 || track > list.count()) { qDeleteAll(list); @@ -94,44 +87,65 @@ QList DecoderFLACFactory::createPlayList(const QString &path, TrackI return QList() << info; } + TrackInfo *info = new TrackInfo(path); + + if(parts == TrackInfo::NoParts) + return QList() << 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 *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 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 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() << info; } MetaDataModel* DecoderFLACFactory::createMetaDataModel(const QString &path, QObject *parent) -- cgit v1.2.3-13-gbd6f