diff --git a/Applications/SoundPlayer/SampleWidget.cpp b/Applications/SoundPlayer/SampleWidget.cpp index 1fa86e6a5c..b8cdc93151 100644 --- a/Applications/SoundPlayer/SampleWidget.cpp +++ b/Applications/SoundPlayer/SampleWidget.cpp @@ -1,6 +1,7 @@ #include "SampleWidget.h" #include #include +#include SampleWidget::SampleWidget(GWidget* parent) : GFrame(parent) @@ -18,21 +19,34 @@ void SampleWidget::paint_event(GPaintEvent& event) { GFrame::paint_event(event); GPainter painter(*this); - painter.add_clip_rect(event.rect()); + painter.add_clip_rect(event.rect()); painter.fill_rect(frame_inner_rect(), Color::Black); if (!m_buffer) return; - // FIXME: Right now we only display as many samples from the buffer as we can fit - // in the frame_inner_rect(). Maybe scale the samples or something? - int samples_to_draw = min(m_buffer->sample_count(), frame_inner_rect().width()); - for (int x = 0; x < samples_to_draw; ++x) { - // FIXME: This might look nicer if drawn as lines. - auto& sample = m_buffer->samples()[x]; - Point p = { x, frame_inner_rect().center().y() + (int)(sample.left * frame_inner_rect().height() / 2) }; - painter.set_pixel(p, Color::Green); + int samples_per_pixel = m_buffer->sample_count() / frame_inner_rect().width(); + float sample_max = 0; + int count = 0; + int x_offset = frame_inner_rect().x(); + int x = x_offset; + int y_offset = frame_inner_rect().center().y(); + + for (int sample_index = 0; sample_index < m_buffer->sample_count() && (x - x_offset) < frame_inner_rect().width(); ++sample_index) { + float sample = fabsf(m_buffer->samples()[sample_index].left); + + sample_max = max(sample, sample_max); + ++count; + + if (count >= samples_per_pixel) { + Point min_point = { x, y_offset + static_cast(-sample_max * frame_inner_rect().height() / 2) }; + Point max_point = { x++, y_offset + static_cast(sample_max * frame_inner_rect().height() / 2) }; + painter.draw_line(min_point, max_point, Color::Green); + + count = 0; + sample_max = 0; + } } } diff --git a/Applications/SoundPlayer/SampleWidget.h b/Applications/SoundPlayer/SampleWidget.h index bd82d3ef75..07c878104c 100644 --- a/Applications/SoundPlayer/SampleWidget.h +++ b/Applications/SoundPlayer/SampleWidget.h @@ -10,7 +10,6 @@ public: virtual ~SampleWidget() override; void set_buffer(ABuffer*); - private: explicit SampleWidget(GWidget* parent); virtual void paint_event(GPaintEvent&) override;