aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-12 14:48:20 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-12 14:48:20 +0000
commite1a905d3ae24485f0c85d4a787b12dcf17ea3cad (patch)
tree7c86ab3444ee4b096e86303782e56ea5fa89c4a4 /src
parent17821c28c6944d8bc6b88bcbf2614d758ef41959 (diff)
downloadqmmp-e1a905d3ae24485f0c85d4a787b12dcf17ea3cad.tar.gz
qmmp-e1a905d3ae24485f0c85d4a787b12dcf17ea3cad.tar.bz2
qmmp-e1a905d3ae24485f0c85d4a787b12dcf17ea3cad.zip
added engine plugins cache
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3453 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/General/mpris/mpris2/root2object.cpp2
-rw-r--r--src/qmmp/abstractengine.cpp149
-rw-r--r--src/qmmp/abstractengine.h16
-rw-r--r--src/qmmp/decoder.cpp4
-rw-r--r--src/qmmp/metadatamanager.cpp12
-rw-r--r--src/qmmp/qmmpplugincache.cpp18
-rw-r--r--src/qmmp/qmmpplugincache_p.h3
-rw-r--r--src/qmmpui/configdialog.cpp2
8 files changed, 118 insertions, 88 deletions
diff --git a/src/plugins/General/mpris/mpris2/root2object.cpp b/src/plugins/General/mpris/mpris2/root2object.cpp
index 6faf180e6..1508546c0 100644
--- a/src/plugins/General/mpris/mpris2/root2object.cpp
+++ b/src/plugins/General/mpris/mpris2/root2object.cpp
@@ -66,7 +66,7 @@ QStringList Root2Object::supportedMimeTypes() const
QStringList mimeTypes;
foreach(DecoderFactory *factory, Decoder::enabledFactories())
mimeTypes << factory->properties().contentTypes;
- foreach(EngineFactory *factory, *AbstractEngine::factories())
+ foreach(EngineFactory *factory, AbstractEngine::enabledFactories())
mimeTypes << factory->properties().contentTypes;
mimeTypes.removeDuplicates();
return mimeTypes;
diff --git a/src/qmmp/abstractengine.cpp b/src/qmmp/abstractengine.cpp
index 47ede5d7c..b66d866d7 100644
--- a/src/qmmp/abstractengine.cpp
+++ b/src/qmmp/abstractengine.cpp
@@ -24,6 +24,7 @@
#include <QApplication>
#include "enginefactory.h"
#include "qmmpaudioengine_p.h"
+#include "qmmpplugincache_p.h"
#include "statehandler.h"
#include "qmmp.h"
#include "abstractengine.h"
@@ -38,56 +39,29 @@ QMutex *AbstractEngine::mutex()
}
// static methods
-QList<EngineFactory*> *AbstractEngine::m_factories = 0;
-QList<EngineFactory*> *AbstractEngine::m_disabledFactories = 0;
-QHash <EngineFactory*, QString> *AbstractEngine::m_files = 0;
+QStringList AbstractEngine::m_disabledNames;
+QList<QmmpPluginCache*> *AbstractEngine::m_cache = 0;
-void AbstractEngine::checkFactories()
+void AbstractEngine::loadPlugins()
{
- if (!m_factories)
+ if (m_cache)
+ return;
+
+ m_cache = new QList<QmmpPluginCache*>;
+ QSettings settings (Qmmp::configFile(), QSettings::IniFormat);
+ QDir pluginsDir (Qmmp::pluginsPath());
+ pluginsDir.cd("Engines");
+ foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
- QSettings settings (Qmmp::configFile(), QSettings::IniFormat);
- QStringList disabledNames = settings.value("Engine/disabled_plugins").toStringList ();
- m_files = new QHash <EngineFactory*, QString>;
- m_factories = new QList<EngineFactory *>;
- m_disabledFactories = new QList<EngineFactory *>;
-
- QDir pluginsDir (Qmmp::pluginsPath());
- pluginsDir.cd("Engines");
- foreach (QString fileName, pluginsDir.entryList(QDir::Files))
- {
- QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
- QObject *plugin = loader.instance();
- if (loader.isLoaded())
- qDebug("AbstractEngine: loaded plugin %s", qPrintable(fileName));
- else
- qWarning("AbstractEngine: %s", qPrintable(loader.errorString ()));
- EngineFactory *factory = 0;
- if (plugin)
- factory = qobject_cast<EngineFactory *>(plugin);
-
- if (factory)
- {
- m_factories->append(factory);
- m_files->insert(factory, pluginsDir.absoluteFilePath(fileName));
- qApp->installTranslator(factory->createTranslator(qApp));
- if(disabledNames.contains(factory->properties().shortName))
- m_disabledFactories->append(factory);
- }
- }
- //remove physically deleted plugins from disabled list
- QStringList names;
- foreach (EngineFactory *factory, *m_factories)
- {
- names.append(factory->properties().shortName);
- }
- foreach (QString name, disabledNames)
+ QmmpPluginCache *item = new QmmpPluginCache(pluginsDir.absoluteFilePath(fileName), &settings);
+ if(item->hasError())
{
- if (!names.contains(name))
- disabledNames.removeAll(name);
+ delete item;
+ continue;
}
- settings.setValue("Engine/disabled_plugins", disabledNames);
+ m_cache->append(item);
}
+ m_disabledNames = settings.value("Engine/disabled_plugins").toStringList();
}
AbstractEngine *AbstractEngine::create(InputSource *s, QObject *parent)
@@ -102,12 +76,15 @@ AbstractEngine *AbstractEngine::create(InputSource *s, QObject *parent)
return engine;
- checkFactories();
- foreach(EngineFactory *f, *m_factories)
+ loadPlugins();
+ foreach(QmmpPluginCache *item, *m_cache)
{
- if(!isEnabled(f))
+ if(m_disabledNames.contains(item->shortName()))
+ continue;
+ EngineFactory *fact = item->engineFactory();
+ if(!fact)
continue;
- engine = f->create(parent); //engine plugin
+ engine = fact->create(parent); //engine plugin
if(!engine->enqueue(s))
{
engine->deleteLater();
@@ -119,18 +96,41 @@ AbstractEngine *AbstractEngine::create(InputSource *s, QObject *parent)
return engine;
}
-QList<EngineFactory*> *AbstractEngine::factories()
+QList<EngineFactory *> AbstractEngine::factories()
+{
+ loadPlugins();
+ QList<EngineFactory *> list;
+ foreach (QmmpPluginCache *item, *m_cache)
+ {
+ if(item->engineFactory())
+ list.append(item->engineFactory());
+ }
+ return list;
+}
+
+QList<EngineFactory *> AbstractEngine::enabledFactories()
{
- checkFactories();
- return m_factories;
+ loadPlugins();
+ QList<EngineFactory *> list;
+ foreach (QmmpPluginCache *item, *m_cache)
+ {
+ if(m_disabledNames.contains(item->shortName()))
+ continue;
+ if(item->engineFactory())
+ list.append(item->engineFactory());
+ }
+ return list;
}
EngineFactory *AbstractEngine::findByPath(const QString& source)
{
- checkFactories();
- foreach(EngineFactory *fact, *m_factories)
+ loadPlugins();
+ foreach(QmmpPluginCache *item, *m_cache)
{
- if (fact->supports(source) && isEnabled(fact))
+ if(m_disabledNames.contains(item->shortName()))
+ continue;
+ EngineFactory *fact = item->engineFactory();
+ if (fact && fact->supports(source))
return fact;
}
return 0;
@@ -138,48 +138,51 @@ EngineFactory *AbstractEngine::findByPath(const QString& source)
void AbstractEngine::setEnabled(EngineFactory* factory, bool enable)
{
- checkFactories();
- if (!m_factories->contains(factory))
+ loadPlugins();
+ if (!factories().contains(factory))
return;
if(enable == isEnabled(factory))
return;
if(enable)
- m_disabledFactories->removeAll(factory);
+ m_disabledNames.removeAll(factory->properties().shortName);
else
- m_disabledFactories->append(factory);
+ m_disabledNames.append(factory->properties().shortName);
- QStringList disabledNames;
- foreach(EngineFactory *f, *m_disabledFactories)
- {
- disabledNames << f->properties().shortName;
- }
- disabledNames.removeDuplicates();
+ m_disabledNames.removeDuplicates();
QSettings settings (Qmmp::configFile(), QSettings::IniFormat);
- settings.setValue("Engine/disabled_plugins", disabledNames);
+ settings.setValue("Engine/disabled_plugins", m_disabledNames);
}
bool AbstractEngine::isEnabled(EngineFactory* factory)
{
- checkFactories();
- return !m_disabledFactories->contains(factory);
+ loadPlugins();
+ return !m_disabledNames.contains(factory->properties().shortName);
}
QString AbstractEngine::file(EngineFactory *factory)
{
- checkFactories();
- return m_files->value(factory);
+ loadPlugins();
+ foreach(QmmpPluginCache *item, *m_cache)
+ {
+ if(item->shortName() == factory->properties().shortName)
+ return item->file();
+ }
+ return QString();
}
QStringList AbstractEngine::protocols()
{
- checkFactories();
+ loadPlugins();
QStringList protocolsList;
- foreach(EngineFactory *f, *m_factories)
+
+ foreach (QmmpPluginCache *item, *m_cache)
{
- if(isEnabled(f))
- protocolsList << f->properties().protocols;
+ if(m_disabledNames.contains(item->shortName()))
+ continue;
+ if(item->engineFactory())
+ protocolsList << item->engineFactory()->properties().protocols;
}
protocolsList.removeDuplicates();
return protocolsList;
diff --git a/src/qmmp/abstractengine.h b/src/qmmp/abstractengine.h
index 907acb1e4..597585a42 100644
--- a/src/qmmp/abstractengine.h
+++ b/src/qmmp/abstractengine.h
@@ -29,6 +29,7 @@
class QIODevice;
class InputSource;
+class QmmpPluginCache;
/*! @brief The AbstractEngine class provides the base interface class of audio audio engines.
@@ -82,9 +83,13 @@ public:
*/
static AbstractEngine *create(InputSource *s, QObject *parent = 0);
/*!
- * Returns a list of decoder factories.
+ * Returns a list of engine factories.
*/
- static QList<EngineFactory*> *factories();
+ static QList<EngineFactory*> factories();
+ /*!
+ * Returns a list of enabled engine factories.
+ */
+ static QList<EngineFactory*> enabledFactories();
/*!
* Returns EngineFactory pointer which supports file \b path or 0 if file \b path is unsupported
*/
@@ -113,10 +118,9 @@ public:
private:
QMutex m_mutex;
- static void checkFactories();
- static QList<EngineFactory*> *m_factories;
- static QList<EngineFactory*> *m_disabledFactories;
- static QHash <EngineFactory*, QString> *m_files;
+ static void loadPlugins();
+ static QList<QmmpPluginCache*> *m_cache;
+ static QStringList m_disabledNames;
};
diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp
index 4719eb92c..f47679ce7 100644
--- a/src/qmmp/decoder.cpp
+++ b/src/qmmp/decoder.cpp
@@ -288,7 +288,9 @@ QList<DecoderFactory *> Decoder::enabledFactories()
QList<DecoderFactory *> list;
foreach (QmmpPluginCache *item, *m_cache)
{
- if(!m_disabledNames.contains(item->shortName()) && item->decoderFactory())
+ if(m_disabledNames.contains(item->shortName()))
+ continue;
+ if(item->decoderFactory())
list.append(item->decoderFactory());
}
return list;
diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp
index 87f4625a2..c1a0acf66 100644
--- a/src/qmmp/metadatamanager.cpp
+++ b/src/qmmp/metadatamanager.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2012 by Ilya Kotov *
+ * Copyright (C) 2009-2013 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -101,9 +101,9 @@ MetaDataModel* MetaDataManager::createMetaDataModel(const QString &path, QObject
{
return fact->createMetaDataModel(path, parent);
}
- foreach(efact, *AbstractEngine::factories())
+ foreach(efact, AbstractEngine::enabledFactories())
{
- if(efact->properties().protocols.contains(scheme) && AbstractEngine::isEnabled(efact))
+ if(efact->properties().protocols.contains(scheme))
model = efact->createMetaDataModel(path, parent);
if(model)
return model;
@@ -120,9 +120,9 @@ QStringList MetaDataManager::filters() const
if (!fact->properties().filters.isEmpty())
filters << fact->properties().description + " (" + fact->properties().filters.join(" ") + ")";
}
- foreach(EngineFactory *fact, *AbstractEngine::factories())
+ foreach(EngineFactory *fact, AbstractEngine::enabledFactories())
{
- if (AbstractEngine::isEnabled(fact) && !fact->properties().filters.isEmpty())
+ if (!fact->properties().filters.isEmpty())
filters << fact->properties().description + " (" + fact->properties().filters.join(" ") + ")";
}
return filters;
@@ -136,7 +136,7 @@ QStringList MetaDataManager::nameFilters() const
if (Decoder::isEnabled(fact))
filters << fact->properties().filters;
}
- foreach(EngineFactory *fact, *AbstractEngine::factories())
+ foreach(EngineFactory *fact, AbstractEngine::enabledFactories())
{
if (AbstractEngine::isEnabled(fact))
filters << fact->properties().filters;
diff --git a/src/qmmp/qmmpplugincache.cpp b/src/qmmp/qmmpplugincache.cpp
index 53055937d..22809d017 100644
--- a/src/qmmp/qmmpplugincache.cpp
+++ b/src/qmmp/qmmpplugincache.cpp
@@ -26,6 +26,7 @@
#include <QTranslator>
#include "decoderfactory.h"
#include "outputfactory.h"
+#include "enginefactory.h"
#include "qmmpplugincache_p.h"
QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings)
@@ -34,6 +35,7 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings)
m_instance = 0;
m_decoderFactory = 0;
m_outputFactory = 0;
+ m_engineFactory = 0;
m_priority = 0;
bool update = false;
QFileInfo info(file);
@@ -73,6 +75,11 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings)
m_shortName = factory->properties().shortName;
m_priority = 0;
}
+ else if(EngineFactory *factory = engineFactory())
+ {
+ m_shortName = factory->properties().shortName;
+ m_priority = 0;
+ }
else
{
qWarning("QmmpPluginCache: unknown plugin type: %s", qPrintable(m_path));
@@ -130,6 +137,17 @@ OutputFactory *QmmpPluginCache::outputFactory()
return m_outputFactory;
}
+EngineFactory *QmmpPluginCache::engineFactory()
+{
+ if(!m_engineFactory)
+ {
+ m_engineFactory = qobject_cast<EngineFactory *> (instance());
+ if(m_engineFactory)
+ qApp->installTranslator(m_engineFactory->createTranslator(qApp));
+ }
+ return m_engineFactory;
+}
+
bool QmmpPluginCache::hasError() const
{
return m_error;
diff --git a/src/qmmp/qmmpplugincache_p.h b/src/qmmp/qmmpplugincache_p.h
index bb0235d59..7338fc26e 100644
--- a/src/qmmp/qmmpplugincache_p.h
+++ b/src/qmmp/qmmpplugincache_p.h
@@ -27,6 +27,7 @@
class DecoderFactory;
class OutputFactory;
+class EngineFactory;
/*! @internal
* @author Ilya Kotov <forkotov02@hotmail.ru>
@@ -43,6 +44,7 @@ public:
DecoderFactory *decoderFactory();
OutputFactory *outputFactory();
+ EngineFactory *engineFactory();
//EngineFactory *engineFactory();
@@ -57,6 +59,7 @@ private:
QObject *m_instance;
DecoderFactory *m_decoderFactory;
OutputFactory *m_outputFactory;
+ EngineFactory *m_engineFactory;
int m_priority;
};
diff --git a/src/qmmpui/configdialog.cpp b/src/qmmpui/configdialog.cpp
index a34f6bdfa..cf0114b5b 100644
--- a/src/qmmpui/configdialog.cpp
+++ b/src/qmmpui/configdialog.cpp
@@ -192,7 +192,7 @@ void ConfigDialog::loadPluginsInfo()
load audio engines information
*/
item = new QTreeWidgetItem (m_ui->treeWidget, QStringList() << tr("Engines"));
- foreach(EngineFactory *factory, *AbstractEngine::factories())
+ foreach(EngineFactory *factory, AbstractEngine::factories())
{
new PluginItem (item, factory, AbstractEngine::file(factory));
}