diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-05-12 14:48:20 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-05-12 14:48:20 +0000 |
| commit | e1a905d3ae24485f0c85d4a787b12dcf17ea3cad (patch) | |
| tree | 7c86ab3444ee4b096e86303782e56ea5fa89c4a4 | |
| parent | 17821c28c6944d8bc6b88bcbf2614d758ef41959 (diff) | |
| download | qmmp-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
| -rw-r--r-- | src/plugins/General/mpris/mpris2/root2object.cpp | 2 | ||||
| -rw-r--r-- | src/qmmp/abstractengine.cpp | 149 | ||||
| -rw-r--r-- | src/qmmp/abstractengine.h | 16 | ||||
| -rw-r--r-- | src/qmmp/decoder.cpp | 4 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.cpp | 12 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache.cpp | 18 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache_p.h | 3 | ||||
| -rw-r--r-- | src/qmmpui/configdialog.cpp | 2 |
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)); } |
