diff options
| -rw-r--r-- | src/plugins/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/plugins/Engines/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | src/plugins/Engines/Engines.pro | 4 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/CMakeLists.txt (renamed from src/plugins/Input/mplayer/CMakeLists.txt) | 15 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayer.pro | 34 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerengine.cpp (renamed from src/plugins/Input/mplayer/decoder_mplayer.cpp) | 101 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerengine.h (renamed from src/plugins/Input/mplayer/decoder_mplayer.h) | 28 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerenginefactory.cpp (renamed from src/plugins/Input/mplayer/decodermplayerfactory.cpp) | 66 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayerenginefactory.h (renamed from src/plugins/Input/mplayer/decodermplayerfactory.h) | 23 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayermetadatamodel.cpp (renamed from src/plugins/Input/mplayer/detailsdialog.cpp) | 57 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/mplayermetadatamodel.h (renamed from src/plugins/Input/mplayer/detailsdialog.h) | 25 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/settingsdialog.cpp (renamed from src/plugins/Input/mplayer/settingsdialog.cpp) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/settingsdialog.h (renamed from src/plugins/Input/mplayer/settingsdialog.h) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/settingsdialog.ui (renamed from src/plugins/Input/mplayer/settingsdialog.ui) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_cs.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_cs.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_de.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_de.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_it.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_it.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_lt.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_lt.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_pl.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_pl.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_ru.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_ru.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_tr.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_tr.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_uk_UA.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_uk_UA.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_CN.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_zh_CN.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_TW.ts (renamed from src/plugins/Input/mplayer/translations/mplayer_plugin_zh_TW.ts) | 0 | ||||
| -rw-r--r-- | src/plugins/Engines/mplayer/translations/translations.qrc (renamed from src/plugins/Input/mplayer/translations/translations.qrc) | 0 | ||||
| -rw-r--r-- | src/plugins/Input/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.cpp | 5 | ||||
| -rw-r--r-- | src/plugins/Input/flac/cueparser.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Input/mplayer/detailsdialog.ui | 390 | ||||
| -rw-r--r-- | src/plugins/Input/mplayer/mplayer.pro | 45 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/cueparser.cpp | 6 | ||||
| -rw-r--r-- | src/plugins/plugins.pro | 3 | ||||
| -rw-r--r-- | src/qmmp/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/qmmp/abstractengine.cpp | 42 | ||||
| -rw-r--r-- | src/qmmp/abstractengine.h | 29 | ||||
| -rw-r--r-- | src/qmmp/decoder.cpp | 43 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 15 | ||||
| -rw-r--r-- | src/qmmp/enginefactory.h | 4 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.cpp | 116 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.h | 67 | ||||
| -rw-r--r-- | src/qmmp/qmmp.pro | 6 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 21 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.h | 1 | ||||
| -rw-r--r-- | src/qmmp/soundcore.cpp | 75 | ||||
| -rw-r--r-- | src/qmmp/soundcore.h | 4 | ||||
| -rw-r--r-- | src/qmmpui/detailsdialog.cpp | 21 | ||||
| -rw-r--r-- | src/qmmpui/fileloader.cpp | 12 | ||||
| -rw-r--r-- | src/qmmpui/mediaplayer.cpp | 1 | ||||
| -rw-r--r-- | src/qmmpui/playlistitem.cpp | 4 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 7 | ||||
| -rw-r--r-- | src/ui/mainwindow.cpp | 6 |
51 files changed, 599 insertions, 694 deletions
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt index 00eabaad5..4f4c53f03 100644 --- a/src/plugins/CMakeLists.txt +++ b/src/plugins/CMakeLists.txt @@ -7,3 +7,4 @@ add_subdirectory(PlaylistFormats) add_subdirectory(CommandLineOptions) add_subdirectory(FileDialogs) add_subdirectory(Transports) +add_subdirectory(Engines)
\ No newline at end of file diff --git a/src/plugins/Engines/CMakeLists.txt b/src/plugins/Engines/CMakeLists.txt new file mode 100644 index 000000000..636972563 --- /dev/null +++ b/src/plugins/Engines/CMakeLists.txt @@ -0,0 +1,5 @@ +SET(USE_MPLAYER TRUE CACHE BOOL "enable/disable mplayer support") + +IF(USE_MPLAYER) +add_subdirectory(mplayer) +ENDIF(USE_MPLAYER) diff --git a/src/plugins/Engines/Engines.pro b/src/plugins/Engines/Engines.pro new file mode 100644 index 000000000..1dddcfd5d --- /dev/null +++ b/src/plugins/Engines/Engines.pro @@ -0,0 +1,4 @@ +include(../../../qmmp.pri) + +SUBDIRS += mplayer +TEMPLATE = subdirs diff --git a/src/plugins/Input/mplayer/CMakeLists.txt b/src/plugins/Engines/mplayer/CMakeLists.txt index 2b87c27c7..1dea9477b 100644 --- a/src/plugins/Input/mplayer/CMakeLists.txt +++ b/src/plugins/Engines/mplayer/CMakeLists.txt @@ -28,16 +28,16 @@ link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp) SET(libmplayer_SRCS - decoder_mplayer.cpp - decodermplayerfactory.cpp - detailsdialog.cpp + mplayerenginefactory.cpp + mplayerengine.cpp + mplayermetadatamodel.cpp settingsdialog.cpp ) SET(libmplayer_MOC_HDRS - decodermplayerfactory.h - decoder_mplayer.h - detailsdialog.h + mplayerenginefactory.h + mplayerengine.h + mplayermetadatamodel.h settingsdialog.h ) @@ -52,7 +52,6 @@ QT4_WRAP_CPP(libmplayer_MOC_SRCS ${libmplayer_MOC_HDRS}) SET(libmplayer_UIS settingsdialog.ui - detailsdialog.ui ) QT4_WRAP_UI(libmplayer_UIS_H ${libmplayer_UIS}) @@ -63,5 +62,5 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) ADD_LIBRARY(mplayer MODULE ${libmplayer_SRCS} ${libmplayer_MOC_SRCS} ${libmplayer_RCC_SRCS} ${libmplayer_UIS_H}) add_dependencies(mplayer qmmp) target_link_libraries(mplayer ${QT_LIBRARIES} -lqmmp) -install(TARGETS mplayer DESTINATION ${LIB_DIR}/qmmp/Input) +install(TARGETS mplayer DESTINATION ${LIB_DIR}/qmmp/Engines) diff --git a/src/plugins/Engines/mplayer/mplayer.pro b/src/plugins/Engines/mplayer/mplayer.pro new file mode 100644 index 000000000..dbcde014d --- /dev/null +++ b/src/plugins/Engines/mplayer/mplayer.pro @@ -0,0 +1,34 @@ +include(../../plugins.pri) +HEADERS += mplayerenginefactory.h \ + mplayerengine.h \ + settingsdialog.h \ + mplayermetadatamodel.h +SOURCES += mplayerengine.cpp \ + mplayerenginefactory.cpp \ + settingsdialog.cpp \ + mplayermetadatamodel.cpp +TARGET = $$PLUGINS_PREFIX/Engines/mplayer +QMAKE_CLEAN = $$PLUGINS_PREFIX/Engines/libmplayer.so +INCLUDEPATH += ../../../ +CONFIG += release \ + warn_on \ + plugin +TEMPLATE = lib +QMAKE_LIBDIR += ../../../../lib +LIBS += -lqmmp \ + -L/usr/lib +TRANSLATIONS = translations/mplayer_plugin_ru.ts \ + translations/mplayer_plugin_uk_UA.ts \ + translations/mplayer_plugin_zh_CN.ts \ + translations/mplayer_plugin_zh_TW.ts \ + translations/mplayer_plugin_cs.ts \ + translations/mplayer_plugin_pl.ts \ + translations/mplayer_plugin_de.ts \ + translations/mplayer_plugin_it.ts \ + translations/mplayer_plugin_tr.ts \ + translations/mplayer_plugin_lt.ts +RESOURCES = translations/translations.qrc +isEmpty(LIB_DIR):LIB_DIR = /lib +target.path = $$LIB_DIR/qmmp/Input +INSTALLS += target +FORMS += settingsdialog.ui diff --git a/src/plugins/Input/mplayer/decoder_mplayer.cpp b/src/plugins/Engines/mplayer/mplayerengine.cpp index 862bc3c90..33a2c69ae 100644 --- a/src/plugins/Input/mplayer/decoder_mplayer.cpp +++ b/src/plugins/Engines/mplayer/mplayerengine.cpp @@ -18,12 +18,6 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include <qmmp/buffer.h> -#include <qmmp/output.h> -#include <qmmp/recycler.h> -#include <qmmp/fileinfo.h> -#include <qmmp/decoderfactory.h> - #include <QObject> #include <QProcess> #include <QFile> @@ -34,8 +28,13 @@ #include <QMenu> #include <QRegExp> #include <QSettings> - -#include "decoder_mplayer.h" +#include <qmmp/buffer.h> +#include <qmmp/output.h> +#include <qmmp/recycler.h> +#include <qmmp/fileinfo.h> +#include <qmmp/decoderfactory.h> +#include <qmmp/inputsource.h> +#include "mplayerengine.h" #define MPLAYER_DEBUG @@ -84,10 +83,10 @@ QStringList MplayerInfo::filters() return filters; } -DecoderMplayer::DecoderMplayer(QObject *parent, DecoderFactory *d, const QString &url) - : Decoder(parent, d) +MplayerEngine::MplayerEngine(QObject *parent) + : AbstractEngine(parent) { - m_url = url; + //m_url = url; m_bitrate = 0; m_samplerate = 0; m_channels = 0; @@ -95,15 +94,46 @@ DecoderMplayer::DecoderMplayer(QObject *parent, DecoderFactory *d, const QString m_length = 0; m_currentTime = 0; m_process = new QProcess(this); + connect(m_process, SIGNAL(readyReadStandardOutput()), SLOT(readStdOut())); } -DecoderMplayer::~DecoderMplayer() +MplayerEngine::~MplayerEngine() { qDebug("%s",__FUNCTION__); m_process->close(); } -bool DecoderMplayer::initialize() +bool MplayerEngine::play() +{ + if(m_process->state() != QProcess::NotRunning) + return FALSE; + startMplayerProcess(); + return TRUE; +} + +bool MplayerEngine::enqueue(InputSource *source) +{ + QString url = source->url(); + QStringList filters = MplayerInfo::filters(); + bool supports = FALSE; + foreach(QString filter, filters) + { + QRegExp regexp(filter, Qt::CaseInsensitive, QRegExp::Wildcard); + supports = regexp.exactMatch(source->url()); + if(supports) + break; + } + if(!supports) + return FALSE; + source->deleteLater(); + if(m_process->state() == QProcess::NotRunning) + m_url = url; + else + m_files.enqueue(url); + return TRUE; +} + +bool MplayerEngine::initialize() { FileInfo *info = MplayerInfo::createFileInfo(m_url); m_length = info->length(); @@ -122,22 +152,21 @@ bool DecoderMplayer::initialize() m_args << QString("-autosync %1").arg(settings.value("autosync_factor", 100).toInt()); m_args << m_url; - connect(m_process, SIGNAL(readyReadStandardOutput()), SLOT(readStdOut())); return TRUE; } -qint64 DecoderMplayer::totalTime() +qint64 MplayerEngine::totalTime() { return m_length * 1000; } -void DecoderMplayer::seek(qint64 pos) +void MplayerEngine::seek(qint64 pos) { if (m_process->state() == QProcess::Running) m_process->write(QString("seek %1 \n").arg(pos/1000 - m_currentTime).toLocal8Bit ()); } -void DecoderMplayer::stop() +void MplayerEngine::stop() { if (m_process->state() == QProcess::Running) { @@ -145,31 +174,27 @@ void DecoderMplayer::stop() m_process->waitForFinished(1500); } StateHandler::instance()->dispatch(Qmmp::Stopped); + m_files.clear(); + m_url.clear(); } -void DecoderMplayer::pause() +void MplayerEngine::pause() { m_process->write("pause\n"); } -void DecoderMplayer::setEQ(double bands[10], double preamp) +void MplayerEngine::setEQ(double bands[10], double preamp) { Q_UNUSED(bands[10]); Q_UNUSED(preamp); } -void DecoderMplayer::setEQEnabled(bool on) +void MplayerEngine::setEQEnabled(bool on) { Q_UNUSED(on); } -void DecoderMplayer::run() -{ - QMetaObject::invokeMethod(this, "startMplayerProcess"); - StateHandler::instance()->dispatch(Qmmp::Playing); -} - -void DecoderMplayer::readStdOut() +void MplayerEngine::readStdOut() { QString line = QString::fromLocal8Bit(m_process->readAll ()).trimmed(); QStringList lines = line.split("\n"); @@ -192,8 +217,19 @@ void DecoderMplayer::readStdOut() else if (rx_end.indexIn(line) > -1) { if (m_process->state() == QProcess::Running) - m_process->waitForFinished(1500); - finish(); + m_process->waitForFinished(3500); + emit playbackFinished(); + if(!m_files.isEmpty()) + { + StateHandler::instance()->dispatch(Qmmp::Stopped); + m_url = m_files.dequeue(); + startMplayerProcess(); + } + else + { + StateHandler::instance()->dispatch(Qmmp::Stopped); + return; + } } else if (rx_quit.indexIn(line) > -1) { @@ -215,7 +251,12 @@ void DecoderMplayer::readStdOut() } } -void DecoderMplayer::startMplayerProcess() +void MplayerEngine::startMplayerProcess() { + initialize(); m_process->start ("mplayer", m_args); + StateHandler::instance()->dispatch(Qmmp::Playing); + FileInfo *info = MplayerInfo::createFileInfo(m_url); + StateHandler::instance()->dispatch(info->metaData()); + delete info; } diff --git a/src/plugins/Input/mplayer/decoder_mplayer.h b/src/plugins/Engines/mplayer/mplayerengine.h index 38d47e629..cc6b12d16 100644 --- a/src/plugins/Input/mplayer/decoder_mplayer.h +++ b/src/plugins/Engines/mplayer/mplayerengine.h @@ -18,18 +18,21 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef DECODER_MPLAYER_H -#define DECODER_MPLAYER_H +#ifndef MPLAYERENGINE_H +#define MPLAYERENGINE_H -#include <qmmp/decoder.h> +#include <QQueue> +#include <QString> #include <qmmp/statehandler.h> +#include <qmmp/abstractengine.h> class Output; class QIDevice; class DecoderPhonon; class QMenu; class QProcess; - +class FileInfo; +class InputSource; class MplayerInfo { @@ -38,16 +41,16 @@ public: static QStringList filters(); }; - - -class DecoderMplayer : public Decoder +class MplayerEngine : public AbstractEngine { Q_OBJECT public: - DecoderMplayer(QObject *, DecoderFactory *, const QString &url); - virtual ~DecoderMplayer(); + MplayerEngine(QObject *parent); + virtual ~MplayerEngine(); - // Standard Decoder API + // Engine API + bool play(); + bool enqueue(InputSource *source); bool initialize(); qint64 totalTime(); void seek(qint64); @@ -63,8 +66,6 @@ private slots: void startMplayerProcess(); private: - // thread run function - void run(); int mplayer_pipe[2]; QString m_url; QStringList m_args; @@ -75,7 +76,8 @@ private: int m_bitsPerSample; qint64 m_currentTime; qint64 m_length; + QQueue <QString> m_files; }; -#endif // DECODER_MPLAYER_H +#endif // MPLAYERENGINE_H diff --git a/src/plugins/Input/mplayer/decodermplayerfactory.cpp b/src/plugins/Engines/mplayer/mplayerenginefactory.cpp index 15db7cd34..33ca2e4cf 100644 --- a/src/plugins/Input/mplayer/decodermplayerfactory.cpp +++ b/src/plugins/Engines/mplayer/mplayerenginefactory.cpp @@ -19,34 +19,17 @@ ***************************************************************************/ #include <QtGui> -#include "detailsdialog.h" +#include "mplayermetadatamodel.h" #include "settingsdialog.h" -#include "decoder_mplayer.h" -#include "decodermplayerfactory.h" +#include "mplayerengine.h" +#include "mplayerenginefactory.h" -// DecoderMplayerFactory +// MplayerEngineFactory -bool DecoderMplayerFactory::supports(const QString &source) const +const EngineProperties MplayerEngineFactory::properties() const { - QStringList filters = MplayerInfo::filters(); - foreach(QString filter, filters) - { - QRegExp regexp(filter, Qt::CaseInsensitive, QRegExp::Wildcard); - if (regexp.exactMatch(source)) - return TRUE; - } - return FALSE; -} - -bool DecoderMplayerFactory::canDecode(QIODevice *) const -{ - return FALSE; -} - -const DecoderProperties DecoderMplayerFactory::properties() const -{ - DecoderProperties properties; + EngineProperties properties; properties.name = tr("Mplayer Plugin"); properties.shortName = "mplayer"; properties.filter = MplayerInfo::filters().join(" "); @@ -55,20 +38,27 @@ const DecoderProperties DecoderMplayerFactory::properties() const properties.protocols = "file"; properties.hasAbout = TRUE; properties.hasSettings = TRUE; - properties.noInput = TRUE; - properties.noOutput = TRUE; return properties; } -Decoder *DecoderMplayerFactory::create(QObject *parent, QIODevice *input, - Output *output, const QString &url) +bool MplayerEngineFactory::supports(const QString &source) const +{ + QStringList filters = MplayerInfo::filters(); + foreach(QString filter, filters) + { + QRegExp regexp(filter, Qt::CaseInsensitive, QRegExp::Wildcard); + if (regexp.exactMatch(source)) + return TRUE; + } + return FALSE; +} + +AbstractEngine *MplayerEngineFactory::create(QObject *parent) { - Q_UNUSED(input); - Q_UNUSED(output); - return new DecoderMplayer(parent, this, url); + return new MplayerEngine(parent); } -QList<FileInfo *> DecoderMplayerFactory::createPlayList(const QString &fileName, bool useMetaData) +QList<FileInfo *> MplayerEngineFactory::createPlayList(const QString &fileName, bool useMetaData) { Q_UNUSED(useMetaData); QList<FileInfo *> info; @@ -76,20 +66,18 @@ QList<FileInfo *> DecoderMplayerFactory::createPlayList(const QString &fileName, return info; } -QObject* DecoderMplayerFactory::showDetails(QWidget *parent, const QString &path) +MetaDataModel* MplayerEngineFactory::createMetaDataModel(const QString &path, QObject *parent) { - DetailsDialog *d = new DetailsDialog(path, parent); - d->show(); - return d; + return new MplayerMetaDataModel(path, parent); } -void DecoderMplayerFactory::showSettings(QWidget *parent) +void MplayerEngineFactory::showSettings(QWidget *parent) { SettingsDialog *s = new SettingsDialog(parent); s->show(); } -void DecoderMplayerFactory::showAbout(QWidget *parent) +void MplayerEngineFactory::showAbout(QWidget *parent) { QMessageBox::about (parent, tr("About MPlayer Plugin"), tr("Qmmp MPlayer Plugin")+"\n"+ @@ -97,7 +85,7 @@ void DecoderMplayerFactory::showAbout(QWidget *parent) tr("Writen by: Ilya Kotov <forkotov02@hotmail.ru>")); } -QTranslator *DecoderMplayerFactory::createTranslator(QObject *parent) +QTranslator *MplayerEngineFactory::createTranslator(QObject *parent) { QTranslator *translator = new QTranslator(parent); QString locale = Qmmp::systemLanguageID(); @@ -105,4 +93,4 @@ QTranslator *DecoderMplayerFactory::createTranslator(QObject *parent) return translator; } -Q_EXPORT_PLUGIN(DecoderMplayerFactory) +Q_EXPORT_PLUGIN(MplayerEngineFactory) diff --git a/src/plugins/Input/mplayer/decodermplayerfactory.h b/src/plugins/Engines/mplayer/mplayerenginefactory.h index a752d5a43..4c43b15a2 100644 --- a/src/plugins/Input/mplayer/decodermplayerfactory.h +++ b/src/plugins/Engines/mplayer/mplayerenginefactory.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2008 by Ilya Kotov * + * Copyright (C) 2006-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -17,31 +17,30 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef DECODERMPLAYERFACTORY_H -#define DECODERMPLAYERFACTORY_H +#ifndef MPLAYERENGINEFACTORY_H +#define MPLAYERENGINEFACTORY_H #include <QObject> #include <QString> #include <QIODevice> #include <QWidget> -#include <qmmp/decoder.h> -#include <qmmp/output.h> -#include <qmmp/decoderfactory.h> +#include <qmmp/abstractengine.h> +#include <qmmp/enginefactory.h> #include <qmmp/fileinfo.h> +#include <qmmp/metadatamodel.h> -class DecoderMplayerFactory : public QObject, DecoderFactory +class MplayerEngineFactory : public QObject, EngineFactory { Q_OBJECT -Q_INTERFACES(DecoderFactory); +Q_INTERFACES(EngineFactory); public: + const EngineProperties properties() const; bool supports(const QString &source) const; - bool canDecode(QIODevice *input) const; - const DecoderProperties properties() const; - Decoder *create(QObject *, QIODevice *, Output *, const QString &); + AbstractEngine *create(QObject *parent = 0); QList<FileInfo *> createPlayList(const QString &fileName, bool useMetaData); - QObject* showDetails(QWidget *parent, const QString &path); + MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0); void showSettings(QWidget *parent); void showAbout(QWidget *parent); QTranslator *createTranslator(QObject *parent); diff --git a/src/plugins/Input/mplayer/detailsdialog.cpp b/src/plugins/Engines/mplayer/mplayermetadatamodel.cpp index b541c1162..7aa8b3e3a 100644 --- a/src/plugins/Input/mplayer/detailsdialog.cpp +++ b/src/plugins/Engines/mplayer/mplayermetadatamodel.cpp @@ -18,20 +18,25 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include <QProcess> #include <QRegExp> #include <QFileInfo> +#include <QStringList> +#include <QProcess> +#include "mplayermetadatamodel.h" + +MplayerMetaDataModel::MplayerMetaDataModel(const QString &path, QObject *parent) : MetaDataModel(parent) +{ + m_path = path; +} -#include "detailsdialog.h" +MplayerMetaDataModel::~MplayerMetaDataModel() +{} -DetailsDialog::DetailsDialog(const QString &path, QWidget *parent) - : QDialog(parent) +QHash<QString, QString> MplayerMetaDataModel::audioProperties() { - ui.setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - ui.pathLineEdit->setText(path); - ui.sizeLabel->setText(QString("%1 ").arg(QFileInfo(path).size ()/1024)+tr("KB")); - setWindowTitle(QFileInfo(path).fileName()); + QHash<QString, QString> vp; + QHash<QString, QString> ap; + ap.insert(tr("Size"), QString("%1 ").arg(QFileInfo(m_path).size ()/1024)+tr("KB")); //regular expressions QRegExp rx_id_length("^ID_LENGTH=([0-9,.]+)*"); QRegExp rx_id_demuxer("^ID_DEMUXER=(.*)"); @@ -56,7 +61,7 @@ DetailsDialog::DetailsDialog(const QString &path, QWidget *parent) args << "null"; args << "-ao"; args << "null"; - args << path; + args << m_path; QProcess mplayer_process; mplayer_process.start("mplayer", args); mplayer_process.waitForFinished(); @@ -68,40 +73,34 @@ DetailsDialog::DetailsDialog(const QString &path, QWidget *parent) { //general info if (rx_id_length.indexIn(line) > -1) - ui.lengthLabel->setText(rx_id_length.cap(1)); //TODO use hh:mm:ss format + ap.insert(tr("Length"),rx_id_length.cap(1)); //TODO use hh:mm:ss format else if (rx_id_demuxer.indexIn(line) > -1) - ui.demuxerLabel->setText(rx_id_demuxer.cap(1)); + ap.insert(tr("Demuxer"), rx_id_demuxer.cap(1)); //video info else if (rx_id_video_format.indexIn(line) > -1) - ui.videoFormatLabel->setText(rx_id_video_format.cap(1)); + ap.insert(tr("Video format"), rx_id_video_format.cap(1)); else if (rx_id_video_fps.indexIn(line) > -1) - ui.fpsLabel->setText(rx_id_video_fps.cap(1)); + ap.insert(tr("FPS"), rx_id_video_fps.cap(1)); else if (rx_id_video_codec.indexIn(line) > -1) - ui.videoCodecLabel->setText(rx_id_video_codec.cap(1)); + ap.insert(tr("Video codec"), rx_id_video_codec.cap(1)); else if (rx_id_video_aspect.indexIn(line) > -1) - ui. ratioLabel->setText(rx_id_video_aspect.cap(1)); + ap.insert(tr("Aspect ratio"),rx_id_video_aspect.cap(1)); else if (rx_id_video_bitrate.indexIn(line) > -1) - ui.videoBitrateLabel->setText(rx_id_video_bitrate.cap(1)); + ap.insert(tr("Video bitrate"), rx_id_video_bitrate.cap(1)); else if (rx_id_width.indexIn(line) > -1) width = rx_id_width.cap(1).toInt(); else if (rx_id_height.indexIn(line) > -1) height = rx_id_height.cap(1).toInt(); //audio info else if (rx_id_audio_codec.indexIn(line) > -1) - ui.audioCodecLabel->setText(rx_id_audio_codec.cap(1)); + ap.insert(tr("Audio codec"),rx_id_audio_codec.cap(1)); else if (rx_id_audio_rate.indexIn(line) > -1) - ui.sampleRateLabel->setText(rx_id_audio_rate.cap(1)); + ap.insert(tr("Sample rate"), rx_id_audio_rate.cap(1)); else if (rx_id_audio_bitrate.indexIn(line) > -1) - ui.audioBitrateLabel->setText(rx_id_audio_bitrate.cap(1)); + ap.insert(tr("Audio bitrate"), rx_id_audio_bitrate.cap(1)); else if (rx_id_audio_nch.indexIn(line) > -1) - ui.channelsLabel->setText(rx_id_audio_nch.cap(1)); + ap.insert(tr("Channels"), rx_id_audio_nch.cap(1)); } - ui.resolutionLabel->setText(QString("%1x%2").arg(width).arg(height)); + vp.insert(tr("Resolution"), QString("%1x%2").arg(width).arg(height)); + return ap; } - - -DetailsDialog::~DetailsDialog() -{ -} - - diff --git a/src/plugins/Input/mplayer/detailsdialog.h b/src/plugins/Engines/mplayer/mplayermetadatamodel.h index 0d4af20a7..3cfe4662c 100644 --- a/src/plugins/Input/mplayer/detailsdialog.h +++ b/src/plugins/Engines/mplayer/mplayermetadatamodel.h @@ -17,27 +17,22 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef DETAILSDIALOG_H -#define DETAILSDIALOG_H -#include <QDialog> +#ifndef MPLAYERMETADATAMODEL_H +#define MPLAYERMETADATAMODEL_H -#include "ui_detailsdialog.h" +#include <qmmp/metadatamodel.h> -/** - @author Ilya Kotov <forkotov02@hotmail.ru> -*/ -class DetailsDialog : public QDialog +class MplayerMetaDataModel : public MetaDataModel { - Q_OBJECT +Q_OBJECT public: - DetailsDialog(const QString &path, QWidget *parent = 0); - - ~DetailsDialog(); + MplayerMetaDataModel(const QString &path, QObject *parent); + ~MplayerMetaDataModel(); + QHash<QString, QString> audioProperties(); private: - Ui::DetailsDialog ui; - + QString m_path; }; -#endif +#endif // MPLAYERMETADATAMODEL_H diff --git a/src/plugins/Input/mplayer/settingsdialog.cpp b/src/plugins/Engines/mplayer/settingsdialog.cpp index 029890eb1..029890eb1 100644 --- a/src/plugins/Input/mplayer/settingsdialog.cpp +++ b/src/plugins/Engines/mplayer/settingsdialog.cpp diff --git a/src/plugins/Input/mplayer/settingsdialog.h b/src/plugins/Engines/mplayer/settingsdialog.h index 9ba56bce8..9ba56bce8 100644 --- a/src/plugins/Input/mplayer/settingsdialog.h +++ b/src/plugins/Engines/mplayer/settingsdialog.h diff --git a/src/plugins/Input/mplayer/settingsdialog.ui b/src/plugins/Engines/mplayer/settingsdialog.ui index 86dbfe8f6..86dbfe8f6 100644 --- a/src/plugins/Input/mplayer/settingsdialog.ui +++ b/src/plugins/Engines/mplayer/settingsdialog.ui diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_cs.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_cs.ts index 26f09d606..26f09d606 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_cs.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_cs.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_de.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_de.ts index 2f029c38b..2f029c38b 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_de.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_de.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_it.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_it.ts index f405e4505..f405e4505 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_it.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_it.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_lt.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_lt.ts index 87d1c6b33..87d1c6b33 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_lt.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_lt.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_pl.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_pl.ts index fadc08ecc..fadc08ecc 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_pl.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_pl.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_ru.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_ru.ts index b4169c849..b4169c849 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_ru.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_ru.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_tr.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_tr.ts index f1ba30cb0..f1ba30cb0 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_tr.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_tr.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_uk_UA.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_uk_UA.ts index 95a95ccb6..95a95ccb6 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_uk_UA.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_uk_UA.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_zh_CN.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_CN.ts index a20be020d..a20be020d 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_zh_CN.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_CN.ts diff --git a/src/plugins/Input/mplayer/translations/mplayer_plugin_zh_TW.ts b/src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_TW.ts index 66c75d389..66c75d389 100644 --- a/src/plugins/Input/mplayer/translations/mplayer_plugin_zh_TW.ts +++ b/src/plugins/Engines/mplayer/translations/mplayer_plugin_zh_TW.ts diff --git a/src/plugins/Input/mplayer/translations/translations.qrc b/src/plugins/Engines/mplayer/translations/translations.qrc index 7a98c5a7f..7a98c5a7f 100644 --- a/src/plugins/Input/mplayer/translations/translations.qrc +++ b/src/plugins/Engines/mplayer/translations/translations.qrc diff --git a/src/plugins/Input/CMakeLists.txt b/src/plugins/Input/CMakeLists.txt index b6cb405d5..2d2ca0a49 100644 --- a/src/plugins/Input/CMakeLists.txt +++ b/src/plugins/Input/CMakeLists.txt @@ -11,7 +11,6 @@ SET(USE_WAVPACK TRUE CACHE BOOL "enable/disable wavpack plugin") SET(USE_MODPLUG TRUE CACHE BOOL "enable/disable modplug plugin") SET(USE_AAC TRUE CACHE BOOL "enable/disable aac plugin") SET(USE_CUE TRUE CACHE BOOL "enable/disable cue plugin") -#SET(USE_MPLAYER TRUE CACHE BOOL "enable/disable mplayer support") SET(USE_CDA TRUE CACHE BOOL "enable/disable cd audio support") pkg_check_modules(TAGLIB taglib) @@ -56,10 +55,6 @@ IF(USE_CUE) add_subdirectory(cue) ENDIF(USE_CUE) -IF(USE_MPLAYER) -#add_subdirectory(mplayer) -ENDIF(USE_MPLAYER) - IF(USE_CDA) add_subdirectory(cdaudio) ENDIF(USE_CDA) diff --git a/src/plugins/Input/cue/cueparser.cpp b/src/plugins/Input/cue/cueparser.cpp index b6fb8594d..ba4305bfc 100644 --- a/src/plugins/Input/cue/cueparser.cpp +++ b/src/plugins/Input/cue/cueparser.cpp @@ -25,6 +25,7 @@ #include <QTextCodec> #include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include "cueparser.h" @@ -113,7 +114,7 @@ CUEParser::CUEParser(const QString &fileName) m_infoList[i].setLength(m_infoList[i+1].length() - m_infoList[i].length()); else { - QList <FileInfo *> f_list = Decoder::createPlayList(m_files[i], FALSE); + QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(m_files[i], FALSE); qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; if (l > m_infoList[i].length()) m_infoList[i].setLength(l - m_infoList[i].length()); @@ -123,7 +124,7 @@ CUEParser::CUEParser(const QString &fileName) } //calculate last item length - QList <FileInfo *> f_list = Decoder::createPlayList(m_filePath, FALSE); + QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(m_filePath, FALSE); qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; if (l > m_infoList.last().length()) m_infoList.last().setLength(l - m_infoList.last().length()); diff --git a/src/plugins/Input/flac/cueparser.cpp b/src/plugins/Input/flac/cueparser.cpp index 20bf94ec7..75b538bcf 100644 --- a/src/plugins/Input/flac/cueparser.cpp +++ b/src/plugins/Input/flac/cueparser.cpp @@ -21,7 +21,7 @@ #include <QTextStream> #include <QTextCodec> -#include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include "cueparser.h" @@ -94,7 +94,7 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) 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 = Decoder::createPlayList(m_filePath, FALSE); + QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(m_filePath, FALSE); qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; if (l > m_infoList.last().length()) m_infoList.last().setLength(l - m_infoList.last().length()); diff --git a/src/plugins/Input/mplayer/detailsdialog.ui b/src/plugins/Input/mplayer/detailsdialog.ui deleted file mode 100644 index 37358df2b..000000000 --- a/src/plugins/Input/mplayer/detailsdialog.ui +++ /dev/null @@ -1,390 +0,0 @@ -<ui version="4.0" > - <class>DetailsDialog</class> - <widget class="QDialog" name="DetailsDialog" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>415</width> - <height>351</height> - </rect> - </property> - <property name="windowTitle" > - <string>Details</string> - </property> - <layout class="QGridLayout" name="gridLayout_4" > - <property name="leftMargin" > - <number>5</number> - </property> - <property name="topMargin" > - <number>9</number> - </property> - <property name="rightMargin" > - <number>5</number> - </property> - <property name="bottomMargin" > - <number>5</number> - </property> - <item row="0" column="0" colspan="2" > - <widget class="QGroupBox" name="groupBox_3" > - <property name="title" > - <string>General information</string> - </property> - <layout class="QGridLayout" name="gridLayout" > - <item row="0" column="0" > - <widget class="QLabel" name="label" > - <property name="text" > - <string>File path:</string> - </property> - </widget> - </item> - <item row="0" column="1" > - <widget class="QLineEdit" name="pathLineEdit" > - <property name="readOnly" > - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_2" > - <property name="text" > - <string>Size:</string> - </property> - </widget> - </item> - <item row="1" column="1" > - <widget class="QLabel" name="sizeLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_4" > - <property name="text" > - <string>Demuxer:</string> - </property> - </widget> - </item> - <item row="2" column="1" > - <widget class="QLabel" name="demuxerLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_3" > - <property name="text" > - <string>Length:</string> - </property> - </widget> - </item> - <item row="3" column="1" > - <widget class="QLabel" name="lengthLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="0" > - <widget class="QGroupBox" name="groupBox" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title" > - <string>Video</string> - </property> - <layout class="QGridLayout" name="gridLayout_2" > - <item row="0" column="0" > - <widget class="QLabel" name="label_9" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Resolution:</string> - </property> - </widget> - </item> - <item row="0" column="1" colspan="2" > - <widget class="QLabel" name="resolutionLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Expanding" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_10" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Bitrate:</string> - </property> - </widget> - </item> - <item row="1" column="1" colspan="2" > - <widget class="QLabel" name="videoBitrateLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_11" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Format:</string> - </property> - </widget> - </item> - <item row="2" column="1" colspan="2" > - <widget class="QLabel" name="videoFormatLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_12" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>FPS:</string> - </property> - </widget> - </item> - <item row="3" column="1" colspan="2" > - <widget class="QLabel" name="fpsLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="4" column="0" > - <widget class="QLabel" name="label_13" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Codec:</string> - </property> - </widget> - </item> - <item row="4" column="1" colspan="2" > - <widget class="QLabel" name="videoCodecLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="5" column="0" > - <widget class="QLabel" name="label_19" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Aspect ratio:</string> - </property> - </widget> - </item> - <item row="5" column="1" colspan="2" > - <widget class="QLabel" name="ratioLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="1" > - <widget class="QGroupBox" name="groupBox_2" > - <property name="title" > - <string>Audio</string> - </property> - <layout class="QGridLayout" name="gridLayout_3" > - <item row="0" column="0" > - <widget class="QLabel" name="label_21" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Codec:</string> - </property> - </widget> - </item> - <item row="0" column="2" > - <widget class="QLabel" name="audioCodecLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Expanding" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_23" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Sample rate:</string> - </property> - </widget> - </item> - <item row="1" column="2" > - <widget class="QLabel" name="sampleRateLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_25" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Bitrate:</string> - </property> - </widget> - </item> - <item row="2" column="2" > - <widget class="QLabel" name="audioBitrateLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_24" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Channels:</string> - </property> - </widget> - </item> - <item row="3" column="2" > - <widget class="QLabel" name="channelsLabel" > - <property name="text" > - <string>-</string> - </property> - </widget> - </item> - <item row="4" column="0" colspan="2" > - <spacer name="verticalSpacer" > - <property name="orientation" > - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0" > - <size> - <width>20</width> - <height>37</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item row="2" column="0" colspan="2" > - <layout class="QHBoxLayout" name="horizontalLayout" > - <property name="spacing" > - <number>0</number> - </property> - <item> - <spacer name="horizontalSpacer" > - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0" > - <size> - <width>330</width> - <height>24</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="closeButton" > - <property name="text" > - <string>Close</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>closeButton</sender> - <signal>clicked()</signal> - <receiver>DetailsDialog</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel" > - <x>381</x> - <y>334</y> - </hint> - <hint type="destinationlabel" > - <x>23</x> - <y>324</y> - </hint> - </hints> - </connection> - </connections> -</ui> diff --git a/src/plugins/Input/mplayer/mplayer.pro b/src/plugins/Input/mplayer/mplayer.pro deleted file mode 100644 index 4be7bbd50..000000000 --- a/src/plugins/Input/mplayer/mplayer.pro +++ /dev/null @@ -1,45 +0,0 @@ -include(../../plugins.pri) - -HEADERS += decodermplayerfactory.h \ - decoder_mplayer.h \ - detailsdialog.h \ - settingsdialog.h - -SOURCES += decoder_mplayer.cpp \ - decodermplayerfactory.cpp \ - detailsdialog.cpp \ - settingsdialog.cpp - -TARGET =$$PLUGINS_PREFIX/Input/mplayer -QMAKE_CLEAN =$$PLUGINS_PREFIX/Input/libmplayer.so - -INCLUDEPATH += ../../../ -CONFIG += release \ -warn_on \ -plugin - -TEMPLATE = lib - -QMAKE_LIBDIR += ../../../../lib -LIBS += -lqmmp -L/usr/lib - -TRANSLATIONS = translations/mplayer_plugin_ru.ts \ - translations/mplayer_plugin_uk_UA.ts \ - translations/mplayer_plugin_zh_CN.ts \ - translations/mplayer_plugin_zh_TW.ts \ - translations/mplayer_plugin_cs.ts \ - translations/mplayer_plugin_pl.ts \ - translations/mplayer_plugin_de.ts \ - translations/mplayer_plugin_it.ts \ - translations/mplayer_plugin_tr.ts \ - translations/mplayer_plugin_lt.ts -RESOURCES = translations/translations.qrc - -isEmpty(LIB_DIR){ - LIB_DIR = /lib -} -target.path = $$LIB_DIR/qmmp/Input -INSTALLS += target - -FORMS += detailsdialog.ui \ - settingsdialog.ui diff --git a/src/plugins/Input/wavpack/cueparser.cpp b/src/plugins/Input/wavpack/cueparser.cpp index 41190be4b..cf63e41a1 100644 --- a/src/plugins/Input/wavpack/cueparser.cpp +++ b/src/plugins/Input/wavpack/cueparser.cpp @@ -20,9 +20,7 @@ #include <QTextStream> #include <QTextCodec> - -#include <qmmp/decoder.h> - +#include <qmmp/metadatamanager.h> #include "cueparser.h" CUEParser::CUEParser(const QByteArray &array, const QString &fileName) @@ -94,7 +92,7 @@ CUEParser::CUEParser(const QByteArray &array, const QString &fileName) 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 = Decoder::createPlayList(m_filePath, FALSE); + QList <FileInfo *> f_list = MetaDataManager::instance()->createPlayList(m_filePath, FALSE); qint64 l = f_list.isEmpty() ? 0 : f_list.at(0)->length() * 1000; if (l > m_infoList.last().length()) m_infoList.last().setLength(l - m_infoList.last().length()); diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index dfa993d89..17c618685 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -2,7 +2,8 @@ SUBDIRS += Input \ Output \ General \ Visual \ - Transports + Transports \ + Engines unix:SUBDIRS += Effect \ PlaylistFormats \ diff --git a/src/qmmp/CMakeLists.txt b/src/qmmp/CMakeLists.txt index 3af5a05c3..5e8b9f767 100644 --- a/src/qmmp/CMakeLists.txt +++ b/src/qmmp/CMakeLists.txt @@ -52,6 +52,7 @@ SET(libqmmp_SRCS inputsource.cpp fileinputsource.cpp emptyinputsource.cpp + metadatamanager.cpp ) SET(libqmmp_MOC_HDRS @@ -81,6 +82,7 @@ SET(libqmmp_MOC_HDRS fileinputsource.h emptyinputsource.h enginefactory.h + metadatamanager.h ) SET(libqmmp_DEVEL_HDRS diff --git a/src/qmmp/abstractengine.cpp b/src/qmmp/abstractengine.cpp index e8c7c309a..6b74ba3f9 100644 --- a/src/qmmp/abstractengine.cpp +++ b/src/qmmp/abstractengine.cpp @@ -95,3 +95,45 @@ QList<EngineFactory*> *AbstractEngine::factories() checkFactories(); return m_factories; } + +EngineFactory *AbstractEngine::findByPath(const QString& source) +{ + checkFactories(); + foreach(EngineFactory *fact, *m_factories) + { + if (fact->supports(source) && isEnabled(fact)) + return fact; + } + return 0; +} + +void AbstractEngine::setEnabled(EngineFactory* factory, bool enable) +{ + checkFactories(); + if (!m_factories->contains(factory)) + return; + + QString name = factory->properties().shortName; + QSettings settings (Qmmp::configFile(), QSettings::IniFormat ); + QStringList disabledList = settings.value("Engine/disabled_plugins").toStringList(); + + if (enable) + disabledList.removeAll(name); + else + { + if (!disabledList.contains(name)) + disabledList << name; + } + settings.setValue("Engine/disabled_plugins", disabledList); +} + +bool AbstractEngine::isEnabled(EngineFactory* factory) +{ + checkFactories(); + if (!m_factories->contains(factory)) + return FALSE; + QString name = factory->properties().shortName; + QSettings settings ( Qmmp::configFile(), QSettings::IniFormat ); + QStringList disabledList = settings.value("Engine/disabled_plugins").toStringList(); + return !disabledList.contains(name); +} diff --git a/src/qmmp/abstractengine.h b/src/qmmp/abstractengine.h index 2f4bc2004..ae0e599dd 100644 --- a/src/qmmp/abstractengine.h +++ b/src/qmmp/abstractengine.h @@ -25,10 +25,11 @@ #include <QWaitCondition> #include <QThread> #include <QStringList> +#include "enginefactory.h" class QIODevice; class InputSource; -class EngineFactory; + /*! * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -50,6 +51,11 @@ public: */ virtual qint64 totalTime() = 0; /*! + * Starts playback. Returns \b true if playback has been started successful, + * otherwise returns \b false. + */ + virtual bool play() = 0; + /*! * Requests a seek to the time \b time indicated, specified in milliseconds. */ virtual void seek(qint64 time) = 0; @@ -83,6 +89,21 @@ public: * Returns a list of decoder factories. */ static QList<EngineFactory*> *factories(); + /*! + * Returns EngineFactory pointer which supports file \b path or 0 if file \b path is unsupported + */ + static EngineFactory *findByPath(const QString &path); + /*! + * Sets whether the engine is enabled. + * @param factory Engine plugin factory. + * @param enable Plugin enable state (\b true - enable, \b false - disable) + */ + static void setEnabled(EngineFactory* factory, bool enable = TRUE); + /*! + * Returns \b true if engine is enabled, otherwise returns \b false + * @param factory Engine plugin factory. + */ + static bool isEnabled(EngineFactory* factory); signals: /*! @@ -90,12 +111,6 @@ signals: */ void playbackFinished(); -protected: - /*! - * The starting point for the decoding thread. - */ - virtual void run() = 0; - private: QMutex m_mutex; QWaitCondition m_waitCondition; diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp index 61d166099..f054fff91 100644 --- a/src/qmmp/decoder.cpp +++ b/src/qmmp/decoder.cpp @@ -225,49 +225,6 @@ bool Decoder::isEnabled(DecoderFactory* factory) return !disabledList.contains(name); } -QList <FileInfo *> Decoder::createPlayList(const QString &fileName, bool useMetaData) -{ - QList <FileInfo *> list; - DecoderFactory *fact = 0; - - if (QFile::exists(fileName)) //is it file? - fact = Decoder::findByPath(fileName); - - if (fact) - list << fact->createPlayList(fileName, useMetaData); - else if (QUrl(fileName).scheme() == "http") - list << new FileInfo(fileName); //create empty FileInfo for stream TODO transports support - //append path if it is empty - foreach(FileInfo *info, list) - { - if (info->path().isEmpty()) - info->setPath(fileName); - } - return list; -} - -QStringList Decoder::filters() -{ - checkFactories(); - QStringList filters; - foreach(DecoderFactory *fact, *m_factories) - if (isEnabled(fact) && !fact->properties().filter.isEmpty()) - filters << fact->properties().description + " (" + fact->properties().filter + ")"; - return filters; -} - -QStringList Decoder::nameFilters() -{ - checkFactories(); - QStringList filters; - for (int i=0; i<m_factories->size(); ++i) - { - if (isEnabled(m_factories->at(i))) - filters << m_factories->at(i)->properties().filter.split(" ", QString::SkipEmptyParts); - } - return filters; -} - QList<DecoderFactory*> *Decoder::factories() { checkFactories(); diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index 4d16faa6a..485d86479 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -88,21 +88,6 @@ public: */ static DecoderFactory *findByURL(const QUrl &url); /*! - * Extracts metadata and audio information from file \b path and returns a list of FileInfo items. - * One file may contain several playlist items (for example: cda disk or flac with embedded cue) - * @param path Source file path. - * @param useMetaData Metadata usage (\b true - use, \b - do not use) - */ - static QList <FileInfo *> createPlayList(const QString &path, bool useMetaData = TRUE); - /*! - * Returns a list of file name filters with description, i.e. "MPEG Files (*.mp3 *.mpg)" - */ - static QStringList filters(); - /*! - * Returns a list of file name filters, i.e. "*.mp3 *.mpg" - */ - static QStringList nameFilters(); - /*! * Returns a list of decoder factories. */ static QList<DecoderFactory*> *factories(); diff --git a/src/qmmp/enginefactory.h b/src/qmmp/enginefactory.h index dc38ac46a..e24c056c0 100644 --- a/src/qmmp/enginefactory.h +++ b/src/qmmp/enginefactory.h @@ -64,6 +64,10 @@ public: */ virtual ~EngineFactory() {} /*! + * Returns \b true if plugin supports \b source, otherwise returns \b false + */ + virtual bool supports(const QString &source) const = 0; + /*! * Returns general plugin properties. */ virtual const EngineProperties properties() const = 0; diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp new file mode 100644 index 000000000..756fb8b02 --- /dev/null +++ b/src/qmmp/metadatamanager.cpp @@ -0,0 +1,116 @@ +/*************************************************************************** + * Copyright (C) 2009 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 "decoder.h" +#include "decoderfactory.h" +#include "abstractengine.h" +#include "inputsource.h" +#include "metadatamanager.h" + +MetaDataManager* MetaDataManager::m_instance = 0; + +MetaDataManager::MetaDataManager() +{ + if(m_instance) + qFatal("MetaDataManager is already created"); + m_instance = this; + m_decoderFactories = Decoder::factories(); + m_engineFactories = AbstractEngine::factories(); + m_inputSourceFactories = InputSource::factories(); +} + +MetaDataManager::~MetaDataManager() +{ + m_instance = 0; +} + +QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool useMetaData) +{ + QList <FileInfo *> list; + DecoderFactory *fact = 0; + EngineFactory *efact = 0; + + if (!fileName.contains("://")) //local file + { + if((fact = Decoder::findByPath(fileName))) + return fact->createPlayList(fileName, useMetaData); + else if((efact = AbstractEngine::findByPath(fileName))) + return efact->createPlayList(fileName, useMetaData); + return list; + } + else + { + QString p = fileName.section("://",0,0); + QStringList protocols; + foreach(InputSourceFactory *f, *m_inputSourceFactories) + { + protocols << f->properties().protocols.split(" ", QString::SkipEmptyParts); + } + if(protocols.contains(p)) + list << new FileInfo(fileName); + } + + return list; +} + +QStringList MetaDataManager::filters() +{ + QStringList filters; + foreach(DecoderFactory *fact, *m_decoderFactories) + { + if (Decoder::isEnabled(fact) && !fact->properties().filter.isEmpty()) + filters << fact->properties().description + " (" + fact->properties().filter + ")"; + } + foreach(EngineFactory *fact, *m_engineFactories) + { + if (AbstractEngine::isEnabled(fact) && !fact->properties().filter.isEmpty()) + filters << fact->properties().description + " (" + fact->properties().filter + ")"; + } + return filters; +} + +QStringList MetaDataManager::nameFilters() +{ + QStringList filters; + foreach(DecoderFactory *fact, *m_decoderFactories) + { + if (Decoder::isEnabled(fact)) + filters << fact->properties().filter.split(" ", QString::SkipEmptyParts); + } + foreach(EngineFactory *fact, *m_engineFactories) + { + if (AbstractEngine::isEnabled(fact)) + filters << fact->properties().filter.split(" ", QString::SkipEmptyParts); + } + return filters; +} + +MetaDataManager *MetaDataManager::instance() +{ + if(!m_instance) + new MetaDataManager(); + return m_instance; +} + +void MetaDataManager::destroy() +{ + if(m_instance) + delete m_instance; +} diff --git a/src/qmmp/metadatamanager.h b/src/qmmp/metadatamanager.h new file mode 100644 index 000000000..826b71b52 --- /dev/null +++ b/src/qmmp/metadatamanager.h @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2009 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 METADATAMANAGER_H +#define METADATAMANAGER_H + +#include <QList> +#include <QStringList> +#include "fileinfo.h" + +class DecoderFactory; +class EngineFactory; +class InputSourceFactory; +/*! + * @author Ilya Kotov <forkotov02@hotmail.ru> + */ +class MetaDataManager +{ +public: + MetaDataManager(); + ~MetaDataManager(); + /*! + * Extracts metadata and audio information from file \b path and returns a list of FileInfo items. + * One file may contain several playlist items (for example: cda disk or flac with embedded cue) + * @param path Source file path. + * @param useMetaData Metadata usage (\b true - use, \b - do not use) + */ + QList <FileInfo *> createPlayList(const QString &path, bool useMetaData = TRUE); + /*! + * Returns a list of file name filters with description, i.e. "MPEG Files (*.mp3 *.mpg)" + */ + QStringList filters(); + /*! + * Returns a list of file name filters, i.e. "*.mp3 *.mpg" + */ + QStringList nameFilters(); + /*! + * Returns a pointer to the MetaDataManager instance. + */ + static MetaDataManager* instance(); + static void destroy(); + +private: + QList <DecoderFactory *> *m_decoderFactories; + QList <EngineFactory *> *m_engineFactories; + QList <InputSourceFactory *> *m_inputSourceFactories; + static MetaDataManager* m_instance; +}; + +#endif // METADATAMANAGER_H diff --git a/src/qmmp/qmmp.pro b/src/qmmp/qmmp.pro index 64283c851..a88480b85 100644 --- a/src/qmmp/qmmp.pro +++ b/src/qmmp/qmmp.pro @@ -27,7 +27,8 @@ HEADERS += recycler.h \ fileinputsource.h \ emptyinputsource.h \ inputsourcefactory.h \ - enginefactory.h + enginefactory.h \ + metadatamanager.h SOURCES += recycler.cpp \ decoder.cpp \ output.cpp \ @@ -48,7 +49,8 @@ SOURCES += recycler.cpp \ audioparameters.cpp \ inputsource.cpp \ fileinputsource.cpp \ - emptyinputsource.cpp + emptyinputsource.cpp \ + metadatamanager.cpp FORMS += unix:TARGET = ../../lib/qmmp win32:TARGET = ../../../bin/qmmp diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 02f1bb67b..36debe448 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -29,6 +29,7 @@ #include "decoderfactory.h" #include "inputsource.h" #include "qmmpaudioengine.h" +#include "metadatamanager.h" extern "C" @@ -75,6 +76,18 @@ void QmmpAudioEngine::reset() m_next = FALSE; } +bool QmmpAudioEngine::play() +{ + if(isRunning() || m_decoders.isEmpty() || (m_output && m_output->isRunning())) + return FALSE; + if(m_output) + delete m_output; + if(!(m_output = createOutput(m_decoders.head()))) + return FALSE; + start(); + return TRUE; +} + bool QmmpAudioEngine::enqueue(InputSource *source) { mutex()->lock(); @@ -107,11 +120,6 @@ bool QmmpAudioEngine::enqueue(InputSource *source) delete decoder; return FALSE; } - if(!m_output) - { - if(!(m_output = createOutput(decoder))) - return FALSE; - } m_decoders.enqueue(decoder); m_inputs.insert(decoder, source); source->setParent(this); @@ -431,6 +439,7 @@ void QmmpAudioEngine::run() m_next = FALSE; if (m_finish) finish(); + m_output->recycler()->cond()->wakeAll(); mutex()->unlock(); } @@ -481,7 +490,7 @@ void QmmpAudioEngine::sendMetaData() QString url = m_inputs.value(m_decoder)->url(); if (QFile::exists(url)) //send metadata for local files only { - QList <FileInfo *> list = Decoder::createPlayList(url, TRUE); + QList <FileInfo *> list = MetaDataManager::instance()->createPlayList(url, TRUE); if (!list.isEmpty()) { StateHandler::instance()->dispatch(list[0]->metaData()); diff --git a/src/qmmp/qmmpaudioengine.h b/src/qmmp/qmmpaudioengine.h index f6bc3432d..e83bda490 100644 --- a/src/qmmp/qmmpaudioengine.h +++ b/src/qmmp/qmmpaudioengine.h @@ -42,6 +42,7 @@ public: QmmpAudioEngine(QObject *parent); ~QmmpAudioEngine(); + bool play(); bool enqueue(InputSource *source); qint64 totalTime(); void seek(qint64 time); diff --git a/src/qmmp/soundcore.cpp b/src/qmmp/soundcore.cpp index 2165202b2..66ec5bfcd 100644 --- a/src/qmmp/soundcore.cpp +++ b/src/qmmp/soundcore.cpp @@ -30,7 +30,8 @@ #include "statehandler.h" #include "inputsource.h" #include "volumecontrol.h" - +#include "enginefactory.h" +#include "metadatamanager.h" #include "soundcore.h" SoundCore *SoundCore::m_instance = 0; @@ -48,6 +49,7 @@ SoundCore::SoundCore(QObject *parent) m_vis = 0; m_parentWidget = 0; m_engine = 0; + m_pendingEngine = 0; for (int i = 1; i < 10; ++i) m_bands[i] = 0; m_handler = new StateHandler(this); @@ -58,6 +60,7 @@ SoundCore::SoundCore(QObject *parent) connect(m_handler, SIGNAL(channelsChanged(int)), SIGNAL(channelsChanged(int))); connect(m_handler, SIGNAL(metaDataChanged ()), SIGNAL(metaDataChanged ())); connect(m_handler, SIGNAL(stateChanged (Qmmp::State)), SIGNAL(stateChanged(Qmmp::State))); + connect(m_handler, SIGNAL(stateChanged (Qmmp::State)), SLOT(startPendingEngine())); connect(m_handler, SIGNAL(aboutToFinish()), SIGNAL(aboutToFinish())); m_volumeControl = VolumeControl::create(this); connect(m_volumeControl, SIGNAL(volumeChanged(int, int)), SIGNAL(volumeChanged(int, int))); @@ -67,12 +70,16 @@ SoundCore::SoundCore(QObject *parent) SoundCore::~SoundCore() { stop(); + MetaDataManager::destroy(); } bool SoundCore::play(const QString &source, bool queue) { if(!queue) + { stop(); + qApp->processEvents(QEventLoop::ExcludeUserInputEvents); + } InputSource *s = InputSource::create(source, this); m_pendingSources.append(s); @@ -92,10 +99,15 @@ void SoundCore::stop() m_source.clear(); if(m_engine) m_engine->stop(); + qDeleteAll(m_pendingSources); + m_pendingSources.clear(); + if(m_pendingEngine) + delete m_pendingEngine; + m_pendingEngine = 0; //update VolumeControl delete m_volumeControl; m_volumeControl = VolumeControl::create(this); - connect(m_volumeControl, SIGNAL(volumeChanged(int, int)), SIGNAL(volumeChanged(int, int))); + connect(m_volumeControl, SIGNAL(volumeChanged(int, int)), SIGNAL(volumeChanged(int, int))); } void SoundCore::pause() @@ -167,8 +179,6 @@ void SoundCore::setSoftwareVolume(bool b) connect(m_volumeControl, SIGNAL(volumeChanged(int, int)), SIGNAL(volumeChanged(int, int))); if (m_engine) m_engine->mutex()->unlock(); - qDeleteAll(m_pendingSources); - m_pendingSources.clear(); } bool SoundCore::softwareVolume() @@ -230,17 +240,70 @@ bool SoundCore::enqueue(InputSource *s) if(m_engine->enqueue(s)) { m_source = s->url(); - m_engine->start(); + if(state() == Qmmp::Stopped) + m_engine->play(); } else { - s->deleteLater(); + //current engine doesn't support this stream, trying to find another + AbstractEngine *engine = new QmmpAudioEngine(this); //internal engine + if(!engine->enqueue(s)) + { + engine->deleteLater(); + engine = 0; + } + + if(!engine) + { + QList <EngineFactory*> factories = *AbstractEngine::factories(); + foreach(EngineFactory *f, *AbstractEngine::factories()) + { + engine = f->create(this); //engine plugin + if(!engine->enqueue(s)) + { + engine->deleteLater(); + engine = 0; + } + } + } + + if(!engine) //unsupported file format + { + s->deleteLater(); + return FALSE; + } + connect(engine, SIGNAL(playbackFinished()), SIGNAL(finished())); + if (m_handler->state() == Qmmp::Playing || m_handler->state() == Qmmp::Paused) + { + if(m_pendingEngine) + m_pendingEngine->deleteLater(); + m_pendingEngine = engine; + } + else + { + m_engine->deleteLater(); + m_engine = engine; + m_engine->play(); + m_pendingEngine = 0; + } return FALSE; } return TRUE; } +void SoundCore::startPendingEngine() +{ + if(state() == Qmmp::Stopped && m_pendingEngine) + { + if(m_engine) + delete m_engine; + m_engine = m_pendingEngine; + m_pendingEngine = 0; + m_engine->play(); + } +} + SoundCore* SoundCore::instance() { return m_instance; diff --git a/src/qmmp/soundcore.h b/src/qmmp/soundcore.h index 538a84f6e..0eb6b1cd3 100644 --- a/src/qmmp/soundcore.h +++ b/src/qmmp/soundcore.h @@ -125,7 +125,7 @@ public slots: void setVolume(int left, int right); /*! * This function plays file or stream with the given path \p source. - * Returns \b true if playback started successful or source is not a local file, + * Returns \b true if playback has been started successful or source is not a local file, * otherwise returns \b false. Useful for invalid files skipping. */ bool play(const QString &source, bool queue = FALSE); @@ -202,6 +202,7 @@ signals: private slots: bool enqueue(InputSource *); + void startPendingEngine(); private: Decoder* m_decoder; @@ -220,6 +221,7 @@ private: StateHandler *m_handler; VolumeControl *m_volumeControl; AbstractEngine *m_engine; + AbstractEngine *m_pendingEngine; QList<InputSource *> m_pendingSources; }; diff --git a/src/qmmpui/detailsdialog.cpp b/src/qmmpui/detailsdialog.cpp index e5b0e0fc5..6b5aa7032 100644 --- a/src/qmmpui/detailsdialog.cpp +++ b/src/qmmpui/detailsdialog.cpp @@ -23,10 +23,12 @@ #include <QFile> #include <QFileInfo> +#include <qmmp/metadatamanager.h> #include <qmmp/decoder.h> #include <qmmp/decoderfactory.h> #include <qmmp/metadatamodel.h> #include <qmmp/tagmodel.h> +#include <qmmp/abstractengine.h> #include "abstractplaylistitem.h" #include "tageditor.h" #include "detailsdialog.h" @@ -46,9 +48,13 @@ DetailsDialog::DetailsDialog(AbstractPlaylistItem *item, QWidget *parent) if(QFile::exists(item->url())) { + //TODO implement this inside MetaDataManager DecoderFactory *fact = Decoder::findByPath(item->url()); + EngineFactory *fact2 = AbstractEngine::findByPath(item->url()); if(fact) m_metaDataModel = fact->createMetaDataModel(item->url(), this); + else if (fact2) + m_metaDataModel = fact2->createMetaDataModel(item->url(), this); else return; @@ -75,7 +81,7 @@ DetailsDialog::~DetailsDialog() void DetailsDialog::printInfo() { - QList <FileInfo *> flist = Decoder::createPlayList(m_path, TRUE); + QList <FileInfo *> flist = MetaDataManager::instance()->createPlayList(m_path, TRUE); QMap <Qmmp::MetaData, QString> metaData; if(!flist.isEmpty() && QFile::exists(m_item->url())) metaData = flist.at(0)->metaData(); @@ -105,11 +111,14 @@ void DetailsDialog::printInfo() } QHash <QString, QString> ap = m_metaDataModel->audioProperties(); //line - formattedText.append("<tr>"); - formattedText.append("<td colspan=2>"); - formattedText.append("<hr>"); - formattedText.append("</td>"); - formattedText.append("</tr>"); + if(formattedText.trimmed() != "<TABLE>") + { + formattedText.append("<tr>"); + formattedText.append("<td colspan=2>"); + formattedText.append("<hr>"); + formattedText.append("</td>"); + formattedText.append("</tr>"); + } foreach(QString key, ap.keys()) formattedText += formatRow(key, ap.value(key)); diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp index ee300e2c4..74c4edc1f 100644 --- a/src/qmmpui/fileloader.cpp +++ b/src/qmmpui/fileloader.cpp @@ -17,8 +17,8 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include "fileloader.h" #include "playlistsettings.h" #include "playlistitem.h" @@ -26,7 +26,7 @@ FileLoader::FileLoader(QObject *parent) : QThread(parent),m_files_to_load(),m_directory() { - m_filters = Decoder::nameFilters(); + m_filters = MetaDataManager::instance()->nameFilters(); m_finished = false; } @@ -41,10 +41,10 @@ void FileLoader::addFiles(const QStringList &files) { if (files.isEmpty ()) return; - + bool use_meta = PlaylistSettings::instance()->useMetadata(); foreach(QString s, files) { - QList <FileInfo *> playList = Decoder::createPlayList(s, PlaylistSettings::instance()->useMetadata()); + QList <FileInfo *> playList = MetaDataManager::instance()->createPlayList(s, use_meta); foreach(FileInfo *info, playList) emit newPlayListItem(new PlayListItem(info)); if (m_finished) return; @@ -59,11 +59,11 @@ void FileLoader::addDirectory(const QString& s) dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList l = dir.entryInfoList(m_filters); + bool use_meta = PlaylistSettings::instance()->useMetadata(); for (int i = 0; i < l.size(); ++i) { QFileInfo fileInfo = l.at(i); - playList = Decoder::createPlayList(fileInfo.absoluteFilePath (), - PlaylistSettings::instance()->useMetadata()); + playList = MetaDataManager::instance()->createPlayList(fileInfo.absoluteFilePath (), use_meta); foreach(FileInfo *info, playList) emit newPlayListItem(new PlayListItem(info)); if (m_finished) return; diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp index 43038724e..0170fc650 100644 --- a/src/qmmpui/mediaplayer.cpp +++ b/src/qmmpui/mediaplayer.cpp @@ -204,6 +204,7 @@ void MediaPlayer::updateNextUrl() { m_core->play(m_model->nextItem()->url(), TRUE); m_nextUrl = m_model->nextItem()->url(); + qDebug("next url"); } else m_nextUrl.clear(); diff --git a/src/qmmpui/playlistitem.cpp b/src/qmmpui/playlistitem.cpp index d76ba16cc..21bc2fc1a 100644 --- a/src/qmmpui/playlistitem.cpp +++ b/src/qmmpui/playlistitem.cpp @@ -20,7 +20,7 @@ #include <QSettings> #include <QDir> -#include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include "playlistsettings.h" #include "playlistitem.h" @@ -90,7 +90,7 @@ void PlayListItem::updateTags() delete m_info; m_info = 0; } - QList <FileInfo *> list = Decoder::createPlayList(url()); + QList <FileInfo *> list = MetaDataManager::instance()->createPlayList(url()); if(!list.isEmpty() && !list.at(0)->path().contains("://")) { m_info = list.at(0); diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp index 3428c0390..cdc407174 100644 --- a/src/qmmpui/playlistmodel.cpp +++ b/src/qmmpui/playlistmodel.cpp @@ -32,7 +32,7 @@ #include <time.h> -#include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include <qmmp/decoderfactory.h> #include "playlistparser.h" @@ -453,7 +453,8 @@ void PlayListModel::addFile(const QString& path) { if (path.isEmpty()) return; - QList <FileInfo *> playList = Decoder::createPlayList(path, PlaylistSettings::instance()->useMetadata()); + QList <FileInfo *> playList = + MetaDataManager::instance()->createPlayList(path, PlaylistSettings::instance()->useMetadata()); foreach(FileInfo *info, playList) emit load(new PlayListItem(info)); @@ -997,7 +998,7 @@ void PlayListModel::clearInvalidItems() foreach(PlayListItem *item, m_items) { if(!item->url().contains("://") && - !(QFile::exists(item->url()) && Decoder::supports(item->url()))) + !(QFile::exists(item->url())))// && Decoder::supports(item->url()))) removeItem(item); } } diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 197ae8745..872c02d09 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -27,6 +27,7 @@ #include <qmmp/soundcore.h> #include <qmmp/visual.h> +#include <qmmp/metadatamanager.h> #include <qmmpui/generalhandler.h> #include <qmmpui/general.h> #include <qmmpui/playlistparser.h> @@ -296,8 +297,9 @@ void MainWindow::addDir() void MainWindow::addFile() { QStringList filters; - filters << tr("All Supported Bitstreams")+" (" + Decoder::nameFilters().join (" ") +")"; - filters << Decoder::filters(); + filters << tr("All Supported Bitstreams")+" (" + + MetaDataManager::instance()->nameFilters().join (" ") +")"; + filters << MetaDataManager::instance()->filters(); FileDialog::popup(this, FileDialog::AddDirsFiles, &m_lastDir, m_playListModel, SLOT(addFileList(const QStringList&)), tr("Select one or more files to open"), filters.join(";;")); |
