aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-09-04 08:21:59 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-09-04 08:21:59 +0000
commitfce26b0f17bf4d60f1d736117e70f0b98e43bd76 (patch)
tree3b8dfe5221aaac93d32e4886dbd0a6932df82e2c
parent743b5c224f29c875fa3ac9cedbe571471f6e7b88 (diff)
downloadqmmp-fce26b0f17bf4d60f1d736117e70f0b98e43bd76.tar.gz
qmmp-fce26b0f17bf4d60f1d736117e70f0b98e43bd76.tar.bz2
qmmp-fce26b0f17bf4d60f1d736117e70f0b98e43bd76.zip
prepare for crossfade support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1870 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmp/effect.cpp38
-rw-r--r--src/qmmp/effect.h5
-rw-r--r--src/qmmp/qmmpaudioengine.cpp63
3 files changed, 72 insertions, 34 deletions
diff --git a/src/qmmp/effect.cpp b/src/qmmp/effect.cpp
index 6bdc9eb3a..0b8b622ab 100644
--- a/src/qmmp/effect.cpp
+++ b/src/qmmp/effect.cpp
@@ -21,6 +21,7 @@
#include <QStringList>
#include <QDir>
#include <QApplication>
+#include <QHash>
#include "qmmpaudioengine.h"
#include "qmmp.h"
#include "effectfactory.h"
@@ -59,7 +60,7 @@ Qmmp::AudioFormat Effect::format()
return m_format;
}
-const AudioParameters Effect::audioParameters() const
+const AudioParameters Effect::audioParameters() const
{
return AudioParameters(m_freq, m_chan, m_format);
}
@@ -69,6 +70,11 @@ EffectFactory* Effect::factory() const
return m_factory;
}
+bool effectCompareFunc(EffectFactory *e1, EffectFactory *e2)
+{
+ return e1->properties().priority > e2->properties().priority;
+}
+
//static members
QList<EffectFactory*> *Effect::m_factories = 0;
@@ -83,6 +89,7 @@ void Effect::checkFactories()
QDir pluginsDir (Qmmp::pluginsPath());
pluginsDir.cd("Effect");
+ QHash <EffectFactory*, QString> m_hash;
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
@@ -99,33 +106,28 @@ void Effect::checkFactories()
if (factory)
{
m_factories->append(factory);
- m_files << pluginsDir.absoluteFilePath(fileName);
+ m_hash.insert(factory, pluginsDir.absoluteFilePath(fileName));
qApp->installTranslator(factory->createTranslator(qApp));
}
}
+ qSort(m_factories->begin(), m_factories->end(), effectCompareFunc);
+ foreach(EffectFactory *factory, *m_factories) //generate files list with same order
+ {
+ m_files << m_hash.value(factory);
+ }
}
}
-bool effectCompareFunc(Effect *e1, Effect *e2)
-{
- return e1->factory()->properties().priority > e2->factory()->properties().priority;
-}
-
-QList<Effect*> Effect::create()
+Effect* Effect::create(EffectFactory *factory)
{
checkFactories();
- QList<Effect*> effects;
- EffectFactory *factory = 0;
- foreach (factory, *m_factories)
+ Effect *effect = 0;
+ if(isEnabled(factory))
{
- if(isEnabled(factory))
- {
- effects.append(factory->create());
- effects.last()->m_factory = factory;
- }
+ effect = factory->create();
+ effect->m_factory = factory;
}
- qSort(effects.begin(), effects.end(), effectCompareFunc);
- return effects;
+ return effect;
}
QList<EffectFactory*> *Effect::factories()
diff --git a/src/qmmp/effect.h b/src/qmmp/effect.h
index eacee0ca9..eb047e2fc 100644
--- a/src/qmmp/effect.h
+++ b/src/qmmp/effect.h
@@ -75,9 +75,10 @@ public:
*/
EffectFactory* factory() const;
/*!
- * Creates a list of enabled effects.
+ * Creates effect object from \b factory. Returns effect objects if factory is enabled,
+ * otherwise returns \b 0.
*/
- static QList<Effect*> create();
+ static Effect* create(EffectFactory *factory);
/*!
* Returns a list of effect factories.
*/
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 3d92b8f76..4f34dd79e 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -44,7 +44,6 @@ QmmpAudioEngine::QmmpAudioEngine(QObject *parent)
{
m_output_buf = new unsigned char[QMMP_BUFFER_SIZE];
qRegisterMetaType<Qmmp::State>("Qmmp::State");
- m_effects = Effect::create();
m_bks = QMMP_BLOCK_SIZE;
m_decoder = 0;
m_output = 0;
@@ -174,7 +173,7 @@ void QmmpAudioEngine::addEffect(EffectFactory *factory)
}
else
{
- qDebug("QmmpAudioEngine: restart required");
+ qDebug("QmmpAudioEngine: restart is required");
delete effect;
}
}
@@ -194,7 +193,7 @@ void QmmpAudioEngine::removeEffect(EffectFactory *factory)
{
mutex()->lock();
if(m_blockedEffects.contains(effect))
- qDebug("QmmpAudioEngine: restart required");
+ qDebug("QmmpAudioEngine: restart is required");
else
m_effects.removeAll(effect);
mutex()->unlock();
@@ -577,25 +576,61 @@ Output *QmmpAudioEngine::createOutput()
void QmmpAudioEngine::prepareEffects(Decoder *d)
{
- m_blockedEffects.clear();
- while(!m_effects.isEmpty()) //delete effects
- delete m_effects.takeFirst();
-
- m_effects = Effect::create();
m_ap = d->audioParameters();
+ foreach(Effect *e, m_effects) //remove disabled and external effects
+ {
+ if(!e->factory() || !Effect::isEnabled(e->factory()))
+ {
+ m_effects.removeAll(e);
+ m_blockedEffects.removeAll(e);
+ delete e;
+ }
+ }
+ QList <Effect *> m_tmp_effects = m_effects;
+ m_effects.clear();
+
if(m_settings->use16BitOutput())
- m_effects.prepend (new AudioConverter());
+ {
+ m_effects << new AudioConverter();
+ m_effects.at(0)->configure(m_ap.sampleRate(), m_ap.channels(), m_ap.format());
+ m_ap = m_effects.at(0)->audioParameters();
+ }
- foreach(Effect *effect, m_effects)
+ foreach(EffectFactory *factory, *Effect::factories())
{
- effect->configure(m_ap.sampleRate(), m_ap.channels(), m_ap.format());
- if (m_ap != effect->audioParameters())
+ if(!Effect::isEnabled(factory))
+ continue;
+
+ Effect *effect = 0;
+ foreach(Effect *e, m_tmp_effects) //find effect
+ {
+ if(e->factory() == factory)
+ effect = e;
+ }
+
+ if(effect && (effect->audioParameters() != m_ap ||
+ m_blockedEffects.contains(effect))) //destroy effect which require restart
{
- m_blockedEffects << effect; //list of effects which require restart
- m_ap = effect->audioParameters();
+ m_blockedEffects.removeAll(effect);
+ m_tmp_effects.removeAll(effect);
+ delete effect;
+ effect = 0;
}
+ if(!effect)
+ {
+ effect = Effect::create(factory);
+ effect->configure(m_ap.sampleRate(), m_ap.channels(), m_ap.format());
+ if (m_ap != effect->audioParameters())
+ {
+ m_blockedEffects << effect; //list of effects which require restart
+ m_ap = effect->audioParameters();
+ }
+ }
+ m_effects << effect;
+ m_tmp_effects.removeAll(effect);
}
+
m_chan = m_ap.channels();
m_useEq = m_eqEnabled && m_ap.format() == Qmmp::PCM_S16LE;
init_iir(m_ap.sampleRate());