diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/effect.cpp | 38 | ||||
| -rw-r--r-- | src/qmmp/effect.h | 5 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 63 |
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()); |
