LMMS
Loading...
Searching...
No Matches
SaSpectrumView.h
Go to the documentation of this file.
1/* SaSpectrumView.h - declaration of SaSpectrumView class.
2 *
3 * Copyright (c) 2019 Martin Pavelek <he29/dot/HS/at/gmail/dot/com>
4 *
5 * Based partially on Eq plugin code,
6 * Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
7 *
8 * This file is part of LMMS - https://lmms.io
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public
21 * License along with this program (see COPYING); if not, write to the
22 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 * Boston, MA 02110-1301 USA.
24 *
25 */
26
27#ifndef SASPECTRUMVIEW_H
28#define SASPECTRUMVIEW_H
29
30
31#include <string>
32#include <utility>
33#include <vector>
34#include <QPainterPath>
35#include <QWidget>
36
37
38namespace lmms
39{
40
41
42class SaControls;
43class SaProcessor;
44
45namespace gui
46{
47
48
50class SaSpectrumView : public QWidget
51{
52 Q_OBJECT
53public:
54 explicit SaSpectrumView(SaControls *controls, SaProcessor *processor, QWidget *_parent = 0);
55 ~SaSpectrumView() override = default;
56
57 QSize sizeHint() const override {return QSize(400, 200);}
58
59protected:
60 void paintEvent(QPaintEvent *event) override;
61 void mouseMoveEvent(QMouseEvent *event) override;
62 void mousePressEvent(QMouseEvent *event) override;
63 void resizeEvent(QResizeEvent *event) override;
64
65private slots:
66 void periodicUpdate();
67
68private:
71
72 // grid labels (position, label) and methods to generate them
73 std::vector<std::pair<int, std::string>> m_logFreqTics; // 10-20-50... Hz
74 std::vector<std::pair<int, std::string>> m_linearFreqTics; // 2k-4k-6k... Hz
75 std::vector<std::pair<float, std::string>> m_logAmpTics; // dB
76 std::vector<std::pair<float, std::string>> m_linearAmpTics; // 0..1
77
78 std::vector<std::pair<int, std::string>> makeLogFreqTics(int low, int high);
79 std::vector<std::pair<int, std::string>> makeLinearFreqTics(int low, int high);
80 std::vector<std::pair<float, std::string>> makeLogAmpTics(int low, int high);
81 std::vector<std::pair<float, std::string>> makeLinearAmpTics(int low, int high);
82
83 // currently selected ranges (see SaControls.h for enum definitions)
86
87 // draw the grid and all labels based on selected ranges
88 void drawGrid(QPainter &painter);
89
90 // local buffers for frequency bin values and a method to update them
91 // (mainly needed for averaging and to keep track of peak values)
92 std::vector<float> m_displayBufferL;
93 std::vector<float> m_displayBufferR;
94 std::vector<float> m_peakBufferL;
95 std::vector<float> m_peakBufferR;
96 void updateBuffers(const float *spectrum, float *displayBuffer, float *peakBuffer);
97
98 // final paths to be drawn by QPainter and methods to build them
99 QPainterPath m_pathL;
100 QPainterPath m_pathR;
101 QPainterPath m_pathPeakL;
102 QPainterPath m_pathPeakR;
103 void refreshPaths();
104 QPainterPath makePath(std::vector<float> &displayBuffer, float resolution);
105
106 // helper variables for path drawing
107 float m_decaySum; // indicates if there is anything left to draw
108 bool m_freezeRequest; // new reference should be acquired
109 bool m_frozen; // a reference is currently stored in the peakBuffer
110
111 // top level: refresh buffers, make paths and draw the spectrum
112 void drawSpectrum(QPainter &painter);
113
114 // current cursor location and a method to draw it
115 QPointF m_cursor;
116 void drawCursor(QPainter &painter);
117
118 // wrappers for most used SaProcessor conversion helpers
119 // (to make local code more readable)
120 float binToFreq(unsigned int bin_index);
121 float freqToXPixel(float frequency, unsigned int width);
122 float ampToYPixel(float amplitude, unsigned int height);
123
124 // current boundaries for drawing
125 unsigned int m_displayTop;
126 unsigned int m_displayBottom;
127 unsigned int m_displayLeft;
128 unsigned int m_displayRight;
129 unsigned int m_displayWidth;
130
131 // cached frequency bin → x position conversion for better performance
132 std::vector<float> m_cachedBinToX;
137 unsigned int m_cachedBinCount;
138 unsigned int m_cachedSampleRate;
139
140 #ifdef SA_DEBUG
141 float m_execution_avg;
142 float m_refresh_avg;
143 float m_path_avg;
144 float m_draw_avg;
145 #endif
146};
147
148
149} // namespace gui
150
151} // namespace lmms
152
153#endif // SASPECTRUMVIEW_H
154
Definition SaControls.h:48
Receives audio data, runs FFT analysis and stores the result.
Definition SaProcessor.h:50
std::vector< float > m_displayBufferL
Definition SaSpectrumView.h:92
std::vector< std::pair< float, std::string > > makeLogAmpTics(int low, int high)
Definition SaSpectrumView.cpp:725
void updateBuffers(const float *spectrum, float *displayBuffer, float *peakBuffer)
Definition SaSpectrumView.cpp:305
unsigned int m_cachedSampleRate
Definition SaSpectrumView.h:138
void mouseMoveEvent(QMouseEvent *event) override
Definition SaSpectrumView.cpp:824
std::vector< std::pair< float, std::string > > m_linearAmpTics
Definition SaSpectrumView.h:76
QPainterPath m_pathR
Definition SaSpectrumView.h:100
void drawSpectrum(QPainter &painter)
Definition SaSpectrumView.cpp:175
bool m_frozen
Definition SaSpectrumView.h:109
std::vector< float > m_cachedBinToX
Definition SaSpectrumView.h:132
unsigned int m_displayWidth
Definition SaSpectrumView.h:129
bool m_cachedLogX
Definition SaSpectrumView.h:135
QPainterPath m_pathPeakL
Definition SaSpectrumView.h:101
unsigned int m_cachedBinCount
Definition SaSpectrumView.h:137
float freqToXPixel(float frequency, unsigned int width)
Definition SaSpectrumView.cpp:635
float m_decaySum
Definition SaSpectrumView.h:107
float m_cachedRangeMin
Definition SaSpectrumView.h:133
QSize sizeHint() const override
Definition SaSpectrumView.h:57
float m_cachedRangeMax
Definition SaSpectrumView.h:134
std::vector< std::pair< float, std::string > > m_logAmpTics
Definition SaSpectrumView.h:75
QPointF m_cursor
Definition SaSpectrumView.h:115
std::vector< std::pair< int, std::string > > makeLinearFreqTics(int low, int high)
Definition SaSpectrumView.cpp:692
unsigned int m_displayRight
Definition SaSpectrumView.h:128
void refreshPaths()
Definition SaSpectrumView.cpp:231
void drawCursor(QPainter &painter)
Definition SaSpectrumView.cpp:576
int m_freqRangeIndex
Definition SaSpectrumView.h:84
std::vector< std::pair< int, std::string > > makeLogFreqTics(int low, int high)
Definition SaSpectrumView.cpp:649
int m_ampRangeIndex
Definition SaSpectrumView.h:85
void paintEvent(QPaintEvent *event) override
Definition SaSpectrumView.cpp:97
unsigned int m_displayTop
Definition SaSpectrumView.h:125
unsigned int m_cachedDisplayWidth
Definition SaSpectrumView.h:136
SaProcessor * m_processor
Definition SaSpectrumView.h:70
bool m_freezeRequest
Definition SaSpectrumView.h:108
unsigned int m_displayBottom
Definition SaSpectrumView.h:126
QPainterPath m_pathPeakR
Definition SaSpectrumView.h:102
QPainterPath makePath(std::vector< float > &displayBuffer, float resolution)
Definition SaSpectrumView.cpp:354
std::vector< std::pair< int, std::string > > m_linearFreqTics
Definition SaSpectrumView.h:74
float binToFreq(unsigned int bin_index)
Definition SaSpectrumView.cpp:629
~SaSpectrumView() override=default
void mousePressEvent(QMouseEvent *event) override
Definition SaSpectrumView.cpp:829
SaSpectrumView(SaControls *controls, SaProcessor *processor, QWidget *_parent=0)
Definition SaSpectrumView.cpp:52
void resizeEvent(QResizeEvent *event) override
Definition SaSpectrumView.cpp:836
float ampToYPixel(float amplitude, unsigned int height)
Definition SaSpectrumView.cpp:641
std::vector< float > m_displayBufferR
Definition SaSpectrumView.h:93
std::vector< std::pair< float, std::string > > makeLinearAmpTics(int low, int high)
Definition SaSpectrumView.cpp:765
void periodicUpdate()
Definition SaSpectrumView.cpp:814
void drawGrid(QPainter &painter)
Definition SaSpectrumView.cpp:436
QPainterPath m_pathL
Definition SaSpectrumView.h:99
unsigned int m_displayLeft
Definition SaSpectrumView.h:127
std::vector< std::pair< int, std::string > > m_logFreqTics
Definition SaSpectrumView.h:73
std::vector< float > m_peakBufferL
Definition SaSpectrumView.h:94
const SaControls * m_controls
Definition SaSpectrumView.h:69
std::vector< float > m_peakBufferR
Definition SaSpectrumView.h:95
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
Definition AudioPortAudio.cpp:223
Definition AudioAlsa.cpp:35