diff options
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 5 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.h | 3 | ||||
| -rw-r--r-- | src/qmmp/replaygain.cpp | 45 | ||||
| -rw-r--r-- | src/qmmp/replaygain.h | 6 |
4 files changed, 53 insertions, 6 deletions
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index fd3cb24bd..3485064fe 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -165,6 +165,11 @@ void QmmpAudioEngine::setEQEnabled(bool on) mutex()->unlock(); } +void QmmpAudioEngine::setReplayGainSettings(const ReplayGainSettings &settings) +{ + m_replayGain->setReplayGainSettings(settings); +} + void QmmpAudioEngine::addEffect(EffectFactory *factory) { if(m_output && m_output->isRunning()) diff --git a/src/qmmp/qmmpaudioengine.h b/src/qmmp/qmmpaudioengine.h index 25cef0c4d..20372be8e 100644 --- a/src/qmmp/qmmpaudioengine.h +++ b/src/qmmp/qmmpaudioengine.h @@ -24,6 +24,7 @@ #include <QQueue> #include <QHash> #include "abstractengine.h" +#include "replaygainsettings.h" #include "audioparameters.h" class QIODevice; @@ -51,8 +52,10 @@ public: void pause(); void setEQ(double bands[10], double preamp); void setEQEnabled(bool on); + void setReplayGainSettings(const ReplayGainSettings &settings); void addEffect(EffectFactory *factory); void removeEffect(EffectFactory *factory); + static QmmpAudioEngine *instance(); private slots: diff --git a/src/qmmp/replaygain.cpp b/src/qmmp/replaygain.cpp index c883a38f4..611fe3ef7 100644 --- a/src/qmmp/replaygain.cpp +++ b/src/qmmp/replaygain.cpp @@ -23,25 +23,32 @@ ReplayGain::ReplayGain() { - m_freq = 0; - m_chan = 0; m_bits = 0; - m_scale = 0; + m_scale = 1.0; } void ReplayGain::setSampleSize(int bits) { m_bits = bits; + updateScale(); } void ReplayGain::setReplayGainInfo(const ReplayGainInfo &info) { m_info = info; - m_scale = pow(10.0, (info.trackGain()/20) * info.trackPeak()); + updateScale(); +} + +void ReplayGain::setReplayGainSettings(const ReplayGainSettings &settings) +{ + m_settings = settings; + updateScale(); } void ReplayGain::applyReplayGain(char *data, qint64 size) { + if(m_settings.mode() == ReplayGainSettings::DISABLED || m_scale == 1.0) + return; size = size*8/m_bits; if(m_bits == 16) { @@ -60,3 +67,33 @@ void ReplayGain::applyReplayGain(char *data, qint64 size) ((qint32*)data)[i]*= m_scale; } } + +void ReplayGain::updateScale() +{ + double peak = 0.0; + m_scale = 0.0; + switch((int) m_settings.mode()) + { + case ReplayGainSettings::TRACK: + m_scale = pow(10.0, m_info.trackGain()/20); + peak = m_info.trackPeak(); + break; + case ReplayGainSettings::ALBUM: + m_scale = pow(10.0, m_info.albumGain()/20); + peak = m_info.albumPeak(); + break; + case ReplayGainSettings::DISABLED: + m_scale = 1.0; + } + if(m_scale == 0.0) + m_scale = pow(10.0, m_settings.defaultGain()/20); + if(peak > 0.0 && m_scale != 1.0 && m_scale > 0.0) + { + m_scale *= pow(10.0, m_settings.preamp()/20); + if(m_settings.preventClipping()) + m_scale = m_scale*peak > 1.0 ? 1.0 / peak : m_scale; + } + if(m_scale < 0.0) + m_scale = 1.0; + m_scale = qMin(m_scale, 15.0); +} diff --git a/src/qmmp/replaygain.h b/src/qmmp/replaygain.h index ade2e72b4..28ba68e4c 100644 --- a/src/qmmp/replaygain.h +++ b/src/qmmp/replaygain.h @@ -23,6 +23,7 @@ #include <QtGlobal> #include "replaygaininfo.h" +#include "replaygainsettings.h" /*! * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -33,14 +34,15 @@ public: ReplayGain(); void setSampleSize(int bits); + void setReplayGainSettings(const ReplayGainSettings &settings); void setReplayGainInfo(const ReplayGainInfo &info); void applyReplayGain(char *data, qint64 size); private: - quint32 m_freq; - int m_chan; + void updateScale(); int m_bits; ReplayGainInfo m_info; + ReplayGainSettings m_settings; double m_scale; }; |
