LMMS
Loading...
Searching...
No Matches
SampleThumbnail.h
Go to the documentation of this file.
1/*
2 * SampleThumbnail.h
3 *
4 * Copyright (c) 2024 Khoi Dau <casboi86@gmail.com>
5 * Copyright (c) 2024 Sotonye Atemie <sakertooth@gmail.com>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program (see COPYING); if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA.
23 *
24 */
25
26#ifndef LMMS_SAMPLE_THUMBNAIL_H
27#define LMMS_SAMPLE_THUMBNAIL_H
28
29#include <QDateTime>
30#include <QRect>
31#include <memory>
32
33#include "lmms_export.h"
34#include "SampleBuffer.h"
35#include "SampleFrame.h"
36
37class QPainter;
38
39namespace lmms {
40class Sample;
41}
42
43namespace lmms::gui {
44
56class LMMS_EXPORT SampleThumbnail
57{
58public:
60 {
61 QRect sampleRect;
62
65
66 float amplification = 1.0f;
67
68 float sampleStart = 0.0f;
69
70 float sampleEnd = 1.0f;
71
72 bool reversed = false;
73 };
74
75 SampleThumbnail() = default;
77 void visualize(VisualizeParameters parameters, QPainter& painter) const;
78
79private:
81 {
82 public:
83 struct Peak
84 {
85 Peak() = default;
86
87 Peak(float min, float max)
88 : min(min)
89 , max(max)
90 {
91 }
92
93 Peak(const SampleFrame& frame)
94 : min(std::min(frame.left(), frame.right()))
95 , max(std::max(frame.left(), frame.right()))
96 {
97 }
98
99 Peak operator+(const Peak& other) const { return Peak(std::min(min, other.min), std::max(max, other.max)); }
100 Peak operator+(const SampleFrame& frame) const { return *this + Peak{frame}; }
101
102 float min = std::numeric_limits<float>::infinity();
103 float max = -std::numeric_limits<float>::infinity();
104 };
105
106 Thumbnail() = default;
107 Thumbnail(std::vector<Peak> peaks, double samplesPerPeak);
108 Thumbnail(const float* buffer, size_t size, size_t width);
109
110 Thumbnail zoomOut(float factor) const;
111
112 Peak* data() { return m_peaks.data(); }
113 Peak& operator[](size_t index) { return m_peaks[index]; }
114 const Peak& operator[](size_t index) const { return m_peaks[index]; }
115
116 int width() const { return m_peaks.size(); }
117 double samplesPerPeak() const { return m_samplesPerPeak; }
118
119 private:
120 std::vector<Peak> m_peaks;
121 double m_samplesPerPeak = 0.0;
122 };
123
125 {
126 QString filePath;
127 QDateTime lastModified;
128
129 friend bool operator==(const SampleThumbnailEntry& first, const SampleThumbnailEntry& second)
130 {
131 return first.filePath == second.filePath && first.lastModified == second.lastModified;
132 }
133 };
134
135 struct Hash
136 {
137 std::size_t operator()(const SampleThumbnailEntry& entry) const noexcept { return qHash(entry.filePath); }
138 };
139
140 using ThumbnailCache = std::vector<Thumbnail>;
141 std::shared_ptr<ThumbnailCache> m_thumbnailCache = std::make_shared<ThumbnailCache>();
142 std::shared_ptr<const SampleBuffer> m_buffer = SampleBuffer::emptyBuffer();
143 inline static std::unordered_map<SampleThumbnailEntry, std::shared_ptr<ThumbnailCache>, Hash> s_sampleThumbnailCacheMap;
144};
145
146} // namespace lmms::gui
147
148#endif // LMMS_SAMPLE_THUMBNAIL_H
qint64 qHash(const QFileInfo &fi)
Definition PluginFactory.cpp:39
static auto emptyBuffer() -> std::shared_ptr< const SampleBuffer >
Definition SampleBuffer.cpp:67
Definition SampleFrame.h:41
Definition Sample.h:37
int width() const
Definition SampleThumbnail.h:116
Peak & operator[](size_t index)
Definition SampleThumbnail.h:113
Thumbnail zoomOut(float factor) const
Definition SampleThumbnail.cpp:59
const Peak & operator[](size_t index) const
Definition SampleThumbnail.h:114
double samplesPerPeak() const
Definition SampleThumbnail.h:117
std::vector< Peak > m_peaks
Definition SampleThumbnail.h:120
Peak * data()
Definition SampleThumbnail.h:112
double m_samplesPerPeak
Definition SampleThumbnail.h:121
static std::unordered_map< SampleThumbnailEntry, std::shared_ptr< ThumbnailCache >, Hash > s_sampleThumbnailCacheMap
Definition SampleThumbnail.h:143
void visualize(VisualizeParameters parameters, QPainter &painter) const
Definition SampleThumbnail.cpp:108
std::shared_ptr< const SampleBuffer > m_buffer
Definition SampleThumbnail.h:142
std::vector< Thumbnail > ThumbnailCache
Definition SampleThumbnail.h:140
std::shared_ptr< ThumbnailCache > m_thumbnailCache
Definition SampleThumbnail.h:141
struct @217364254171237306365336346027204030346122123370::@024112272203321272161030127354157140271147144314 left
struct @217364254171237306365336346027204030346122123370::@024112272203321272161030127354157140271147144314 right
Definition AudioPortAudio.cpp:209
Definition AudioAlsa.cpp:35
Definition juce_Uuid.h:141
Definition SampleThumbnail.h:136
std::size_t operator()(const SampleThumbnailEntry &entry) const noexcept
Definition SampleThumbnail.h:137
Definition SampleThumbnail.h:125
friend bool operator==(const SampleThumbnailEntry &first, const SampleThumbnailEntry &second)
Definition SampleThumbnail.h:129
QDateTime lastModified
Definition SampleThumbnail.h:127
QString filePath
Definition SampleThumbnail.h:126
Definition SampleThumbnail.h:84
float min
Definition SampleThumbnail.h:102
Peak operator+(const Peak &other) const
Definition SampleThumbnail.h:99
Peak(float min, float max)
Definition SampleThumbnail.h:87
Peak(const SampleFrame &frame)
Definition SampleThumbnail.h:93
float max
Definition SampleThumbnail.h:103
Peak operator+(const SampleFrame &frame) const
Definition SampleThumbnail.h:100
QRect sampleRect
A rectangle that covers the entire range of samples.
Definition SampleThumbnail.h:61
bool reversed
Determines if the waveform is drawn in reverse or not.
Definition SampleThumbnail.h:72
float sampleStart
Where the sample begins for drawing.
Definition SampleThumbnail.h:68
float amplification
The amount of amplification to apply to the waveform.
Definition SampleThumbnail.h:66
QRect viewportRect
sampleRect when null.
Definition SampleThumbnail.h:63
float sampleEnd
Where the sample ends for drawing.
Definition SampleThumbnail.h:70
signed int sample
Definition tap_dynamics_m.c:41
ulg size
Definition extract.c:2350