aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/qmmpaudioengine.cpp5
-rw-r--r--src/qmmp/qmmpaudioengine.h3
-rw-r--r--src/qmmp/replaygain.cpp45
-rw-r--r--src/qmmp/replaygain.h6
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;
};