diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-06-09 21:00:38 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-06-09 21:00:38 +0000 |
| commit | e9de5431a1a5e9d7808cae45c234bb5cb9fd473a (patch) | |
| tree | 29809d99a1732a537c203b205b69b30b4d65dd2f /src/plugins/Input/flac/decoderflacfactory.cpp | |
| parent | ce79cbc21b6559f54d11da95fef7364616c3d872 (diff) | |
| download | qmmp-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.cpp | 74 |
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) |
