aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/output.cpp36
-rw-r--r--src/qmmp/output.h13
-rw-r--r--src/qmmp/qmmpaudioengine.cpp36
-rw-r--r--src/qmmp/qmmpaudioengine.h6
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;