X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Faudio_clip.cpp;fp=nageru%2Faudio_clip.cpp;h=4dcb8db0135e4077d15e87fda3a942ad548c2b73;hb=bd01e11a41a19fef2315319909d8655cac359f0f;hp=0000000000000000000000000000000000000000;hpb=a944bad466ba5601a96f6833e1ea2eb31f9b55af;p=nageru diff --git a/nageru/audio_clip.cpp b/nageru/audio_clip.cpp new file mode 100644 index 0000000..4dcb8db --- /dev/null +++ b/nageru/audio_clip.cpp @@ -0,0 +1,58 @@ +#include "audio_clip.h" + +#include + +using namespace std; +using namespace std::chrono; + +void AudioClip::clear() +{ + lock_guard lock(mu); + vals.clear(); +} + +void AudioClip::add_audio(const float *samples, size_t num_samples, double sample_rate, std::chrono::steady_clock::time_point frame_time) +{ + lock_guard lock(mu); + if (!vals.empty() && sample_rate != this->sample_rate) { + vals.clear(); + } + if (vals.empty()) { + first_sample = frame_time; + } + this->sample_rate = sample_rate; + vals.insert(vals.end(), samples, samples + num_samples); +} + +double AudioClip::get_length_seconds() const +{ + lock_guard lock(mu); + if (vals.empty()) { + return 0.0; + } + + return double(vals.size()) / sample_rate; +} + + +unique_ptr[]> AudioClip::get_min_max_peaks(unsigned width) const +{ + unique_ptr[]> min_max(new pair[width]); + for (unsigned x = 0; x < width; ++x) { + min_max[x].first = min_max[x].second = 0.0 / 0.0; // NaN. + } + + lock_guard lock(mu); + for (size_t i = 0; i < vals.size(); ++i) { + // We display one second. + int x = lrint(i * (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; + } + min_max[x].first = min(min_max[x].first, vals[i]); + min_max[x].second = max(min_max[x].second, vals[i]); + } + + return min_max; +}