Serenity Operating System
1/*
2 * Copyright (c) 2021, Cesar Torres <shortanemoia@protonmail.com>
3 * Copyright (c) 2022, the SerenityOS developers.
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#pragma once
9
10#include "VisualizationWidget.h"
11#include <AK/Array.h>
12#include <AK/Complex.h>
13#include <AK/FixedArray.h>
14#include <LibGUI/Frame.h>
15
16class BarsVisualizationWidget final : public VisualizationWidget {
17 C_OBJECT(BarsVisualizationWidget)
18
19public:
20 ~BarsVisualizationWidget() override = default;
21
22private:
23 BarsVisualizationWidget();
24
25 void render(GUI::PaintEvent&, FixedArray<float> const&) override;
26 void context_menu_event(GUI::ContextMenuEvent& event) override;
27
28 static constexpr size_t fft_size = 512;
29 static constexpr size_t bar_count = 64;
30 // Things become weird near the Nyquist limit. Just don't use that FFT data.
31 static constexpr size_t cutoff = fft_size - 32;
32
33 Array<Complex<float>, fft_size> m_fft_samples {};
34 Array<float, fft_size> m_fft_window {};
35 Array<float, fft_size / 2> m_previous_samples {};
36 Array<int, bar_count> m_gfx_falling_bars {};
37 bool m_is_using_last;
38 bool m_adjust_frequencies;
39 bool m_logarithmic_spectrum;
40 RefPtr<GUI::Menu> m_context_menu;
41};