]> git.sesse.net Git - nageru/blob - nageru/peak_display.cpp
Begin working on a delay analyzer.
[nageru] / nageru / peak_display.cpp
1 #include "peak_display.h"
2
3 #include <math.h>
4
5 #include <memory>
6
7 #include <QPainter>
8 #include <QPaintEvent>
9 #include <QRect>
10
11 #include "audio_clip.h"
12
13 using namespace std;
14
15 PeakDisplay::PeakDisplay(QWidget *parent)
16         : QWidget(parent)
17 {
18 }
19
20 void PeakDisplay::audio_clip_updated()
21 {
22         QMetaObject::invokeMethod(this, "repaint", Qt::QueuedConnection);
23 }
24
25 void PeakDisplay::paintEvent(QPaintEvent *event)
26 {
27         int w = width();
28         unique_ptr<pair<float, float>[]> min_max = audio_clip->get_min_max_peaks(w);
29
30         QPainter painter(this);
31         painter.fillRect(event->rect(), Qt::white);
32         painter.setClipRect(event->rect());
33         double mid_y = double(height()) * 0.5;
34         double scale_y = height() * 0.5;
35         for (int x = 0; x < w; ++x) {
36                 if (isnan(min_max[x].first)) continue;
37
38                 int y_min = lrint(min_max[x].first * scale_y + mid_y);
39                 int y_max = lrint(min_max[x].second * scale_y + mid_y);
40                 painter.drawLine(x, y_min, x, y_max);
41         }
42 }