aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
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
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')
-rw-r--r--src/plugins/Input/flac/decoderflacfactory.cpp74
-rw-r--r--src/plugins/Input/mpc/decodermpcfactory.cpp12
-rw-r--r--src/plugins/Input/mpeg/decodermpegfactory.cpp15
-rw-r--r--src/plugins/Input/mpeg/decodermpegfactory.h2
-rw-r--r--src/plugins/Input/sndfile/decodersndfilefactory.cpp16
-rw-r--r--src/plugins/Input/vorbis/decodervorbisfactory.cpp6
-rw-r--r--src/plugins/Input/vorbis/decodervorbisfactory.h2
-rw-r--r--src/plugins/Input/wavpack/decoderwavpackfactory.cpp75
8 files changed, 112 insertions, 90 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)
diff --git a/src/plugins/Input/mpc/decodermpcfactory.cpp b/src/plugins/Input/mpc/decodermpcfactory.cpp
index bc397779f..27026fb03 100644
--- a/src/plugins/Input/mpc/decodermpcfactory.cpp
+++ b/src/plugins/Input/mpc/decodermpcfactory.cpp
@@ -68,12 +68,13 @@ Decoder *DecoderMPCFactory::create(const QString &, QIODevice *i)
QList<TrackInfo *> DecoderMPCFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *)
{
TrackInfo *info = new TrackInfo(path);
+
+ if(parts == TrackInfo::NoParts)
+ return QList<TrackInfo*>() << info;
+
TagLib::FileStream stream(QStringToFileName(path), true);
TagLib::MPC::File fileRef(&stream);
- if (fileRef.audioProperties())
- info->setDuration(fileRef.audioProperties()->lengthInMilliseconds());
-
if((parts & TrackInfo::MetaData) && fileRef.APETag() && !fileRef.APETag()->isEmpty())
{
TagLib::APE::Tag *tag = fileRef.APETag();
@@ -98,11 +99,10 @@ QList<TrackInfo *> DecoderMPCFactory::createPlayList(const QString &path, TrackI
info->setValue(Qmmp::CHANNELS, fileRef.audioProperties()->channels());
info->setValue(Qmmp::BITS_PER_SAMPLE, 16);
info->setValue(Qmmp::FORMAT_NAME, QString("Musepack SV%1").arg(fileRef.audioProperties()->mpcVersion()));
+ info->setDuration(fileRef.audioProperties()->lengthInMilliseconds());
}
- QList <TrackInfo*> list;
- list << info;
- return list;
+ return QList<TrackInfo*>() << info;
}
MetaDataModel* DecoderMPCFactory::createMetaDataModel(const QString &path, QObject *parent)
diff --git a/src/plugins/Input/mpeg/decodermpegfactory.cpp b/src/plugins/Input/mpeg/decodermpegfactory.cpp
index 6c841e7f1..4c6fef295 100644
--- a/src/plugins/Input/mpeg/decodermpegfactory.cpp
+++ b/src/plugins/Input/mpeg/decodermpegfactory.cpp
@@ -197,16 +197,16 @@ Decoder *DecoderMPEGFactory::create(const QString &, QIODevice *input)
return d;
}
-QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *)
+QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *)
{
- TrackInfo *info = new TrackInfo(fileName);
- TagLib::Tag *tag = 0;
+ TrackInfo *info = new TrackInfo(path);
- TagLib::FileStream stream(QStringToFileName(fileName), true);
- TagLib::MPEG::File fileRef(&stream, TagLib::ID3v2::FrameFactory::instance());
+ if(parts == TrackInfo::NoParts)
+ return QList<TrackInfo*>() << info;
- if(fileRef.audioProperties())
- info->setDuration(fileRef.audioProperties()->lengthInMilliseconds());
+ TagLib::Tag *tag = 0;
+ TagLib::FileStream stream(QStringToFileName(path), true);
+ TagLib::MPEG::File fileRef(&stream, TagLib::ID3v2::FrameFactory::instance());
if (parts & TrackInfo::MetaData)
{
@@ -317,6 +317,7 @@ QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, T
case TagLib::MPEG::Header::Version2_5:
info->setValue(Qmmp::FORMAT_NAME, QString("MPEG-2.5 layer %1").arg(fileRef.audioProperties()->layer()));
}
+ info->setDuration(fileRef.audioProperties()->lengthInMilliseconds());
}
if(parts & TrackInfo::ReplayGainInfo)
diff --git a/src/plugins/Input/mpeg/decodermpegfactory.h b/src/plugins/Input/mpeg/decodermpegfactory.h
index 149673daa..029ca26d0 100644
--- a/src/plugins/Input/mpeg/decodermpegfactory.h
+++ b/src/plugins/Input/mpeg/decodermpegfactory.h
@@ -34,7 +34,7 @@ public:
bool canDecode(QIODevice *input) const;
const DecoderProperties properties() const;
Decoder *create(const QString &, QIODevice *input);
- QList<TrackInfo *> createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *);
+ QList<TrackInfo *> createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *);
MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0);
void showSettings(QWidget *parent);
void showAbout(QWidget *parent);
diff --git a/src/plugins/Input/sndfile/decodersndfilefactory.cpp b/src/plugins/Input/sndfile/decodersndfilefactory.cpp
index 55638b133..753cdb0d2 100644
--- a/src/plugins/Input/sndfile/decodersndfilefactory.cpp
+++ b/src/plugins/Input/sndfile/decodersndfilefactory.cpp
@@ -102,20 +102,25 @@ Decoder *DecoderSndFileFactory::create(const QString &, QIODevice *input)
QList<TrackInfo *> DecoderSndFileFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *)
{
+ TrackInfo *info = new TrackInfo(path);
+
+ if(parts == TrackInfo::NoParts)
+ return QList<TrackInfo*>() << info;
+
SF_INFO snd_info;
SNDFILE *sndfile = 0;
- memset (&snd_info, 0, sizeof(snd_info));
+ memset(&snd_info, 0, sizeof(snd_info));
snd_info.format = 0;
#ifdef Q_OS_WIN
sndfile = sf_wchar_open(reinterpret_cast<LPCWSTR>(fileName.utf16()), SFM_READ, &snd_info);
#else
sndfile = sf_open(path.toLocal8Bit().constData(), SFM_READ, &snd_info);
#endif
- if (!sndfile)
+ if(!sndfile)
+ {
+ delete info;
return QList<TrackInfo *>();
-
- TrackInfo *info = new TrackInfo(path);
- info->setDuration(int(snd_info.frames * 1000 / snd_info.samplerate));
+ }
if(parts & TrackInfo::MetaData)
{
@@ -165,6 +170,7 @@ QList<TrackInfo *> DecoderSndFileFactory::createPlayList(const QString &path, Tr
format_info.format = (snd_info.format & SF_FORMAT_TYPEMASK);
sf_command(0, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info));
info->setValue(Qmmp::FORMAT_NAME, QString::fromLatin1(format_info.name));
+ info->setDuration(int(snd_info.frames * 1000 / snd_info.samplerate));
}
sf_close(sndfile);
diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.cpp b/src/plugins/Input/vorbis/decodervorbisfactory.cpp
index 359347d1e..c04276e3f 100644
--- a/src/plugins/Input/vorbis/decodervorbisfactory.cpp
+++ b/src/plugins/Input/vorbis/decodervorbisfactory.cpp
@@ -63,14 +63,14 @@ MetaDataModel* DecoderVorbisFactory::createMetaDataModel(const QString &path, QO
return new VorbisMetaDataModel(path, parent);
}
-QList<TrackInfo *> DecoderVorbisFactory::createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *)
+QList<TrackInfo *> DecoderVorbisFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *)
{
- TrackInfo *info = new TrackInfo(fileName);
+ TrackInfo *info = new TrackInfo(path);
if(parts == TrackInfo::NoParts)
return QList<TrackInfo*>() << info;
- TagLib::FileStream stream(QStringToFileName(fileName), true);
+ TagLib::FileStream stream(QStringToFileName(path), true);
TagLib::Ogg::Vorbis::File fileRef(&stream);
if((parts & TrackInfo::MetaData) && fileRef.tag() && !fileRef.tag()->isEmpty())
diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.h b/src/plugins/Input/vorbis/decodervorbisfactory.h
index b2d13101d..e197e1873 100644
--- a/src/plugins/Input/vorbis/decodervorbisfactory.h
+++ b/src/plugins/Input/vorbis/decodervorbisfactory.h
@@ -37,7 +37,7 @@ public:
const DecoderProperties properties() const;
Decoder *create(const QString &, QIODevice *input);
MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0);
- QList<TrackInfo *> createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *);
+ QList<TrackInfo *> createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *);
QObject* showDetails(QWidget *parent, const QString &path);
void showSettings(QWidget *parent);
void showAbout(QWidget *parent);
diff --git a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
index fb52c7ee7..9ea40533a 100644
--- a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
+++ b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
@@ -54,9 +54,6 @@ Decoder *DecoderWavPackFactory::create(const QString &p, QIODevice *)
QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles)
{
- QList<TrackInfo *> list;
- char err[80];
- int cue_len = 0;
//extract metadata of one cue track
if(path.contains("://"))
{
@@ -64,7 +61,7 @@ QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, Tr
filePath.remove("wvpack://");
filePath.remove(QRegExp("#\\d+$"));
int track = filePath.section("#", -1).toInt();
- list = createPlayList(filePath, parts, ignoredFiles);
+ QList<TrackInfo *> list = createPlayList(filePath, parts, ignoredFiles);
if (list.isEmpty() || track <= 0 || track > list.count())
{
qDeleteAll(list);
@@ -76,6 +73,14 @@ QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, Tr
return QList<TrackInfo *>() << info;
}
+ TrackInfo *info = new TrackInfo(path);
+
+ if(parts == TrackInfo::NoParts)
+ return QList<TrackInfo *>() << info;
+
+ char err[80];
+ int cue_len = 0;
+
#if defined(Q_OS_WIN) && defined(OPEN_FILE_UTF8)
WavpackContext *ctx = WavpackOpenFileInput (fileName.toUtf8().constData(),
err, OPEN_WVC | OPEN_TAGS | OPEN_FILE_UTF8, 0);
@@ -86,25 +91,26 @@ QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, Tr
if (!ctx)
{
qWarning("DecoderWavPackFactory: error: %s", err);
- return list;
+ delete info;
+ return QList<TrackInfo *>();
}
- TrackInfo *info = new TrackInfo(path);
+
if(parts & TrackInfo::MetaData)
{
cue_len = WavpackGetTagItem (ctx, "cuesheet", NULL, 0);
if (cue_len)
{
- char *value = (char*)malloc (cue_len * 2 + 1);
- WavpackGetTagItem (ctx, "cuesheet", value, cue_len + 1);
- CUEParser parser(value, path);
- list = parser.createPlayList();
delete info;
- info = 0;
+ char value[cue_len + 1];
+ memset(value, 0, cue_len + 1);
+ WavpackGetTagItem(ctx, "cuesheet", value, cue_len + 1);
+ WavpackCloseFile(ctx);
+ CUEParser parser(value, path);
+ return parser.createPlayList();
}
else
{
- char value[200];
- memset(value,0,sizeof(value));
+ char value[200] = { 0 };
WavpackGetTagItem (ctx, "Album", value, sizeof(value));
info->setValue(Qmmp::ALBUM, QString::fromUtf8(value));
WavpackGetTagItem (ctx, "Artist", value, sizeof(value));
@@ -128,34 +134,31 @@ QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, Tr
}
}
- if(info)
+ if(parts & TrackInfo::Properties)
{
+ info->setValue(Qmmp::BITRATE, WavpackGetAverageBitrate(ctx, 1));
+ info->setValue(Qmmp::SAMPLERATE, WavpackGetSampleRate(ctx));
+ info->setValue(Qmmp::CHANNELS, WavpackGetNumChannels(ctx));
+ info->setValue(Qmmp::BITS_PER_SAMPLE, WavpackGetBitsPerSample(ctx));
+ info->setValue(Qmmp::FORMAT_NAME, "WavPack");
info->setDuration((qint64)WavpackGetNumSamples(ctx) * 1000 / WavpackGetSampleRate(ctx));
- if(parts & TrackInfo::Properties)
- {
- info->setValue(Qmmp::BITRATE, WavpackGetAverageBitrate(ctx, 1));
- info->setValue(Qmmp::SAMPLERATE, WavpackGetSampleRate(ctx));
- info->setValue(Qmmp::CHANNELS, WavpackGetNumChannels(ctx));
- info->setValue(Qmmp::BITS_PER_SAMPLE, WavpackGetBitsPerSample(ctx));
- info->setValue(Qmmp::FORMAT_NAME, "WavPack");
- }
+ }
- if(parts & TrackInfo::ReplayGainInfo)
- {
- char value[200] = { 0 };
- WavpackGetTagItem(ctx, "REPLAYGAIN_TRACK_GAIN", value, sizeof(value));
- info->setValue(Qmmp::REPLAYGAIN_TRACK_GAIN, value);
- WavpackGetTagItem(ctx, "REPLAYGAIN_TRACK_PEAK", value, sizeof(value));
- info->setValue(Qmmp::REPLAYGAIN_TRACK_PEAK, value);
- WavpackGetTagItem(ctx, "REPLAYGAIN_ALBUM_GAIN", value, sizeof(value));
- info->setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN, value);
- WavpackGetTagItem(ctx, "REPLAYGAIN_ALBUM_PEAK", value, sizeof(value));
- info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK, value);
- }
- list << info;
+ if(parts & TrackInfo::ReplayGainInfo)
+ {
+ char value[200] = { 0 };
+ WavpackGetTagItem(ctx, "REPLAYGAIN_TRACK_GAIN", value, sizeof(value));
+ info->setValue(Qmmp::REPLAYGAIN_TRACK_GAIN, value);
+ WavpackGetTagItem(ctx, "REPLAYGAIN_TRACK_PEAK", value, sizeof(value));
+ info->setValue(Qmmp::REPLAYGAIN_TRACK_PEAK, value);
+ WavpackGetTagItem(ctx, "REPLAYGAIN_ALBUM_GAIN", value, sizeof(value));
+ info->setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN, value);
+ WavpackGetTagItem(ctx, "REPLAYGAIN_ALBUM_PEAK", value, sizeof(value));
+ info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK, value);
}
+
WavpackCloseFile (ctx);
- return list;
+ return QList<TrackInfo *>() << info;
}
MetaDataModel* DecoderWavPackFactory::createMetaDataModel(const QString &path, QObject *parent)