]> git.sesse.net Git - nageru/blobdiff - nageru/audio_clip.cpp
Make the delay analyzer understand that two sources can have different starting times.
[nageru] / nageru / audio_clip.cpp
index 4dcb8db0135e4077d15e87fda3a942ad548c2b73..ec97e6b0f04543920ead2028b5f08cabeb788aae 100644 (file)
@@ -1,5 +1,6 @@
 #include "audio_clip.h"
 
+#include <assert.h>
 #include <math.h>
 
 using namespace std;
@@ -34,8 +35,31 @@ double AudioClip::get_length_seconds() const
        return double(vals.size()) / sample_rate;
 }
 
+double AudioClip::get_length_seconds_after_base(std::chrono::steady_clock::time_point base) const
+{
+       lock_guard<mutex> lock(mu);
+       if (vals.empty() || base < first_sample) {
+               // NOTE: base < first_sample can happen only during race conditions.
+               return 0.0;
+       }
+
+       return double(vals.size()) / sample_rate - duration<double>(base - first_sample).count();
+}
+
+bool AudioClip::empty() const
+{
+       lock_guard<mutex> lock(mu);
+       return vals.empty();
+}
+
+steady_clock::time_point AudioClip::get_first_sample() const
+{
+       lock_guard<mutex> lock(mu);
+       assert(!vals.empty());
+       return first_sample;
+}
 
-unique_ptr<pair<float, float>[]> AudioClip::get_min_max_peaks(unsigned width) const
+unique_ptr<pair<float, float>[]> AudioClip::get_min_max_peaks(unsigned width, steady_clock::time_point base) const
 {
        unique_ptr<pair<float, float>[]> min_max(new pair<float, float>[width]);
        for (unsigned x = 0; x < width; ++x) {
@@ -43,9 +67,10 @@ unique_ptr<pair<float, float>[]> AudioClip::get_min_max_peaks(unsigned width) co
        }
 
        lock_guard<mutex> lock(mu);
-       for (size_t i = 0; i < vals.size(); ++i) {
+       double skip_samples = duration<double>(base - first_sample).count() * sample_rate;
+       for (size_t i = int(floor(skip_samples)); i < vals.size(); ++i) {
                // We display one second.
-               int x = lrint(i * (double(width) / sample_rate));
+               int x = lrint((i - skip_samples) * (double(width) / sample_rate));
                if (x < 0 || x >= int(width)) continue;
                if (isnan(min_max[x].first)) {
                        min_max[x].first = min_max[x].second = 0.0;