aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/cue
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-10-10 08:42:15 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-10-10 08:42:15 +0000
commit45117f6d2f2ccfb47af840d4416f43607d83d518 (patch)
treeee3e2b99914fa6907ce7e1173e1fc87575fe8a37 /src/plugins/Input/cue
parent0bb73fcbfda56e4cb064a7bc1ceda89312087f3d (diff)
downloadqmmp-45117f6d2f2ccfb47af840d4416f43607d83d518.tar.gz
qmmp-45117f6d2f2ccfb47af840d4416f43607d83d518.tar.bz2
qmmp-45117f6d2f2ccfb47af840d4416f43607d83d518.zip
cue sheet support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@575 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/cue')
-rw-r--r--src/plugins/Input/cue/CMakeLists.txt66
-rw-r--r--src/plugins/Input/cue/cue.pro36
-rw-r--r--src/plugins/Input/cue/cueparser.cpp173
-rw-r--r--src/plugins/Input/cue/cueparser.h57
-rw-r--r--src/plugins/Input/cue/decoder_cue.cpp208
-rw-r--r--src/plugins/Input/cue/decoder_cue.h82
-rw-r--r--src/plugins/Input/cue/decodercuefactory.cpp91
-rw-r--r--src/plugins/Input/cue/decodercuefactory.h51
8 files changed, 764 insertions, 0 deletions
diff --git a/src/plugins/Input/cue/CMakeLists.txt b/src/plugins/Input/cue/CMakeLists.txt
new file mode 100644
index 000000000..b27497e1f
--- /dev/null
+++ b/src/plugins/Input/cue/CMakeLists.txt
@@ -0,0 +1,66 @@
+project(libcue)
+
+cmake_minimum_required(VERSION 2.4.7)
+
+if(COMMAND cmake_policy)
+cmake_policy(SET CMP0003 NEW)
+endif(COMMAND cmake_policy)
+
+
+# qt plugin
+ADD_DEFINITIONS( -Wall )
+ADD_DEFINITIONS(${QT_DEFINITIONS})
+ADD_DEFINITIONS(-DQT_PLUGIN)
+ADD_DEFINITIONS(-DQT_NO_DEBUG)
+ADD_DEFINITIONS(-DQT_SHARED)
+ADD_DEFINITIONS(-DQT_THREAD)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+SET(QT_INCLUDES
+ ${QT_INCLUDES}
+ ${CMAKE_CURRENT_BINARY_DIR}/../../../
+)
+
+# libqmmp
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../)
+link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp)
+
+
+SET(libcue_SRCS
+ decoder_cue.cpp
+ decodercuefactory.cpp
+# detailsdialog.cpp
+ cueparser.cpp
+)
+
+SET(libcue_MOC_HDRS
+ decodercuefactory.h
+ decoder_cue.h
+# detailsdialog.h
+ cueparser.h
+)
+
+#SET(libcue_RCCS translations/translations.qrc)
+
+QT4_ADD_RESOURCES(libcue_RCC_SRCS ${libcue_RCCS})
+
+QT4_WRAP_CPP(libcue_MOC_SRCS ${libcue_MOC_HDRS})
+
+# user interface
+
+
+#SET(libcue_UIS
+# detailsdialog.ui
+#)
+
+#QT4_WRAP_UI(libcue_UIS_H ${libcue_UIS})
+# Don't forget to include output directory, otherwise
+# the UI file won't be wrapped!
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+ADD_LIBRARY(cue SHARED ${libcue_SRCS} ${libcue_MOC_SRCS} ${libcue_RCC_SRCS})
+add_dependencies(cue qmmp)
+target_link_libraries(cue ${QT_LIBRARIES} -lqmmp)
+install(TARGETS cue DESTINATION ${LIB_DIR}/qmmp/Input)
+
diff --git a/src/plugins/Input/cue/cue.pro b/src/plugins/Input/cue/cue.pro
new file mode 100644
index 000000000..1c0771d5c
--- /dev/null
+++ b/src/plugins/Input/cue/cue.pro
@@ -0,0 +1,36 @@
+include(../../plugins.pri)
+
+#FORMS += detailsdialog.ui
+HEADERS += decodercuefactory.h \
+ cueparser.h \
+ decoder_cue.h
+SOURCES += decoder_cue.cpp \
+ decodercuefactory.cpp \
+ cueparser.cpp
+
+TARGET =$$PLUGINS_PREFIX/Input/cue
+QMAKE_CLEAN =$$PLUGINS_PREFIX/Input/libcue.so
+
+INCLUDEPATH += ../../../
+CONFIG += release \
+warn_on \
+plugin
+
+TEMPLATE = lib
+
+QMAKE_LIBDIR += ../../../../lib
+LIBS += -lqmmp -L/usr/lib
+
+#TRANSLATIONS = translations/cue_plugin_ru.ts
+# translations/cue_plugin_uk_UA.ts
+# translations/cue_plugin_zh_CN.ts
+# translations/cue_plugin_zh_TW.ts
+# translations/cue_plugin_cs.ts
+# translations/cue_plugin_de.ts
+#RESOURCES = translations/translations.qrc
+
+isEmpty(LIB_DIR){
+ LIB_DIR = /lib
+}
+target.path = $$LIB_DIR/qmmp/Input
+INSTALLS += target
diff --git a/src/plugins/Input/cue/cueparser.cpp b/src/plugins/Input/cue/cueparser.cpp
new file mode 100644
index 000000000..cf79db5c2
--- /dev/null
+++ b/src/plugins/Input/cue/cueparser.cpp
@@ -0,0 +1,173 @@
+/***************************************************************************
+ * Copyright (C) 2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <QFile>
+#include <QFileInfo>
+#include <QRegExp>
+#include <QDir>
+
+#include <qmmp/decoder.h>
+
+#include "cueparser.h"
+
+CUEParser::CUEParser(const QString &fileName)
+{
+ QString album;
+ QFile file(fileName);
+ file.open(QIODevice::ReadOnly);
+
+ while (!file.atEnd())
+ {
+ QString line = file.readLine().trimmed();
+ QStringList words = splitLine(line);
+ if (words.size() < 2)
+ continue;
+
+ if (words[0] == "FILE")
+ {
+ //TODO check support
+ m_filePath = QUrl(fileName).path ();
+ m_filePath = QFileInfo(m_filePath).dir().filePath(words[1]);
+ }
+ else if (words[0] == "PERFORMER")
+ {
+ if (m_infoList.isEmpty())
+ continue;
+ else
+ m_infoList.last().setMetaData(Qmmp::ARTIST, words[1]);
+
+ }
+ else if (words[0] == "TITLE")
+ {
+ if (m_infoList.isEmpty())
+ album = words[1];
+ else
+ m_infoList.last().setMetaData(Qmmp::TITLE, words[1]);
+ }
+ else if (words[0] == "TRACK")
+ {
+ FileInfo info("cue://" + fileName + QString("#%1").arg(words[1].toInt()));
+ info.setMetaData(Qmmp::TRACK, words[1].toInt());
+ m_infoList << info;
+ m_offsets << 0;
+ }
+ else if (words[0] == "INDEX")
+ {
+ if (m_infoList.isEmpty())
+ continue;
+ m_infoList.last ().setLength(getLength(words[2]));
+ m_offsets.last() = getLength(words[2]);
+ }
+ }
+ //calculate length
+ for (int i = 0; i < m_infoList.size() - 1; ++i)
+ m_infoList[i].setLength(m_infoList[i+1].length()-m_infoList[i].length());
+ //calculate last item length
+ QList <FileInfo *> f_list;
+ f_list = Decoder::createPlayList(m_filePath);
+ qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length();
+ if (l > m_infoList.last().length())
+ m_infoList.last().setLength(l - m_infoList.last().length());
+ else
+ m_infoList.last().setLength(0);
+
+ foreach(FileInfo info, m_infoList)
+ {
+ info.setMetaData(Qmmp::ALBUM, album);
+ }
+ file.close();
+}
+
+
+CUEParser::~CUEParser()
+{
+}
+
+QList<FileInfo*> CUEParser::createPlayList()
+{
+ QList<FileInfo*> list;
+ foreach(FileInfo info, m_infoList)
+ {
+ list << new FileInfo(info);
+ }
+ return list;
+}
+
+const QString CUEParser::filePath()
+{
+ return m_filePath;
+}
+
+qint64 CUEParser::offset(int track)
+{
+ return m_offsets.at(track - 1);
+}
+
+qint64 CUEParser::length(int track)
+{
+ return m_infoList.at(track - 1).length();
+}
+
+int CUEParser::count()
+{
+ return m_infoList.count();
+}
+
+FileInfo *CUEParser::info(int track)
+{
+ return &m_infoList[track - 1];
+}
+
+QStringList CUEParser::splitLine(const QString &line)
+{
+ //qDebug("row string = %s",qPrintable(line));
+ QStringList list;
+ QString buf = line.trimmed();
+ if (buf.isEmpty())
+ return list;
+ while (!buf.isEmpty())
+ {
+ //qDebug(qPrintable(buf));
+ if (buf.startsWith('"'))
+ {
+ int end = buf.indexOf('"',1);
+ list << buf.mid (1, end - 1);
+ buf.remove (0, end+1);
+ }
+ else
+ {
+ int end = buf.indexOf(' ', 0);
+ if (end < 0)
+ end = buf.size();
+ list << buf.mid (0, end);
+ buf.remove (0, end);
+ }
+ buf = buf.trimmed();
+ }
+ return list;
+}
+
+int CUEParser::getLength(const QString &str)
+{
+ QStringList list = str.split(":");
+ if (list.size() < 2)
+ return 0;
+ return list.at(0).toInt()*60 + list.at(1).toInt();
+}
diff --git a/src/plugins/Input/cue/cueparser.h b/src/plugins/Input/cue/cueparser.h
new file mode 100644
index 000000000..61807319a
--- /dev/null
+++ b/src/plugins/Input/cue/cueparser.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ * Copyright (C) 2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef CUEPARSER_H
+#define CUEPARSER_H
+
+#include <QList>
+#include <QMap>
+#include <QString>
+#include <QStringList>
+
+#include <qmmp/fileinfo.h>
+
+
+/**
+ @author Ilya Kotov <forkotov02@hotmail.ru>
+*/
+class CUEParser{
+public:
+ CUEParser(const QString &fileName);
+
+ ~CUEParser();
+
+ QList<FileInfo*> createPlayList();
+ const QString filePath();
+ qint64 offset(int track);
+ qint64 length(int track);
+ int count();
+ FileInfo *info(int track);
+
+private:
+ QList< QMap<int, int> > m_map;
+ QString m_filePath;
+ QList <FileInfo> m_infoList;
+ QList <int> m_offsets;
+ QStringList splitLine(const QString &line);
+ int getLength(const QString &str);
+
+};
+
+#endif
diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp
new file mode 100644
index 000000000..d988d9aba
--- /dev/null
+++ b/src/plugins/Input/cue/decoder_cue.cpp
@@ -0,0 +1,208 @@
+/***************************************************************************
+ * Copyright (C) 2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <qmmp/constants.h>
+#include <qmmp/buffer.h>
+#include <qmmp/output.h>
+#include <qmmp/recycler.h>
+#include <qmmp/fileinfo.h>
+#include <qmmp/decoderfactory.h>
+
+#include <QObject>
+#include <QFile>
+
+#include "cueparser.h"
+#include "decoder_cue.h"
+
+
+DecoderCUE::DecoderCUE(QObject *parent, DecoderFactory *d, const QString &url)
+ : Decoder(parent, d)
+{
+ path = url;
+ m_decoder = 0;
+ m_output2 = 0;
+ m_input2 = 0;
+}
+
+DecoderCUE::~DecoderCUE()
+{}
+
+bool DecoderCUE::initialize()
+{
+ CUEParser parser(QUrl(path).path());
+ int track = path.section("#", -1).toInt();
+ path = parser.filePath();
+ DecoderFactory *df = Decoder::findByPath(path);
+ if (df)
+ {
+ m_input2 = new QFile(path);
+ if (!m_input2->open(QIODevice::ReadOnly))
+ {
+ qDebug("DecoderCUE: cannot open input");
+ stop();
+ //m_handler->dispatch(Qmmp::NormalError);
+ return FALSE;
+ }
+ }
+ if (!df->properties().noOutput)
+ {
+ m_output2 = Output::create(this);
+ if (!m_output2)
+ {
+ qWarning("DecoderCUE: unable to create output");
+ //m_handler->dispatch(Qmmp::FatalError);
+ return FALSE;
+ }
+ if (!m_output2->initialize())
+ {
+ qWarning("SoundCore: unable to initialize output");
+ delete m_output2;
+ m_output2 = 0;
+ //m_handler->dispatch(Qmmp::FatalError);
+ return FALSE;
+ }
+ }
+ m_length = parser.length(track);
+ m_offset = parser.offset(track);
+ m_decoder = df->create(this, m_input2, m_output2, path);
+ CUEStateHandler *csh = new CUEStateHandler(this, m_offset, m_length);
+ m_decoder->setStateHandler(csh);
+ connect(csh, SIGNAL(finished()), SLOT(finish()));
+ connect(m_decoder, SIGNAL(playbackFinished()), SLOT(finish()));
+ if (m_output2)
+ m_output2->setStateHandler(m_decoder->stateHandler());
+ m_decoder->initialize();
+ m_decoder->seek(parser.offset(track));
+ if (m_output2)
+ m_output2->seek(parser.offset(track));
+
+ //send metadata
+ QMap<Qmmp::MetaData, QString> metaData = parser.info(track)->metaData();
+ StateHandler::instance()->dispatch(metaData);
+ return TRUE;
+}
+
+qint64 DecoderCUE::lengthInSeconds()
+{
+ return m_decoder ? m_length : 0;
+}
+
+void DecoderCUE::seek(qint64 pos)
+{
+ if (m_output2 && m_output2->isRunning())
+ {
+ m_output2->mutex()->lock ();
+ m_output2->seek(m_offset + pos);
+ m_output2->mutex()->unlock();
+ if (m_decoder && m_decoder->isRunning())
+ {
+ m_decoder->mutex()->lock ();
+ m_decoder->seek(m_offset + pos);
+ m_decoder->mutex()->unlock();
+ }
+ }
+ else if (m_decoder)
+ {
+ m_decoder->mutex()->lock ();
+ m_decoder->seek(m_offset + pos);
+ m_decoder->mutex()->unlock();
+ }
+}
+
+void DecoderCUE::stop()
+{
+ if (m_decoder /*&& m_decoder->isRunning()*/)
+ {
+ m_decoder->mutex()->lock ();
+ m_decoder->stop();
+ m_decoder->mutex()->unlock();
+ //m_decoder->stateHandler()->dispatch(Qmmp::Stopped);
+ }
+ if (m_output2)
+ {
+ m_output2->mutex()->lock ();
+ m_output2->stop();
+ m_output2->mutex()->unlock();
+ }
+
+ // wake up threads
+ if (m_decoder)
+ {
+ m_decoder->mutex()->lock ();
+ m_decoder->cond()->wakeAll();
+ m_decoder->mutex()->unlock();
+ }
+ if (m_output2)
+ {
+ m_output2->recycler()->mutex()->lock ();
+ m_output2->recycler()->cond()->wakeAll();
+ m_output2->recycler()->mutex()->unlock();
+ }
+ if (m_decoder)
+ m_decoder->wait();
+ if (m_output2)
+ m_output2->wait();
+
+ if (m_input2)
+ {
+ m_input2->deleteLater();
+ m_input2 = 0;
+ }
+}
+
+void DecoderCUE::run()
+{
+ m_decoder->start();
+ if (m_output2)
+ m_output2->start();
+}
+
+
+CUEStateHandler::CUEStateHandler(QObject *parent, qint64 offset, qint64 length): StateHandler(parent)
+{
+ m_offset = offset;
+ m_length2 = length;
+}
+
+CUEStateHandler::~CUEStateHandler(){};
+
+void CUEStateHandler::dispatch(qint64 elapsed,
+ qint64 totalTime,
+ int bitrate,
+ int frequency,
+ int precision,
+ int channels)
+{
+ Q_UNUSED(totalTime);
+ StateHandler::instance()->dispatch(elapsed - m_offset, m_length2, bitrate,
+ frequency, precision, channels);
+ if (elapsed - m_offset > m_length2)
+ emit finished();
+}
+
+void CUEStateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData)
+{
+ //ignore media file metadata
+}
+
+void CUEStateHandler::dispatch(const Qmmp::State &state)
+{
+ StateHandler::instance()->dispatch(state);
+}
diff --git a/src/plugins/Input/cue/decoder_cue.h b/src/plugins/Input/cue/decoder_cue.h
new file mode 100644
index 000000000..4e0775151
--- /dev/null
+++ b/src/plugins/Input/cue/decoder_cue.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef DECODER_CUE_H
+#define DECODER_CUE_H
+
+#include <qmmp/decoder.h>
+#include <qmmp/statehandler.h>
+
+class Output;
+class QIDevice;
+//class CUEStateHandler;
+
+class DecoderCUE : public Decoder
+{
+ Q_OBJECT
+public:
+ DecoderCUE(QObject *, DecoderFactory *, const QString &url);
+ virtual ~DecoderCUE();
+
+ // Standard Decoder API
+ bool initialize();
+ qint64 lengthInSeconds();
+ void seek(qint64);
+ void stop();
+
+private:
+ // thread run function
+ void run();
+ QString path;
+ Decoder *m_decoder;
+ Output *m_output2;
+ QIODevice *m_input2;
+ qint64 m_length;
+ qint64 m_offset;
+};
+
+class CUEStateHandler : public StateHandler
+{
+ Q_OBJECT
+public:
+ CUEStateHandler(QObject *parent, qint64 offset, qint64 length);
+ virtual ~CUEStateHandler();
+
+ void dispatch(qint64 elapsed,
+ qint64 totalTime,
+ int bitrate,
+ int frequency,
+ int precision,
+ int channels);
+
+ void dispatch(const QMap<Qmmp::MetaData, QString> &metaData);
+
+ void dispatch(const Qmmp::State &state);
+
+signals:
+ void finished();
+
+private:
+ qint64 m_length2;
+ qint64 m_offset;
+
+};
+
+#endif // DECODER_CUE_H
diff --git a/src/plugins/Input/cue/decodercuefactory.cpp b/src/plugins/Input/cue/decodercuefactory.cpp
new file mode 100644
index 000000000..c87c4f4a6
--- /dev/null
+++ b/src/plugins/Input/cue/decodercuefactory.cpp
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include <QtGui>
+
+#include "decoder_cue.h"
+#include "cueparser.h"
+#include "decodercuefactory.h"
+
+
+// DecoderOggFactory
+
+bool DecoderCUEFactory::supports(const QString &source) const
+{
+ return source.right(4).toLower() == ".cue";
+}
+
+bool DecoderCUEFactory::canDecode(QIODevice *input) const
+{
+ return FALSE;
+}
+
+const DecoderProperties DecoderCUEFactory::properties() const
+{
+ DecoderProperties properties;
+ properties.name = tr("CUE Plugin");
+ properties.shortName = "cue";
+ properties.filter = "*.cue";
+ properties.description = tr("CUE Files");
+ //properties.contentType = "application/ogg;audio/x-vorbis+ogg";
+ properties.protocols = "cue";
+ properties.hasAbout = TRUE;
+ properties.hasSettings = FALSE;
+ properties.noInput = TRUE;
+ properties.noOutput = TRUE;
+ return properties;
+}
+
+Decoder *DecoderCUEFactory::create(QObject *parent, QIODevice *input,
+ Output *output, const QString &url)
+{
+ return new DecoderCUE(parent, this, url);
+}
+
+//FileInfo *DecoderCUEFactory::createFileInfo(const QString &source)
+QList<FileInfo *> DecoderCUEFactory::createPlayList(const QString &fileName)
+{
+ CUEParser parser(fileName);
+ return parser.createPlayList();
+}
+
+QObject* DecoderCUEFactory::showDetails(QWidget *parent, const QString &path)
+{
+ return 0;
+}
+
+void DecoderCUEFactory::showSettings(QWidget *)
+{}
+
+void DecoderCUEFactory::showAbout(QWidget *parent)
+{
+ QMessageBox::about (parent, tr("About CUE Audio Plugin"),
+ tr("Qmmp CUE Audio Plugin")+"\n"+
+ tr("Writen by: Ilya Kotov <forkotov02@hotmail.ru>"));
+}
+
+QTranslator *DecoderCUEFactory::createTranslator(QObject *parent)
+{
+ QTranslator *translator = new QTranslator(parent);
+ QString locale = QLocale::system().name();
+ translator->load(QString(":/cue_plugin_") + locale);
+ return translator;
+}
+
+Q_EXPORT_PLUGIN(DecoderCUEFactory)
diff --git a/src/plugins/Input/cue/decodercuefactory.h b/src/plugins/Input/cue/decodercuefactory.h
new file mode 100644
index 000000000..8cf38c6ad
--- /dev/null
+++ b/src/plugins/Input/cue/decodercuefactory.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2006-2008 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef DECODERCUEFACTORY_H
+#define DECODERCUEFACTORY_H
+
+#include <QObject>
+#include <QString>
+#include <QIODevice>
+#include <QWidget>
+
+#include <qmmp/decoder.h>
+#include <qmmp/output.h>
+#include <qmmp/decoderfactory.h>
+#include <qmmp/fileinfo.h>
+
+class DecoderCUEFactory : public QObject, DecoderFactory
+{
+Q_OBJECT
+Q_INTERFACES(DecoderFactory);
+
+public:
+ bool supports(const QString &source) const;
+ bool canDecode(QIODevice *input) const;
+ const DecoderProperties properties() const;
+ Decoder *create(QObject *, QIODevice *, Output *, const QString &);
+ //FileInfo *createFileInfo(const QString &source);
+ QList<FileInfo *> createPlayList(const QString &fileName);
+ QObject* showDetails(QWidget *parent, const QString &path);
+ void showSettings(QWidget *parent);
+ void showAbout(QWidget *parent);
+ QTranslator *createTranslator(QObject *parent);
+};
+
+#endif