diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-10-10 08:42:15 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-10-10 08:42:15 +0000 |
| commit | 45117f6d2f2ccfb47af840d4416f43607d83d518 (patch) | |
| tree | ee3e2b99914fa6907ce7e1173e1fc87575fe8a37 /src/plugins/Input | |
| parent | 0bb73fcbfda56e4cb064a7bc1ceda89312087f3d (diff) | |
| download | qmmp-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')
| -rw-r--r-- | src/plugins/Input/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/cue/CMakeLists.txt | 66 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cue.pro | 36 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.cpp | 173 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.h | 57 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decoder_cue.cpp | 208 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decoder_cue.h | 82 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decodercuefactory.cpp | 91 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decodercuefactory.h | 51 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decodermadfactory.cpp | 11 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decodermadfactory.h | 3 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.cpp | 21 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.h | 3 |
17 files changed, 796 insertions, 18 deletions
diff --git a/src/plugins/Input/CMakeLists.txt b/src/plugins/Input/CMakeLists.txt index 7a68dd8a3..3222be482 100644 --- a/src/plugins/Input/CMakeLists.txt +++ b/src/plugins/Input/CMakeLists.txt @@ -9,6 +9,7 @@ SET(USE_MPC TRUE CACHE BOOL "enable/disable mpc plugin") SET(USE_SNDFILE TRUE CACHE BOOL "enable/disable sndfile plugin") SET(USE_WAVPACK TRUE CACHE BOOL "enable/disable wavpack plugin") SET(USE_MODPLUG TRUE CACHE BOOL "enable/disable modplug plugin") +SET(USE_CUE TRUE CACHE BOOL "enable/disable cue plugin") pkg_check_modules(TAGLIB taglib) @@ -43,3 +44,7 @@ ENDIF(USE_WAVPACK) IF(USE_MODPLUG) #add_subdirectory(modplug) ENDIF(USE_MODPLUG) + +IF(USE_CUE) +add_subdirectory(cue) +ENDIF(USE_CUE) diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 1035f6484..e40e324cd 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,6 +1,6 @@ include(../../../qmmp.pri) -SUBDIRS += mad vorbis # sndfile wavpack +SUBDIRS += mad vorbis cue # sndfile wavpack TEMPLATE = subdirs contains(CONFIG, MODPLUG_PLUGIN){ 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 diff --git a/src/plugins/Input/ffmpeg/CMakeLists.txt b/src/plugins/Input/ffmpeg/CMakeLists.txt index a97c78bad..a65f35963 100644 --- a/src/plugins/Input/ffmpeg/CMakeLists.txt +++ b/src/plugins/Input/ffmpeg/CMakeLists.txt @@ -100,6 +100,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) IF(FFMPEG_FOUND) ADD_LIBRARY(ffmpeg SHARED ${libffmpeg_SRCS} ${libffmpeg_MOC_SRCS} ${libffmpeg_UIS_H} ${libffmpeg_RCC_SRCS}) +add_dependencies(ffmpeg qmmp) target_link_libraries(ffmpeg ${QT_LIBRARIES} -lqmmp ${FFMPEG_LDFLAGS} ${FFMPEG_CFLAGS}) install(TARGETS ffmpeg DESTINATION ${LIB_DIR}/qmmp/Input) ENDIF(FFMPEG_FOUND) diff --git a/src/plugins/Input/mad/decoder_mad.cpp b/src/plugins/Input/mad/decoder_mad.cpp index 0eeb912cf..74b7c124a 100644 --- a/src/plugins/Input/mad/decoder_mad.cpp +++ b/src/plugins/Input/mad/decoder_mad.cpp @@ -110,7 +110,7 @@ bool DecoderMAD::initialize() if (input()->isSequential ()) //for streams only { TagExtractor extractor(input()); - StateHandler::instance()->dispatch(extractor.id3v2tag()); + stateHandler()->dispatch(extractor.id3v2tag()); } mad_stream_init(&stream); diff --git a/src/plugins/Input/mad/decodermadfactory.cpp b/src/plugins/Input/mad/decodermadfactory.cpp index c41ab6fe9..ef8de8d45 100644 --- a/src/plugins/Input/mad/decodermadfactory.cpp +++ b/src/plugins/Input/mad/decodermadfactory.cpp @@ -99,11 +99,12 @@ Decoder *DecoderMADFactory::create(QObject *parent, QIODevice *input, Output *ou return new DecoderMAD(parent, this, input, output); } -FileInfo *DecoderMADFactory::createFileInfo(const QString &source) +//FileInfo *DecoderMADFactory::createFileInfo(const QString &source) +QList<FileInfo *> DecoderMADFactory::createPlayList(const QString &fileName) { - FileInfo *info = new FileInfo(); + FileInfo *info = new FileInfo(fileName); TagLib::Tag *tag = 0; - TagLib::MPEG::File fileRef(source.toLocal8Bit ()); + TagLib::MPEG::File fileRef(fileName.toLocal8Bit ()); QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat); settings.beginGroup("MAD"); @@ -183,7 +184,9 @@ FileInfo *DecoderMADFactory::createFileInfo(const QString &source) } if (fileRef.audioProperties()) info->setLength(fileRef.audioProperties()->length()); - return info; + QList <FileInfo*> list; + list << info; + return list; } QObject* DecoderMADFactory::showDetails(QWidget *parent, const QString &path) diff --git a/src/plugins/Input/mad/decodermadfactory.h b/src/plugins/Input/mad/decodermadfactory.h index b455f360e..a4d4d57ad 100644 --- a/src/plugins/Input/mad/decodermadfactory.h +++ b/src/plugins/Input/mad/decodermadfactory.h @@ -43,7 +43,8 @@ public: bool canDecode(QIODevice *input) const; const DecoderProperties properties() const; Decoder *create(QObject *, QIODevice *, Output *, const QString &); - FileInfo *createFileInfo(const QString &source); + //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); diff --git a/src/plugins/Input/vorbis/decoder_vorbis.cpp b/src/plugins/Input/vorbis/decoder_vorbis.cpp index 2d3500559..083ae1b30 100644 --- a/src/plugins/Input/vorbis/decoder_vorbis.cpp +++ b/src/plugins/Input/vorbis/decoder_vorbis.cpp @@ -292,7 +292,7 @@ void DecoderVorbis::updateTags() + strlen ("date=")))); } - StateHandler::instance()->dispatch(metaData); + stateHandler()->dispatch(metaData); } void DecoderVorbis::run() diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.cpp b/src/plugins/Input/vorbis/decodervorbisfactory.cpp index ceb0083ba..deca4f510 100644 --- a/src/plugins/Input/vorbis/decodervorbisfactory.cpp +++ b/src/plugins/Input/vorbis/decodervorbisfactory.cpp @@ -63,25 +63,26 @@ Decoder *DecoderVorbisFactory::create(QObject *parent, QIODevice *input, return new DecoderVorbis(parent, this, input, output); } -FileInfo *DecoderVorbisFactory::createFileInfo(const QString &source) +//FileInfo *DecoderVorbisFactory::createFileInfo(const QString &source) +QList<FileInfo *> DecoderVorbisFactory::createPlayList(const QString &fileName) { - FileInfo *info = new FileInfo(); + FileInfo *info = new FileInfo(fileName); - TagLib::FileRef fileRef(source.toLocal8Bit ()); + TagLib::FileRef fileRef(fileName.toLocal8Bit ()); TagLib::Tag *tag = fileRef.tag(); if (tag && !tag->isEmpty()) { info->setMetaData(Qmmp::ALBUM, - QString::fromUtf8(tag->album().toCString(TRUE)).trimmed()); + QString::fromUtf8(tag->album().toCString(TRUE)).trimmed()); info->setMetaData(Qmmp::ARTIST, - QString::fromUtf8(tag->artist().toCString(TRUE)).trimmed()); + QString::fromUtf8(tag->artist().toCString(TRUE)).trimmed()); info->setMetaData(Qmmp::COMMENT, - QString::fromUtf8(tag->comment().toCString(TRUE)).trimmed()); + QString::fromUtf8(tag->comment().toCString(TRUE)).trimmed()); info->setMetaData(Qmmp::GENRE, - QString::fromUtf8(tag->genre().toCString(TRUE)).trimmed()); + QString::fromUtf8(tag->genre().toCString(TRUE)).trimmed()); info->setMetaData(Qmmp::TITLE, - QString::fromUtf8(tag->title().toCString(TRUE)).trimmed()); + QString::fromUtf8(tag->title().toCString(TRUE)).trimmed()); info->setMetaData(Qmmp::YEAR, tag->year()); info->setMetaData(Qmmp::TRACK, tag->track()); } @@ -89,7 +90,9 @@ FileInfo *DecoderVorbisFactory::createFileInfo(const QString &source) if (fileRef.audioProperties()) info->setLength(fileRef.audioProperties()->length()); - return info; + QList <FileInfo*> list; + list << info; + return list; } QObject* DecoderVorbisFactory::showDetails(QWidget *parent, const QString &path) diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.h b/src/plugins/Input/vorbis/decodervorbisfactory.h index 811f2edc4..05c1d0ea6 100644 --- a/src/plugins/Input/vorbis/decodervorbisfactory.h +++ b/src/plugins/Input/vorbis/decodervorbisfactory.h @@ -44,7 +44,8 @@ public: bool canDecode(QIODevice *input) const; const DecoderProperties properties() const; Decoder *create(QObject *, QIODevice *, Output *, const QString &); - FileInfo *createFileInfo(const QString &source); + //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); |
