diff options
| -rw-r--r-- | src/qmmp/effect.cpp | 131 | ||||
| -rw-r--r-- | src/qmmp/effect.h | 16 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 5 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache.cpp | 18 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache_p.h | 6 | ||||
| -rw-r--r-- | src/qmmpui/aboutdialog.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/configdialog.cpp | 2 |
7 files changed, 103 insertions, 77 deletions
diff --git a/src/qmmp/effect.cpp b/src/qmmp/effect.cpp index 780e32ccf..517b6b45c 100644 --- a/src/qmmp/effect.cpp +++ b/src/qmmp/effect.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2009 by Ilya Kotov * + * Copyright (C) 2007-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -17,13 +17,12 @@ * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include <QtGui> + #include <QStringList> #include <QDir> -#include <QApplication> -#include <QHash> #include "qmmpaudioengine_p.h" #include "qmmp.h" +#include "qmmpplugincache_p.h" #include "effectfactory.h" #include "effect.h" @@ -70,106 +69,114 @@ EffectFactory* Effect::factory() const return m_factory; } -bool effectCompareFunc(EffectFactory *e1, EffectFactory *e2) +bool _effectCacheCompareFunc(QmmpPluginCache *e1, QmmpPluginCache *e2) { - return e1->properties().priority > e2->properties().priority; + return e1->priority() > e2->priority(); } //static members -QList<EffectFactory*> *Effect::m_factories = 0; -QHash <EffectFactory*, QString> *Effect::m_files = 0; +QList<QmmpPluginCache*> *Effect::m_cache = 0; +QStringList Effect::m_enabledNames; -void Effect::checkFactories() +void Effect::loadPlugins() { - if (!m_factories) - { - m_factories = new QList<EffectFactory *>; - m_files = new QHash <EffectFactory*, QString>; - - QDir pluginsDir (Qmmp::pluginsPath()); - pluginsDir.cd("Effect"); + if(m_cache) + return; - foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + m_cache = new QList<QmmpPluginCache *>; + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QDir pluginsDir (Qmmp::pluginsPath()); + pluginsDir.cd("Effect"); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + QmmpPluginCache *item = new QmmpPluginCache(pluginsDir.absoluteFilePath(fileName), &settings); + if(item->hasError()) { - QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); - QObject *plugin = loader.instance(); - if (loader.isLoaded()) - qDebug("Effect: loaded plugin %s", qPrintable(fileName)); - else - qWarning("Effect: %s", qPrintable(loader.errorString ())); - - EffectFactory *factory = 0; - if (plugin) - factory = qobject_cast<EffectFactory *>(plugin); - - if (factory) - { - m_factories->append(factory); - m_files->insert(factory, pluginsDir.absoluteFilePath(fileName)); - qApp->installTranslator(factory->createTranslator(qApp)); - } + delete item; + continue; } - qSort(m_factories->begin(), m_factories->end(), effectCompareFunc); + m_cache->append(item); } + + qSort(m_cache->begin(), m_cache->end(), _effectCacheCompareFunc); + m_enabledNames = settings.value("Effect/enabled_plugins").toStringList(); } Effect* Effect::create(EffectFactory *factory) { - checkFactories(); + loadPlugins(); Effect *effect = factory->create(); effect->m_factory = factory; return effect; } -QList<EffectFactory*> *Effect::factories() +QList<EffectFactory *> Effect::factories() { - checkFactories(); - return m_factories; + loadPlugins(); + QList<EffectFactory *> list; + foreach (QmmpPluginCache *item, *m_cache) + { + if(item->effectFactory()) + list.append(item->effectFactory()); + } + return list; +} + +QList<EffectFactory *> Effect::enabledFactories() +{ + loadPlugins(); + QList<EffectFactory *> list; + foreach (QmmpPluginCache *item, *m_cache) + { + if(m_enabledNames.contains(item->shortName()) && item->effectFactory()) + list.append(item->effectFactory()); + } + return list; } QString Effect::file(EffectFactory *factory) { - checkFactories(); - return m_files->value(factory); + loadPlugins(); + foreach(QmmpPluginCache *item, *m_cache) + { + if(item->shortName() == factory->properties().shortName) + return item->file(); + } + return QString(); } void Effect::setEnabled(EffectFactory* factory, bool enable) { - checkFactories(); - if(!m_factories->contains(factory)) + loadPlugins(); + if (!factories().contains(factory)) return; - QString name = factory->properties().shortName; - QSettings settings (Qmmp::configFile(), QSettings::IniFormat); - QStringList effList = settings.value("Effect/enabled_plugins").toStringList(); + if(enable == isEnabled(factory)) + return; if(enable) { - if (!effList.contains(name)) - { - effList << name; - if(QmmpAudioEngine::instance()) - QmmpAudioEngine::instance()->addEffect(factory); - } + if(QmmpAudioEngine::instance()) + QmmpAudioEngine::instance()->addEffect(factory); + m_enabledNames.append(factory->properties().shortName); } - else if (effList.contains(name)) + else { - effList.removeAll(name); + m_enabledNames.removeAll(factory->properties().shortName); if(QmmpAudioEngine::instance()) QmmpAudioEngine::instance()->removeEffect(factory); } - settings.setValue("Effect/enabled_plugins", effList); + + m_enabledNames.removeDuplicates(); + + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + settings.setValue("Effect/enabled_plugins", m_enabledNames); } bool Effect::isEnabled(EffectFactory* factory) { - checkFactories(); - if(!m_factories->contains(factory)) - return false; - QString name = factory->properties().shortName; - QSettings settings (Qmmp::configFile(), QSettings::IniFormat); - QStringList effList = settings.value("Effect/enabled_plugins").toStringList(); - return effList.contains(name); + loadPlugins(); + return m_enabledNames.contains(factory->properties().shortName); } diff --git a/src/qmmp/effect.h b/src/qmmp/effect.h index ceee0b14c..3c9262145 100644 --- a/src/qmmp/effect.h +++ b/src/qmmp/effect.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2009 by Ilya Kotov * + * Copyright (C) 2007-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -22,11 +22,11 @@ #include <QList> #include <QStringList> -#include <QHash> #include "audioparameters.h" #include "buffer.h" class EffectFactory; +class QmmpPluginCache; /*! @brief The Effect class provides the base interface class of audio effects. * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -83,7 +83,11 @@ public: /*! * Returns a list of effect factories. */ - static QList<EffectFactory*> *factories(); + static QList<EffectFactory*> factories(); + /*! + * Returns a list of enabled effect factories. + */ + static QList<EffectFactory*> enabledFactories(); /*! * Returns plugin file path. * @param factory Effect plugin factory. @@ -106,9 +110,9 @@ private: quint32 m_freq; int m_chan; Qmmp::AudioFormat m_format; - static void checkFactories(); - static QList<EffectFactory*> *m_factories; - static QHash <EffectFactory*, QString> *m_files; + static void loadPlugins(); + static QList<QmmpPluginCache*> *m_cache; + static QStringList m_enabledNames; }; #endif diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 5b4cc7d91..a1df412f3 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -579,11 +579,8 @@ void QmmpAudioEngine::prepareEffects(Decoder *d) m_ap = m_effects.at(0)->audioParameters(); } - foreach(EffectFactory *factory, *Effect::factories()) + foreach(EffectFactory *factory, Effect::enabledFactories()) { - if(!Effect::isEnabled(factory)) - continue; - Effect *effect = 0; foreach(Effect *e, tmp_effects) //find effect { diff --git a/src/qmmp/qmmpplugincache.cpp b/src/qmmp/qmmpplugincache.cpp index 22809d017..7705874ff 100644 --- a/src/qmmp/qmmpplugincache.cpp +++ b/src/qmmp/qmmpplugincache.cpp @@ -27,6 +27,7 @@ #include "decoderfactory.h" #include "outputfactory.h" #include "enginefactory.h" +#include "effectfactory.h" #include "qmmpplugincache_p.h" QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) @@ -36,6 +37,7 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_decoderFactory = 0; m_outputFactory = 0; m_engineFactory = 0; + m_effectFactory = 0; m_priority = 0; bool update = false; QFileInfo info(file); @@ -80,6 +82,11 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_shortName = factory->properties().shortName; m_priority = 0; } + else if(EffectFactory *factory = effectFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = factory->properties().priority; + } else { qWarning("QmmpPluginCache: unknown plugin type: %s", qPrintable(m_path)); @@ -148,6 +155,17 @@ EngineFactory *QmmpPluginCache::engineFactory() return m_engineFactory; } +EffectFactory *QmmpPluginCache::effectFactory() +{ + if(!m_effectFactory) + { + m_effectFactory = qobject_cast<EffectFactory *> (instance()); + if(m_effectFactory) + qApp->installTranslator(m_effectFactory->createTranslator(qApp)); + } + return m_effectFactory; +} + bool QmmpPluginCache::hasError() const { return m_error; diff --git a/src/qmmp/qmmpplugincache_p.h b/src/qmmp/qmmpplugincache_p.h index 7338fc26e..6d5dcc591 100644 --- a/src/qmmp/qmmpplugincache_p.h +++ b/src/qmmp/qmmpplugincache_p.h @@ -28,6 +28,7 @@ class DecoderFactory; class OutputFactory; class EngineFactory; +class EffectFactory; /*! @internal * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -45,9 +46,7 @@ public: DecoderFactory *decoderFactory(); OutputFactory *outputFactory(); EngineFactory *engineFactory(); - - - //EngineFactory *engineFactory(); + EffectFactory *effectFactory(); static void cleanup(QSettings *settings); @@ -60,6 +59,7 @@ private: DecoderFactory *m_decoderFactory; OutputFactory *m_outputFactory; EngineFactory *m_engineFactory; + EffectFactory *m_effectFactory; int m_priority; }; diff --git a/src/qmmpui/aboutdialog.cpp b/src/qmmpui/aboutdialog.cpp index efd339ca4..84a896ebe 100644 --- a/src/qmmpui/aboutdialog.cpp +++ b/src/qmmpui/aboutdialog.cpp @@ -102,7 +102,7 @@ QString AboutDialog::loadAbout() text.append("</ul>"); text.append("<h5>"+tr("Effect plugins:")+"</h5>"); text.append("<ul type=\"square\">"); - foreach(EffectFactory *fact, *Effect::factories()) + foreach(EffectFactory *fact, Effect::factories()) { text.append("<li>"); text.append(fact->properties().name); diff --git a/src/qmmpui/configdialog.cpp b/src/qmmpui/configdialog.cpp index cf0114b5b..af9811f84 100644 --- a/src/qmmpui/configdialog.cpp +++ b/src/qmmpui/configdialog.cpp @@ -202,7 +202,7 @@ void ConfigDialog::loadPluginsInfo() load effect plugin information */ item = new QTreeWidgetItem (m_ui->treeWidget, QStringList() << tr("Effects")); - foreach(EffectFactory *factory, *Effect::factories()) + foreach(EffectFactory *factory, Effect::factories()) { new PluginItem (item, factory, Effect::file(factory)); } |
