diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-08 19:51:44 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-08 19:51:44 +0000 |
| commit | 9e3a8c65cf0df3df9a00fe8e1bc5e7767ee510d5 (patch) | |
| tree | ba8df870e5a3913eb56aa1aeb74ad90454fe5e84 | |
| parent | dbb086a3c847f941de023308ca085bd12e541d80 (diff) | |
| download | qmmp-9e3a8c65cf0df3df9a00fe8e1bc5e7767ee510d5.tar.gz qmmp-9e3a8c65cf0df3df9a00fe8e1bc5e7767ee510d5.tar.bz2 qmmp-9e3a8c65cf0df3df9a00fe8e1bc5e7767ee510d5.zip | |
reduced equalizer delay
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1931 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmp/output.cpp | 36 | ||||
| -rw-r--r-- | src/qmmp/output.h | 13 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 36 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.h | 6 |
4 files changed, 47 insertions, 44 deletions
diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp index c8b4f3758..048d91dec 100644 --- a/src/qmmp/output.cpp +++ b/src/qmmp/output.cpp @@ -9,13 +9,17 @@ #include <QStringList> #include <QApplication> #include <QTimer> +#include <stdio.h> #include "audioparameters.h" +#include "qmmpsettings.h" #include "buffer.h" -#include "output.h" #include "volumecontrol.h" #include "qmmp.h" +#include "output.h" -#include <stdio.h> +extern "C" { +#include "equ/iir.h" +} //static functions static inline void s8_to_s16(qint8 *in, qint16 *out, qint64 samples) @@ -56,6 +60,11 @@ Output::Output (QObject* parent) : QThread (parent) m_skip = false; m_pause = false; m_prev_pause = false; + m_useEq = false; + m_eqEnabled = false; + m_settings = QmmpSettings::instance(); + connect(m_settings,SIGNAL(eqSettingsChanged()), SLOT(updateEqSettings())); + updateEqSettings(); } void Output::configure(quint32 freq, int chan, Qmmp::AudioFormat format) @@ -77,6 +86,9 @@ void Output::configure(quint32 freq, int chan, Qmmp::AudioFormat format) delete [] m_visBuffer; m_visBufferSize = QMMP_BLOCK_FRAMES * 2 * chan; //16-bit samples m_visBuffer = new unsigned char [m_visBufferSize]; + m_useEq = m_eqEnabled && m_frequency && m_format == Qmmp::PCM_S16LE; + if(m_frequency) + init_iir(m_frequency); } void Output::pause() @@ -294,6 +306,8 @@ void Output::run() if (b) { dispatchVisual(b); + if (m_useEq) + iir((void*) b->data, b->nbytes, m_channels); if (SoftwareVolume::instance()) SoftwareVolume::instance()->changeVolume(b, m_channels, m_format); l = 0; @@ -355,6 +369,24 @@ void Output::status() } } +void Output::updateEqSettings() +{ + mutex()->lock(); + m_eqEnabled = m_settings->eqSettings().isEnabled(); + double preamp = m_settings->eqSettings().preamp(); + set_preamp(0, 1.0 + 0.0932471 *preamp + 0.00279033 * preamp * preamp); + set_preamp(1, 1.0 + 0.0932471 *preamp + 0.00279033 * preamp * preamp); + for(int i = 0; i < 10; ++i) + { + double value = m_settings->eqSettings().gain(i); + set_gain(i,0, 0.03*value+0.000999999*value*value); + set_gain(i,1, 0.03*value+0.000999999*value*value); + } + if(isRunning()) + m_useEq = m_eqEnabled && m_format == Qmmp::PCM_S16LE; + mutex()->unlock(); +} + // static methods QList<OutputFactory*> *Output::m_factories = 0; diff --git a/src/qmmp/output.h b/src/qmmp/output.h index 4947b0d5b..463ac450c 100644 --- a/src/qmmp/output.h +++ b/src/qmmp/output.h @@ -5,10 +5,8 @@ // warranty, or liability of any kind. // -#ifndef OUTPUT_H -#define OUTPUT_H - -class Output; +#ifndef OUTPUT_H +#define OUTPUT_H #include <QObject> #include <QThread> @@ -23,6 +21,7 @@ class Output; #include "recycler.h" class QTimer; +class QmmpSettings; /*! @brief The Output class provides the base interface class of audio outputs. * @author Brad Hughes <bhughes@trolltech.com> @@ -167,6 +166,9 @@ protected: */ virtual void resume(); +private slots: + void updateEqSettings(); + private: void run(); //thread run function void status(); @@ -189,10 +191,11 @@ private: bool m_userStop, m_pause; bool m_prev_pause; bool m_finish; + bool m_useEq, m_eqEnabled; qint64 m_totalWritten, m_currentMilliseconds; unsigned char *m_visBuffer; qint64 m_visBufferSize; - + QmmpSettings *m_settings; static void checkFactories(); static void registerFactory(OutputFactory *); //TODO use QMap instead diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 25f872951..9849126cb 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -33,14 +33,9 @@ #include "qmmpaudioengine.h" #include "metadatamanager.h" -extern "C" -{ -#include "equ/iir.h" -} QmmpAudioEngine::QmmpAudioEngine(QObject *parent) - : AbstractEngine(parent), m_factory(0), m_output(0), - m_useEq(false), m_eqEnabled(false) + : AbstractEngine(parent), m_factory(0), m_output(0) { qRegisterMetaType<Qmmp::State>("Qmmp::State"); m_output_buf = 0; @@ -51,8 +46,6 @@ QmmpAudioEngine::QmmpAudioEngine(QObject *parent) m_replayGain = new ReplayGain; m_settings = QmmpSettings::instance(); connect(m_settings,SIGNAL(replayGainSettingsChanged()), SLOT(updateReplayGainSettings())); - connect(m_settings,SIGNAL(eqSettingsChanged()), SLOT(updateEqSettings())); - updateEqSettings(); updateReplayGainSettings(); reset(); m_instance = this; @@ -288,7 +281,7 @@ void QmmpAudioEngine::stop() delete m_effects.takeFirst(); } -qint64 QmmpAudioEngine::produceSound(char *data, qint64 size, quint32 brate, int chan) +qint64 QmmpAudioEngine::produceSound(char *data, qint64 size, quint32 brate) { Buffer *b = m_output->recycler()->get(); uint sz = size < m_bks ? size : m_bks; @@ -300,8 +293,6 @@ qint64 QmmpAudioEngine::produceSound(char *data, qint64 size, quint32 brate, int { effect->applyEffect(b); } - if (m_useEq) - iir((void*) b->data, b->nbytes, chan); size -= sz; memmove(data, data + sz, size); m_output->recycler()->add(); @@ -319,24 +310,6 @@ void QmmpAudioEngine::finish() emit playbackFinished(); } -void QmmpAudioEngine::updateEqSettings() -{ - mutex()->lock(); - m_eqEnabled = m_settings->eqSettings().isEnabled(); - double preamp = m_settings->eqSettings().preamp(); - set_preamp(0, 1.0 + 0.0932471 *preamp + 0.00279033 * preamp * preamp); - set_preamp(1, 1.0 + 0.0932471 *preamp + 0.00279033 * preamp * preamp); - for(int i = 0; i < 10; ++i) - { - double value = m_settings->eqSettings().gain(i); - set_gain(i,0, 0.03*value+0.000999999*value*value); - set_gain(i,1, 0.03*value+0.000999999*value*value); - } - if(m_decoder) - m_useEq = m_eqEnabled && m_ap.format() == Qmmp::PCM_S16LE; - mutex()->unlock(); -} - void QmmpAudioEngine::updateReplayGainSettings() { mutex()->lock(); @@ -513,7 +486,7 @@ void QmmpAudioEngine::flush(bool final) m_done = true; else { - m_output_at -= produceSound((char*)m_output_buf, m_output_at, m_bitrate, m_chan); + m_output_at -= produceSound((char*)m_output_buf, m_output_at, m_bitrate); } if (m_output->recycler()->full()) @@ -634,10 +607,7 @@ void QmmpAudioEngine::prepareEffects(Decoder *d) 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()); } //static members diff --git a/src/qmmp/qmmpaudioengine.h b/src/qmmp/qmmpaudioengine.h index 537c7dc5e..77be8c350 100644 --- a/src/qmmp/qmmpaudioengine.h +++ b/src/qmmp/qmmpaudioengine.h @@ -60,7 +60,7 @@ public: private slots: void finish(); - void updateEqSettings(); + //void updateEqSettings(); void updateReplayGainSettings(); private: @@ -68,7 +68,7 @@ private: void reset(); void flush(bool = false); void addOffset(); - qint64 produceSound(char *data, qint64 size, quint32 brate, int chan); + qint64 produceSound(char *data, qint64 size, quint32 brate); void sendMetaData(); Output *createOutput(); void prepareEffects(Decoder *d); @@ -78,8 +78,6 @@ private: QList <Effect*> m_blockedEffects; Output *m_output; - bool m_useEq; - bool m_eqEnabled; bool m_done, m_finish, m_user_stop; uint m_bks; qint64 m_totalTime, m_seekTime; |
