#include "audio_clip.h"
+#include <assert.h>
#include <math.h>
using namespace std;
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) {
}
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;