summaryrefslogtreecommitdiffstats
path: root/src/engine/enginevumeter.cpp
diff options
context:
space:
mode:
authorFerran Pujol Camins <ferranpujolcamins@gmail.com>2015-08-08 22:44:06 +0200
committerFerran Pujol Camins <ferranpujolcamins@gmail.com>2015-08-08 22:44:06 +0200
commit5a2070fbfba6154e9f06fdbee0299cddf99884ef (patch)
treeec7fcb3660779e2032e0bfdc7feccd576c40e83d /src/engine/enginevumeter.cpp
parent72408bd21fbaadabb8867e3965dcd3db37d2db75 (diff)
Added "PeakIndicatorL" and "PeakIndicatorR" ControlObjects.
Diffstat (limited to 'src/engine/enginevumeter.cpp')
-rw-r--r--src/engine/enginevumeter.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/engine/enginevumeter.cpp b/src/engine/enginevumeter.cpp
index 7cbbdf2c6b..4e34d783a3 100644
--- a/src/engine/enginevumeter.cpp
+++ b/src/engine/enginevumeter.cpp
@@ -33,6 +33,10 @@ EngineVuMeter::EngineVuMeter(QString group) {
// knowledge could use something more suitable...
m_ctrlPeakIndicator = new ControlPotmeter(ConfigKey(group, "PeakIndicator"),
0., 1.);
+ m_ctrlPeakIndicatorL = new ControlPotmeter(ConfigKey(group, "PeakIndicatorL"),
+ 0., 1.);
+ m_ctrlPeakIndicatorR = new ControlPotmeter(ConfigKey(group, "PeakIndicatorR"),
+ 0., 1.);
m_pSampleRate = new ControlObjectSlave("[Master]", "samplerate", this);
@@ -46,6 +50,8 @@ EngineVuMeter::~EngineVuMeter()
delete m_ctrlVuMeterL;
delete m_ctrlVuMeterR;
delete m_ctrlPeakIndicator;
+ delete m_ctrlPeakIndicatorL;
+ delete m_ctrlPeakIndicatorR;
}
void EngineVuMeter::process(CSAMPLE* pIn, const int iBufferSize) {
@@ -53,7 +59,7 @@ void EngineVuMeter::process(CSAMPLE* pIn, const int iBufferSize) {
int sampleRate = (int)m_pSampleRate->get();
- bool clipped = SampleUtil::sumAbsPerChannel(&fVolSumL, &fVolSumR, pIn, iBufferSize);
+ int clipped = SampleUtil::sumAbsPerChannel(&fVolSumL, &fVolSumR, pIn, iBufferSize);
m_fRMSvolumeSumL += fVolSumL;
m_fRMSvolumeSumR += fVolSumR;
@@ -93,6 +99,24 @@ void EngineVuMeter::process(CSAMPLE* pIn, const int iBufferSize) {
} else {
--m_peakDuration;
}
+
+ if (clipped & 1) {
+ m_ctrlPeakIndicatorL->set(1.);
+ m_peakDurationL = PEAK_DURATION * sampleRate / iBufferSize / 2000;
+ } else if (m_peakDurationL <= 0) {
+ m_ctrlPeakIndicatorL->set(0.);
+ } else {
+ --m_peakDurationL;
+ }
+
+ if (clipped & 2) {
+ m_ctrlPeakIndicatorR->set(1.);
+ m_peakDurationR = PEAK_DURATION * sampleRate / iBufferSize / 2000;
+ } else if (m_peakDurationR <= 0) {
+ m_ctrlPeakIndicatorR->set(0.);
+ } else {
+ --m_peakDurationR;
+ }
}
void EngineVuMeter::collectFeatures(GroupFeatureState* pGroupFeatures) const {
@@ -117,6 +141,8 @@ void EngineVuMeter::reset() {
m_ctrlVuMeterL->set(0);
m_ctrlVuMeterR->set(0);
m_ctrlPeakIndicator->set(0);
+ m_ctrlPeakIndicatorL->set(0);
+ m_ctrlPeakIndicatorR->set(0);
m_iSamplesCalculated = 0;
m_fRMSvolumeL = 0;
@@ -124,4 +150,6 @@ void EngineVuMeter::reset() {
m_fRMSvolumeR = 0;
m_fRMSvolumeSumR = 0;
m_peakDuration = 0;
+ m_peakDurationL = 0;
+ m_peakDurationR = 0;
}