aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/sid
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-04-27 16:03:01 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-04-27 16:03:01 +0000
commit986b284179715143736251e6507d4af089306993 (patch)
treeb9c46c3aafa324eb7f9e1f526dd48942c7ee08d2 /src/plugins/Input/sid
parentbf1c573857cae1b1c24a4a6ad8b960d78de99658 (diff)
downloadqmmp-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.cpp33
-rw-r--r--src/plugins/Input/sid/decoder_sid.h7
-rw-r--r--src/plugins/Input/sid/decodersidfactory.cpp34
-rw-r--r--src/plugins/Input/sid/sid.pro6
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 += ../../../