aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-12 15:20:34 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-12 15:20:34 +0000
commit6d45a16214003ee1ead1822281d0e1a8014529cf (patch)
treeefb11e8cf4ebab5b914a64841cf7102e8ece45d9
parente1a905d3ae24485f0c85d4a787b12dcf17ea3cad (diff)
downloadqmmp-6d45a16214003ee1ead1822281d0e1a8014529cf.tar.gz
qmmp-6d45a16214003ee1ead1822281d0e1a8014529cf.tar.bz2
qmmp-6d45a16214003ee1ead1822281d0e1a8014529cf.zip
added effect plugin cache
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3454 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmp/effect.cpp131
-rw-r--r--src/qmmp/effect.h16
-rw-r--r--src/qmmp/qmmpaudioengine.cpp5
-rw-r--r--src/qmmp/qmmpplugincache.cpp18
-rw-r--r--src/qmmp/qmmpplugincache_p.h6
-rw-r--r--src/qmmpui/aboutdialog.cpp2
-rw-r--r--src/qmmpui/configdialog.cpp2
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));
}