diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-09-10 14:08:51 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-09-10 14:08:51 +0000 |
| commit | 9f7ce1d53402aaf94398983b89dce5aba5c6f799 (patch) | |
| tree | e09510058700a9399ce4d0008c8a070ce9a16c1a /src | |
| parent | d15fabf6f0131b6889a868fbc693753dc8d1285a (diff) | |
| download | qmmp-9f7ce1d53402aaf94398983b89dce5aba5c6f799.tar.gz qmmp-9f7ce1d53402aaf94398983b89dce5aba5c6f799.tar.bz2 qmmp-9f7ce1d53402aaf94398983b89dce5aba5c6f799.zip | |
added multiband equalizer api
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2343 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/eqsettings.cpp | 33 | ||||
| -rw-r--r-- | src/qmmp/eqsettings.h | 18 | ||||
| -rw-r--r-- | src/qmmp/equ/iir.c | 10 | ||||
| -rw-r--r-- | src/qmmp/equ/iir.h | 4 | ||||
| -rw-r--r-- | src/qmmp/output.cpp | 9 |
5 files changed, 49 insertions, 25 deletions
diff --git a/src/qmmp/eqsettings.cpp b/src/qmmp/eqsettings.cpp index 81f74312a..a9d67d238 100644 --- a/src/qmmp/eqsettings.cpp +++ b/src/qmmp/eqsettings.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010 by Ilya Kotov * + * Copyright (C) 2010-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -18,12 +18,19 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include <QtGlobal> #include "eqsettings.h" -EqSettings::EqSettings() +EqSettings::EqSettings(int bands) { - for(int i = 0; i < 10; ++i) - m_gain[i] = 0; + if(bands != 10 && bands != 15 && bands != 25 && bands != 31) + { + qWarning("EqSettings: invalid number of bands (%d), using 10 bands as fallback", bands); + bands = 10; + } + for(int i = 0; i < bands; ++i) + m_gains[i] = 0; + m_bands = bands; m_preamp = 0; } @@ -34,7 +41,7 @@ bool EqSettings::isEnabled() const double EqSettings::gain(int chan) const { - return m_gain[chan]; + return m_gains[chan]; } double EqSettings::preamp() const @@ -42,14 +49,19 @@ double EqSettings::preamp() const return m_preamp; } +int EqSettings::bands() const +{ + return m_bands; +} + void EqSettings::setEnabled(bool enabled) { m_is_enabled = enabled; } -void EqSettings::setGain(int chan, double gain) +void EqSettings::setGain(int band, double gain) { - m_gain[chan] = gain; + m_gains[band] = gain; } void EqSettings::setPreamp(double preamp) @@ -60,19 +72,20 @@ void EqSettings::setPreamp(double preamp) void EqSettings::operator=(const EqSettings &s) { for(int i = 0; i < 10; ++i) - m_gain[i] = s.m_gain[i]; + m_gains[i] = s.m_gains[i]; m_preamp = s.m_preamp; m_is_enabled = s.m_is_enabled; + m_bands = s.m_bands; } bool EqSettings::operator==(const EqSettings &s) const { for(int i = 0; i < 10; ++i) { - if(m_gain[i] != s.m_gain[i]) + if(m_gains[i] != s.m_gains[i]) return false; } - return (m_preamp == s.m_preamp) && (m_is_enabled == s.m_is_enabled); + return (m_preamp == s.m_preamp) && (m_is_enabled == s.m_is_enabled) && (m_bands == s.m_bands); } bool EqSettings::operator!=(const EqSettings &s) const diff --git a/src/qmmp/eqsettings.h b/src/qmmp/eqsettings.h index 8bd5c8f39..12765e40f 100644 --- a/src/qmmp/eqsettings.h +++ b/src/qmmp/eqsettings.h @@ -22,15 +22,16 @@ #define EQSETTINGS_H /*! @brief The EqSettings class helps to work with equalizer settings. - * @author Ilya Kotov <forkotov02@hotmail.ru> - */ + * @author Ilya Kotov <forkotov02@hotmail.ru> + */ class EqSettings { public: /*! * Constructs an empty equalizer settings (0 dB, disabled) + * @param bands - Number of bands (supported: 10, 15, 25, 31) */ - EqSettings(); + EqSettings(int bands = 10); /*! * Returns \b true if equalizer os enabled, otherwise returns \b false. */ @@ -44,15 +45,19 @@ public: */ double preamp() const; /*! + * Returns number of bands + */ + int bands() const; + /*! * Enables equalizer if \p enabled is \b true or disables it if \p enabled is \b false. */ void setEnabled(bool enabled = true); /*! * Sets gain of the equalizer channel. - * @param chan Number of equalizer channel. + * @param band Number of equalizer band. * @param gain Channel gain (-20.0..20.0 dB) */ - void setGain(int chan, double gain); + void setGain(int band, double gain); /*! * Sets equalizer preamp to \b preamp. */ @@ -71,9 +76,10 @@ public: bool operator!=(const EqSettings &s) const; private: - double m_gain[10]; + double m_gains[31]; double m_preamp; bool m_is_enabled; + int m_bands; }; #endif // EQSETTINGS_H diff --git a/src/qmmp/equ/iir.c b/src/qmmp/equ/iir.c index 2384fef63..3f946065a 100644 --- a/src/qmmp/equ/iir.c +++ b/src/qmmp/equ/iir.c @@ -26,8 +26,8 @@ /* Coefficients */ sIIRCoefficients *iir_cf; -/* Volume gain - * values should be between 0.0 and 1.0 +/* Volume gain + * values should be between 0.0 and 1.0 * Use the preamp from XMMS for now * */ float preamp[EQ_CHANNELS]; @@ -39,7 +39,7 @@ int count = 0; unsigned int blength = 0; #endif -/* +/* * Global vars */ unsigned int rate; @@ -51,14 +51,14 @@ void set_preamp(int chn, float val) } /* Init the filters */ -void init_iir(unsigned int srate) +void init_iir(unsigned int srate, int band_num) { calc_coeffs(); #if 0 band_count = cfg.band_num; #endif - band_count = 10; + band_count = band_num; rate = srate; diff --git a/src/qmmp/equ/iir.h b/src/qmmp/equ/iir.h index ad59ff847..544f4c2bf 100644 --- a/src/qmmp/equ/iir.h +++ b/src/qmmp/equ/iir.h @@ -51,13 +51,13 @@ /* * Function prototypes */ -void init_iir(unsigned int srate); +void init_iir(unsigned int srate, int band_num); void clean_history(); void set_gain(int index, int chn, float val); void set_preamp(int chn, float val); - int iir(void * d, int length, int nch); +int iir(void * d, int length, int nch); #ifdef ARCH_X86 __inline__ int round_trick(float floatvalue_to_round); diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp index e37fb66a6..44f2ef2df 100644 --- a/src/qmmp/output.cpp +++ b/src/qmmp/output.cpp @@ -88,7 +88,7 @@ void Output::configure(quint32 freq, int chan, Qmmp::AudioFormat format) 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); + init_iir(m_frequency, m_settings->eqSettings().bands()); } void Output::pause() @@ -374,9 +374,14 @@ void Output::updateEqSettings() mutex()->lock(); m_eqEnabled = m_settings->eqSettings().isEnabled(); double preamp = m_settings->eqSettings().preamp(); + int bands = m_settings->eqSettings().bands(); + + if(band_count != bands) + init_iir(m_frequency, bands); + 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) + for(int i = 0; i < bands; ++i) { double value = m_settings->eqSettings().gain(i); set_gain(i,0, 0.03*value+0.000999999*value*value); |
