Zrythm v2.0.0-alpha.1+31.4967fd053471
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
spectrum_analyzer_canvas_item.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <QColor>
7#include <QVector>
8#include <QtCanvasPainter/qcanvaspainteritem.h>
9#include <QtQmlIntegration/qqmlintegration.h>
10
11#include <kiss_fft.h>
12
13namespace zrythm::dsp
14{
15class AudioPort;
17}
18
19namespace zrythm::gui::qquick
20{
21
23
24class SpectrumAnalyzerCanvasItem : public QCanvasPainterItem
25{
26 Q_OBJECT
27 QML_ELEMENT
28 Q_PROPERTY (
29 zrythm::dsp::AudioPort * stereoPort READ stereoPort WRITE setStereoPort
30 NOTIFY stereoPortChanged REQUIRED)
31 Q_PROPERTY (
32 zrythm::dsp::PortObservationManager * portObservationManager READ
33 portObservationManager WRITE setPortObservationManager NOTIFY
34 portObservationManagerChanged REQUIRED)
35 Q_PROPERTY (int fftSize READ fftSize WRITE setFftSize NOTIFY fftSizeChanged)
36 Q_PROPERTY (
37 float sampleRate READ sampleRate WRITE setSampleRate NOTIFY
38 sampleRateChanged REQUIRED)
39 Q_PROPERTY (
40 QColor spectrumColor READ spectrumColor WRITE setSpectrumColor NOTIFY
41 spectrumColorChanged)
42
43public:
44 explicit SpectrumAnalyzerCanvasItem (QQuickItem * parent = nullptr);
45 ~SpectrumAnalyzerCanvasItem () override;
46
47 QCanvasPainterItemRenderer * createItemRenderer () const override;
48
49 zrythm::dsp::AudioPort * stereoPort () const;
50 void setStereoPort (zrythm::dsp::AudioPort * port);
51
52 zrythm::dsp::PortObservationManager * portObservationManager () const;
53 void
54 setPortObservationManager (zrythm::dsp::PortObservationManager * manager);
55
56 int fftSize () const;
57 float sampleRate () const;
58 QColor spectrumColor () const;
59
60 void setFftSize (int size);
61 void setSampleRate (float rate);
62 void setSpectrumColor (const QColor &color);
63
64 Q_INVOKABLE float getScaledFrequency (
65 int bin,
66 int num_bins,
67 float min_frequency,
68 float max_frequency) const;
69 Q_INVOKABLE float getFrequencyForBin (int bin, int num_bins) const;
70
71 static float scaled_frequency (
72 float sample_rate,
73 int bin,
74 int num_bins,
75 float min_frequency,
76 float max_frequency);
77
78 const QVector<float> &spectrumData () const;
79 uint64_t spectrumGeneration () const;
80
81Q_SIGNALS:
82 void stereoPortChanged ();
83 void portObservationManagerChanged ();
84 void fftSizeChanged ();
85 void sampleRateChanged ();
86 void spectrumColorChanged ();
87
88private:
89 void process_audio ();
90 void try_create_token ();
91 void init_fft (int size);
92
93 struct Impl;
94 std::unique_ptr<Impl> impl_;
95};
96
97}
Manages port observer lifecycle and runs a drain timer.