diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-04-27 16:03:01 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-04-27 16:03:01 +0000 |
| commit | 986b284179715143736251e6507d4af089306993 (patch) | |
| tree | b9c46c3aafa324eb7f9e1f526dd48942c7ee08d2 /src/plugins/Input/sid | |
| parent | bf1c573857cae1b1c24a4a6ad8b960d78de99658 (diff) | |
| download | qmmp-986b284179715143736251e6507d4af089306993.tar.gz qmmp-986b284179715143736251e6507d4af089306993.tar.bz2 qmmp-986b284179715143736251e6507d4af089306993.zip | |
sid plugin: added multiple tracks support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3412 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/sid')
| -rw-r--r-- | src/plugins/Input/sid/decoder_sid.cpp | 33 | ||||
| -rw-r--r-- | src/plugins/Input/sid/decoder_sid.h | 7 | ||||
| -rw-r--r-- | src/plugins/Input/sid/decodersidfactory.cpp | 34 | ||||
| -rw-r--r-- | src/plugins/Input/sid/sid.pro | 6 |
4 files changed, 53 insertions, 27 deletions
diff --git a/src/plugins/Input/sid/decoder_sid.cpp b/src/plugins/Input/sid/decoder_sid.cpp index bcd84e56b..4d86f7f97 100644 --- a/src/plugins/Input/sid/decoder_sid.cpp +++ b/src/plugins/Input/sid/decoder_sid.cpp @@ -18,12 +18,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ - +#include <QFile> #include "decoder_sid.h" // Decoder class -DecoderSID::DecoderSID(QIODevice *input) : Decoder(input) +DecoderSID::DecoderSID(const QString &url) : Decoder() { + m_url = url; m_player = new sidplayfp(); } @@ -34,17 +35,23 @@ DecoderSID::~DecoderSID() bool DecoderSID::initialize() { - QByteArray data = input()->readAll(); + QString path = m_url; + path.remove("sid://"); + path.remove(QRegExp("#\\d+$")); + int track = m_url.section("#", -1).toInt(); + + SidTune *tune = new SidTune(0); + tune->load(qPrintable(path)); + int count = tune->getInfo()->songs(); - if(data.isEmpty()) + if(track > count || track < 1) { - qWarning("DecoderSID: error: %s", qPrintable(input()->errorString())); + qWarning("DecoderSID: track number is out of range"); + delete tune; return false; } - SidTune *tune = new SidTune(0); - tune->read((const unsigned char*)data.constData(), data.size()); - tune->selectSong(0); + tune->selectSong(track); if(!tune->getStatus()) { @@ -52,6 +59,16 @@ bool DecoderSID::initialize() return false; } + //send metadata for pseudo-protocol + const SidTuneInfo *tune_info = tune->getInfo(); + QMap<Qmmp::MetaData, QString> metadata; + metadata.insert(Qmmp::TITLE, tune_info->infoString(0)); + metadata.insert(Qmmp::ARTIST, tune_info->infoString(1)); + metadata.insert(Qmmp::COMMENT, tune_info->commentString(0)); + metadata.insert(Qmmp::TRACK, QString("%1").arg(track)); + metadata.insert(Qmmp::URL, m_url); + addMetaData(metadata); + sidbuilder *rs = new ReSIDfpBuilder("ReSIDfp builder"); rs->create(m_player->info().maxsids()); diff --git a/src/plugins/Input/sid/decoder_sid.h b/src/plugins/Input/sid/decoder_sid.h index 39e62dc4f..7d1c40b0d 100644 --- a/src/plugins/Input/sid/decoder_sid.h +++ b/src/plugins/Input/sid/decoder_sid.h @@ -28,8 +28,7 @@ #include <sidplayfp/SidConfig.h> #include <sidplayfp/builders/residfp.h> #include <sidplayfp/SidInfo.h> - -class GmeHelper; +#include <sidplayfp/SidTuneInfo.h> /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -37,7 +36,7 @@ class GmeHelper; class DecoderSID : public Decoder { public: - DecoderSID(QIODevice *input); + DecoderSID(const QString &url); virtual ~DecoderSID(); // Standard Decoder API @@ -49,7 +48,7 @@ public: private: qint64 m_totalTime; - QString m_path; + QString m_url; sidplayfp *m_player; }; diff --git a/src/plugins/Input/sid/decodersidfactory.cpp b/src/plugins/Input/sid/decodersidfactory.cpp index 5bb703c5c..50aa92c7a 100644 --- a/src/plugins/Input/sid/decodersidfactory.cpp +++ b/src/plugins/Input/sid/decodersidfactory.cpp @@ -23,6 +23,7 @@ #include <sidplayfp/SidTune.h> #include <sidplayfp/SidTuneInfo.h> #include "decoder_sid.h" +#include "sidhelper.h" #include "decodersidfactory.h" // DecoderSIDFactory @@ -56,30 +57,37 @@ const DecoderProperties DecoderSIDFactory::properties() const properties.shortName = "sid"; properties.hasAbout = true; properties.hasSettings = false; - properties.noInput = false; + properties.noInput = true; + properties.protocols << "sid"; return properties; } Decoder *DecoderSIDFactory::create(const QString &path, QIODevice *input) { - Q_UNUSED(path); - return new DecoderSID(input); + Q_UNUSED(input); + return new DecoderSID(path); } QList<FileInfo *> DecoderSIDFactory::createPlayList(const QString &fileName, bool useMetaData) { - QList <FileInfo*> list; - FileInfo *info = new FileInfo(fileName); - if(useMetaData) + SIDHelper helper; + helper.load(fileName); + QList <FileInfo*> list = helper.createPlayList(useMetaData); + if(list.isEmpty()) + return list; + if(fileName.contains("://")) //is it url? { - SidTune *tune = new SidTune(qPrintable(fileName)); - const SidTuneInfo *tune_info = tune->getInfo(); - info->setMetaData(Qmmp::TITLE, tune_info->infoString(0)); - info->setMetaData(Qmmp::ARTIST, tune_info->infoString(1)); - info->setMetaData(Qmmp::COMMENT, tune_info->commentString(0)); - delete tune; + int track = fileName.section("#", -1).toInt(); + if(track > list.count() || track < 1) + { + qDeleteAll(list); + list.clear(); + return list; + } + FileInfo *info = list.takeAt(track - 1); + qDeleteAll(list); + return QList<FileInfo *>() << info; } - list << info; return list; } diff --git a/src/plugins/Input/sid/sid.pro b/src/plugins/Input/sid/sid.pro index 17bd121b0..4d5e09c8f 100644 --- a/src/plugins/Input/sid/sid.pro +++ b/src/plugins/Input/sid/sid.pro @@ -1,9 +1,11 @@ include(../../plugins.pri) HEADERS += decodersidfactory.h \ - decoder_sid.h + decoder_sid.h \ + sidhelper.h SOURCES += decoder_sid.cpp \ - decodersidfactory.cpp + decodersidfactory.cpp \ + sidhelper.cpp TARGET = $$PLUGINS_PREFIX/Input/sid QMAKE_CLEAN = $$PLUGINS_PREFIX/Input/libsid.so INCLUDEPATH += ../../../ |
