X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fpeak_display.cpp;fp=nageru%2Fpeak_display.cpp;h=eda6b540fdbeffe4df6ee6799f03662512e99e29;hb=bd01e11a41a19fef2315319909d8655cac359f0f;hp=0000000000000000000000000000000000000000;hpb=a944bad466ba5601a96f6833e1ea2eb31f9b55af;p=nageru diff --git a/nageru/peak_display.cpp b/nageru/peak_display.cpp new file mode 100644 index 0000000..eda6b54 --- /dev/null +++ b/nageru/peak_display.cpp @@ -0,0 +1,42 @@ +#include "peak_display.h" + +#include + +#include + +#include +#include +#include + +#include "audio_clip.h" + +using namespace std; + +PeakDisplay::PeakDisplay(QWidget *parent) + : QWidget(parent) +{ +} + +void PeakDisplay::audio_clip_updated() +{ + QMetaObject::invokeMethod(this, "repaint", Qt::QueuedConnection); +} + +void PeakDisplay::paintEvent(QPaintEvent *event) +{ + int w = width(); + unique_ptr[]> min_max = audio_clip->get_min_max_peaks(w); + + QPainter painter(this); + painter.fillRect(event->rect(), Qt::white); + painter.setClipRect(event->rect()); + double mid_y = double(height()) * 0.5; + double scale_y = height() * 0.5; + for (int x = 0; x < w; ++x) { + if (isnan(min_max[x].first)) continue; + + int y_min = lrint(min_max[x].first * scale_y + mid_y); + int y_max = lrint(min_max[x].second * scale_y + mid_y); + painter.drawLine(x, y_min, x, y_max); + } +}