lmms
Cross-platform music production software
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
67
68 float amplification = 1.0f;
69 float sampleStart = 0.0f;
70 float sampleEnd = 1.0f;
71 bool reversed = false;
72 };
73
74 SampleThumbnail() = default;
75 SampleThumbnail(const Sample& sample);
76 void visualize(VisualizeParameters parameters, QPainter& painter) const;
77
78private:
80 {
81 public:
82 struct Peak
83 {
84 Peak() = default;
85
86 Peak(float min, float max)
87 : min(min)
88 , max(max)
89 {
90 }
91
92 Peak(const SampleFrame& frame)
93 : min(std::min(frame.left(), frame.right()))
94 , max(std::max(frame.left(), frame.right()))
95 {
96 }
97
98 Peak operator+(const Peak& other) const { return Peak(std::min(min, other.min), std::max(max, other.max)); }
99 Peak operator+(const SampleFrame& frame) const { return *this + Peak{frame}; }
100
101 float min = std::numeric_limits<float>::infinity();
102 float max = -std::numeric_limits<float>::infinity();
103 };
104
105 Thumbnail() = default;
106 Thumbnail(std::vector<Peak> peaks, double samplesPerPeak);
107 Thumbnail(const float* buffer, size_t size, size_t width);
108
109 Thumbnail zoomOut(float factor) const;
110
111 Peak* data() { return m_peaks.data(); }
112 Peak& operator[](size_t index) { return m_peaks[index]; }
113 const Peak& operator[](size_t index) const { return m_peaks[index]; }
114
115 int width() const { return m_peaks.size(); }
116 double samplesPerPeak() const { return m_samplesPerPeak; }
117
118 private:
119 std::vector<Peak> m_peaks;
120 double m_samplesPerPeak = 0.0;
121 };
122
124 {
125 QString filePath;
126 QDateTime lastModified;
127
128 friend bool operator==(const SampleThumbnailEntry& first, const SampleThumbnailEntry& second)
129 {
130 return first.filePath == second.filePath && first.lastModified == second.lastModified;
131 }
132 };
133
134 struct Hash
135 {
136 std::size_t operator()(const SampleThumbnailEntry& entry) const noexcept { return qHash(entry.filePath); }
137 };
138
139 using ThumbnailCache = std::vector<Thumbnail>;
140 std::shared_ptr<ThumbnailCache> m_thumbnailCache = std::make_shared<ThumbnailCache>();
141 std::shared_ptr<const SampleBuffer> m_buffer = SampleBuffer::emptyBuffer();
142 inline static std::unordered_map<SampleThumbnailEntry, std::shared_ptr<ThumbnailCache>, Hash> s_sampleThumbnailCacheMap;
143};
144
145} // namespace lmms::gui
146
147#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:115
Peak & operator[](size_t index)
Definition SampleThumbnail.h:112
Thumbnail zoomOut(float factor) const
Definition SampleThumbnail.cpp:59
const Peak & operator[](size_t index) const
Definition SampleThumbnail.h:113
double samplesPerPeak() const
Definition SampleThumbnail.h:116
std::vector< Peak > m_peaks
Definition SampleThumbnail.h:119
Peak * data()
Definition SampleThumbnail.h:111
double m_samplesPerPeak
Definition SampleThumbnail.h:120
static std::unordered_map< SampleThumbnailEntry, std::shared_ptr< ThumbnailCache >, Hash > s_sampleThumbnailCacheMap
Definition SampleThumbnail.h:142
void visualize(VisualizeParameters parameters, QPainter &painter) const
Definition SampleThumbnail.cpp:108
std::shared_ptr< const SampleBuffer > m_buffer
Definition SampleThumbnail.h:141
std::vector< Thumbnail > ThumbnailCache
Definition SampleThumbnail.h:139
std::shared_ptr< ThumbnailCache > m_thumbnailCache
Definition SampleThumbnail.h:140
Definition AudioPortAudio.cpp:209
Definition RemotePluginBase.cpp:34
Definition SampleThumbnail.h:135
std::size_t operator()(const SampleThumbnailEntry &entry) const noexcept
Definition SampleThumbnail.h:136
Definition SampleThumbnail.h:124
friend bool operator==(const SampleThumbnailEntry &first, const SampleThumbnailEntry &second)
Definition SampleThumbnail.h:128
QDateTime lastModified
Definition SampleThumbnail.h:126
QString filePath
Definition SampleThumbnail.h:125
Definition SampleThumbnail.h:83
float min
Definition SampleThumbnail.h:101
Peak operator+(const Peak &other) const
Definition SampleThumbnail.h:98
Peak(float min, float max)
Definition SampleThumbnail.h:86
Peak(const SampleFrame &frame)
Definition SampleThumbnail.h:92
float max
Definition SampleThumbnail.h:102
Peak operator+(const SampleFrame &frame) const
Definition SampleThumbnail.h:99
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:71
float sampleStart
Where the sample begins for drawing.
Definition SampleThumbnail.h:69
float amplification
The amount of amplification to apply to the waveform.
Definition SampleThumbnail.h:68
QRect viewportRect
Specifies the location in sampleRect where the waveform will be drawn.
Definition SampleThumbnail.h:66
float sampleEnd
Where the sample ends for drawing.
Definition SampleThumbnail.h:70