diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Input/flac/decoderflacfactory.cpp | 74 | ||||
| -rw-r--r-- | src/plugins/Input/mpc/decodermpcfactory.cpp | 12 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/decodermpegfactory.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/decodermpegfactory.h | 2 | ||||
| -rw-r--r-- | src/plugins/Input/sndfile/decodersndfilefactory.cpp | 16 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.cpp | 6 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.h | 2 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/decoderwavpackfactory.cpp | 75 |
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) |
