summaryrefslogtreecommitdiff
path: root/src/latencyfilter.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2017-10-14 15:24:36 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2018-02-18 11:43:40 +0100
commit0dc69ba161bb0c8fce2eb0ab3c5eb897f7aa92a7 (patch)
treed33fcf6f429124cd551177e3d28aa3ac7bc29272 /src/latencyfilter.cc
parent3515fe8b970bd7cd849ea44e24bc01331e894314 (diff)
Implemented engine part of the latency filter aka. humized timing.
Diffstat (limited to 'src/latencyfilter.cc')
-rw-r--r--src/latencyfilter.cc63
1 files changed, 57 insertions, 6 deletions
diff --git a/src/latencyfilter.cc b/src/latencyfilter.cc
index d83eab6..2f4bfe5 100644
--- a/src/latencyfilter.cc
+++ b/src/latencyfilter.cc
@@ -26,19 +26,70 @@
*/
#include "latencyfilter.h"
-LatencyFilter::LatencyFilter(Settings& settings)
- //: settings(settings)
+#include <cmath>
+#include <hugin.hpp>
+
+#include "settings.h"
+#include "random.h"
+
+LatencyFilter::LatencyFilter(Settings& settings, Random& random)
+ : settings(settings)
+ , random(random)
{
}
-bool LatencyFilter::filter(event_t& events, size_t pos)
+bool LatencyFilter::filter(event_t& event, std::size_t pos)
{
+ auto enabled = settings.enable_latency_modifier.load();
+ auto latency = settings.latency_max.load();
+ auto samplerate = settings.samplerate.load();
+ auto latency_laid_back = settings.latency_laid_back.load();
+ auto latency_stddev = settings.latency_stddev.load();
+ auto latency_regain = settings.latency_regain.load();
+
+ if(!enabled)
+ {
+ return true;
+ }
+
+ // Assert latency_regain is within range [0; 1].
+ assert(latency_regain >= 0.0f && latency_regain <= 1.0f);
+
+ float duration = (pos - latency_last_pos) / samplerate;
+ latency_offset *= pow(latency_regain, duration);
+
+ latency_last_pos = pos;
+
+ float offset_min = latency * -1.0f;
+ float offset_max = latency * 1.0f;
+
+ float mean = latency_laid_back;
+ float stddev = latency_stddev;
+
+ float offset = random.normalDistribution(mean, stddev);
+
+ latency_offset += offset;
+
+ if(latency_offset > offset_max) latency_offset = offset_max;
+ if(latency_offset < offset_min) latency_offset = offset_min;
+
+ DEBUG(offset, "latency: %d, offset: %f, drift: %f",
+ (int)latency, offset, latency_offset);
+
+ event.offset += latency;
+ event.offset += latency_offset;//(int)std::round(offset);
+
return true;
}
std::size_t LatencyFilter::getLatency() const
{
- // TODO: If enabled in settings, return the maximum number of samples
- // with which the latency filter can move notes forward.
- return 0;
+ bool enabled = settings.enable_latency_modifier.load();
+ std::size_t max_latency = settings.latency_max.load();
+ if(enabled)
+ {
+ return max_latency;
+ }
+
+ return 0u;
}