aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-10-09 20:01:12 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-10-09 20:01:12 +0000
commit7a3c89bf2d71b74a8edbc39ec1264c68307cc888 (patch)
treed1d062c44d9d3c29d5299a59305585e87b00190b /src
parent75380f4441ca591b3a501a13da8fe2428f730933 (diff)
downloadqmmp-7a3c89bf2d71b74a8edbc39ec1264c68307cc888.tar.gz
qmmp-7a3c89bf2d71b74a8edbc39ec1264c68307cc888.tar.bz2
qmmp-7a3c89bf2d71b74a8edbc39ec1264c68307cc888.zip
added engine api, enabled mplayer plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1296 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/CMakeLists.txt1
-rw-r--r--src/plugins/Engines/CMakeLists.txt5
-rw-r--r--src/plugins/Engines/Engines.pro4
-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.pro34
-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.txt5
-rw-r--r--src/plugins/Input/cue/cueparser.cpp5
-rw-r--r--src/plugins/Input/flac/cueparser.cpp4
-rw-r--r--src/plugins/Input/mplayer/detailsdialog.ui390
-rw-r--r--src/plugins/Input/mplayer/mplayer.pro45
-rw-r--r--src/plugins/Input/wavpack/cueparser.cpp6
-rw-r--r--src/plugins/plugins.pro3
-rw-r--r--src/qmmp/CMakeLists.txt2
-rw-r--r--src/qmmp/abstractengine.cpp42
-rw-r--r--src/qmmp/abstractengine.h29
-rw-r--r--src/qmmp/decoder.cpp43
-rw-r--r--src/qmmp/decoder.h15
-rw-r--r--src/qmmp/enginefactory.h4
-rw-r--r--src/qmmp/metadatamanager.cpp116
-rw-r--r--src/qmmp/metadatamanager.h67
-rw-r--r--src/qmmp/qmmp.pro6
-rw-r--r--src/qmmp/qmmpaudioengine.cpp21
-rw-r--r--src/qmmp/qmmpaudioengine.h1
-rw-r--r--src/qmmp/soundcore.cpp75
-rw-r--r--src/qmmp/soundcore.h4
-rw-r--r--src/qmmpui/detailsdialog.cpp21
-rw-r--r--src/qmmpui/fileloader.cpp12
-rw-r--r--src/qmmpui/mediaplayer.cpp1
-rw-r--r--src/qmmpui/playlistitem.cpp4
-rw-r--r--src/qmmpui/playlistmodel.cpp7
-rw-r--r--src/ui/mainwindow.cpp6
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(";;"));