diff options
Diffstat (limited to 'src/plugins/Input/wavpack/decoderwavpackfactory.cpp')
| -rw-r--r-- | src/plugins/Input/wavpack/decoderwavpackfactory.cpp | 77 |
1 files changed, 49 insertions, 28 deletions
diff --git a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp index 4f730232f..fb52c7ee7 100644 --- a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp +++ b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2017 by Ilya Kotov * + * Copyright (C) 2008-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -52,35 +52,35 @@ Decoder *DecoderWavPackFactory::create(const QString &p, QIODevice *) return new DecoderWavPack(p); } -QList<FileInfo *> DecoderWavPackFactory::createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredFiles) +QList<TrackInfo *> DecoderWavPackFactory::createPlayList(const QString &path, TrackInfo::Parts parts, QStringList *ignoredFiles) { - QList <FileInfo*> list; + QList<TrackInfo *> list; char err[80]; - int cue_len=0; + int cue_len = 0; //extract metadata of one cue track - if(fileName.contains("://")) + if(path.contains("://")) { - QString path = fileName; - path.remove("wvpack://"); - path.remove(QRegExp("#\\d+$")); - int track = fileName.section("#", -1).toInt(); - list = createPlayList(path, true, ignoredFiles); + QString filePath = path; + filePath.remove("wvpack://"); + filePath.remove(QRegExp("#\\d+$")); + int track = filePath.section("#", -1).toInt(); + list = createPlayList(filePath, parts, ignoredFiles); if (list.isEmpty() || track <= 0 || track > list.count()) { qDeleteAll(list); list.clear(); return list; } - FileInfo *info = list.takeAt(track - 1); + TrackInfo *info = list.takeAt(track - 1); qDeleteAll(list); - return QList<FileInfo *>() << info; + return QList<TrackInfo *>() << info; } #if defined(Q_OS_WIN) && defined(OPEN_FILE_UTF8) WavpackContext *ctx = WavpackOpenFileInput (fileName.toUtf8().constData(), err, OPEN_WVC | OPEN_TAGS | OPEN_FILE_UTF8, 0); #else - WavpackContext *ctx = WavpackOpenFileInput (fileName.toLocal8Bit().constData(), + WavpackContext *ctx = WavpackOpenFileInput (path.toLocal8Bit().constData(), err, OPEN_WVC | OPEN_TAGS, 0); #endif if (!ctx) @@ -88,15 +88,15 @@ QList<FileInfo *> DecoderWavPackFactory::createPlayList(const QString &fileName, qWarning("DecoderWavPackFactory: error: %s", err); return list; } - FileInfo *info = new FileInfo(fileName); - if (useMetaData) + 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, fileName); + CUEParser parser(value, path); list = parser.createPlayList(); delete info; info = 0; @@ -106,31 +106,52 @@ QList<FileInfo *> DecoderWavPackFactory::createPlayList(const QString &fileName, char value[200]; memset(value,0,sizeof(value)); WavpackGetTagItem (ctx, "Album", value, sizeof(value)); - info->setMetaData(Qmmp::ALBUM, QString::fromUtf8(value)); + info->setValue(Qmmp::ALBUM, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Artist", value, sizeof(value)); - info->setMetaData(Qmmp::ARTIST, QString::fromUtf8(value)); + info->setValue(Qmmp::ARTIST, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Album Artist", value, sizeof(value)); - info->setMetaData(Qmmp::ALBUMARTIST, QString::fromUtf8(value)); + info->setValue(Qmmp::ALBUMARTIST, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Comment", value, sizeof(value)); - info->setMetaData(Qmmp::COMMENT, QString::fromUtf8(value)); + info->setValue(Qmmp::COMMENT, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Genre", value, sizeof(value)); - info->setMetaData(Qmmp::GENRE, QString::fromUtf8(value)); + info->setValue(Qmmp::GENRE, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Title", value, sizeof(value)); - info->setMetaData(Qmmp::TITLE, QString::fromUtf8(value)); + info->setValue(Qmmp::TITLE, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Composer", value, sizeof(value)); - info->setMetaData(Qmmp::COMPOSER, QString::fromUtf8(value)); + info->setValue(Qmmp::COMPOSER, QString::fromUtf8(value)); WavpackGetTagItem (ctx, "Year", value, sizeof(value)); - info->setMetaData(Qmmp::YEAR, QString::fromUtf8(value).toInt()); + info->setValue(Qmmp::YEAR, QString::fromUtf8(value).toInt()); WavpackGetTagItem (ctx, "Track", value, sizeof(value)); - info->setMetaData(Qmmp::TRACK, QString::fromUtf8(value).toInt()); + info->setValue(Qmmp::TRACK, QString::fromUtf8(value).toInt()); WavpackGetTagItem (ctx, "Disc", value, sizeof(value)); - info->setMetaData(Qmmp::DISCNUMBER, QString::fromUtf8(value).toInt()); + info->setValue(Qmmp::DISCNUMBER, QString::fromUtf8(value).toInt()); } } - if (info) + if(info) { - info->setLength((int) WavpackGetNumSamples(ctx)/WavpackGetSampleRate(ctx)); + 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; } WavpackCloseFile (ctx); |
