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 {
40
41class Sample;
42
54class LMMS_EXPORT SampleThumbnail
55{
56public:
58 {
59 QRect sampleRect;
60
63
64 float amplification = 1.0f;
65
66 float sampleStart = 0.0f;
67
68 float sampleEnd = 1.0f;
69
70 bool reversed = false;
71 };
72
73 SampleThumbnail() = default;
75 void visualize(VisualizeParameters parameters, QPainter& painter) const;
76
77private:
79 {
80 public:
81 struct Peak
82 {
83 Peak() = default;
84
85 Peak(float min, float max)
86 : min(min)
87 , max(max)
88 {
89 }
90
91 Peak(const SampleFrame& frame)
92 : min(std::min(frame.left(), frame.right()))
93 , max(std::max(frame.left(), frame.right()))
94 {
95 }
96
97 Peak operator+(const Peak& other) const { return Peak(std::min(min, other.min), std::max(max, other.max)); }
98 Peak operator+(const SampleFrame& frame) const { return *this + Peak{frame}; }
99
100 float min = std::numeric_limits<float>::infinity();
101 float max = -std::numeric_limits<float>::infinity();
102 };
103
104 Thumbnail() = default;
105 Thumbnail(std::vector<Peak> peaks, double samplesPerPeak);
106 Thumbnail(const float* buffer, size_t size, size_t width);
107
108 Thumbnail zoomOut(float factor) const;
109
110 Peak* data() { return m_peaks.data(); }
111 Peak& operator[](size_t index) { return m_peaks[index]; }
112 const Peak& operator[](size_t index) const { return m_peaks[index]; }
113
114 int width() const { return m_peaks.size(); }
115 double samplesPerPeak() const { return m_samplesPerPeak; }
116
117 private:
118 std::vector<Peak> m_peaks;
119 double m_samplesPerPeak = 0.0;
120 };
121
123 {
124 QString filePath;
125 QDateTime lastModified;
126
127 friend bool operator==(const SampleThumbnailEntry& first, const SampleThumbnailEntry& second)
128 {
129 return first.filePath == second.filePath && first.lastModified == second.lastModified;
130 }
131 };
132
133 struct Hash
134 {
135 std::size_t operator()(const SampleThumbnailEntry& entry) const noexcept { return qHash(entry.filePath); }
136 };
137
138 using ThumbnailCache = std::vector<Thumbnail>;
139 std::shared_ptr<ThumbnailCache> m_thumbnailCache = std::make_shared<ThumbnailCache>();
140 std::shared_ptr<const SampleBuffer> m_buffer = SampleBuffer::emptyBuffer();
141 inline static std::unordered_map<SampleThumbnailEntry, std::shared_ptr<ThumbnailCache>, Hash> s_sampleThumbnailCacheMap;
142};
143
144} // namespace lmms
145
146#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
std::vector< Peak > m_peaks
Definition SampleThumbnail.h:118
double m_samplesPerPeak
Definition SampleThumbnail.h:119
double samplesPerPeak() const
Definition SampleThumbnail.h:115
Peak * data()
Definition SampleThumbnail.h:110
Thumbnail zoomOut(float factor) const
Definition SampleThumbnail.cpp:59
Peak & operator[](size_t index)
Definition SampleThumbnail.h:111
int width() const
Definition SampleThumbnail.h:114
const Peak & operator[](size_t index) const
Definition SampleThumbnail.h:112
std::shared_ptr< const SampleBuffer > m_buffer
Definition SampleThumbnail.h:140
std::vector< Thumbnail > ThumbnailCache
Definition SampleThumbnail.h:138
std::shared_ptr< ThumbnailCache > m_thumbnailCache
Definition SampleThumbnail.h:139
static std::unordered_map< SampleThumbnailEntry, std::shared_ptr< ThumbnailCache >, Hash > s_sampleThumbnailCacheMap
Definition SampleThumbnail.h:141
void visualize(VisualizeParameters parameters, QPainter &painter) const
Definition SampleThumbnail.cpp:108
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 left
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 right
Definition AudioAlsa.cpp:35
Definition juce_Uuid.h:141
Definition SampleThumbnail.h:134
std::size_t operator()(const SampleThumbnailEntry &entry) const noexcept
Definition SampleThumbnail.h:135
Definition SampleThumbnail.h:123
QDateTime lastModified
Definition SampleThumbnail.h:125
friend bool operator==(const SampleThumbnailEntry &first, const SampleThumbnailEntry &second)
Definition SampleThumbnail.h:127
QString filePath
Definition SampleThumbnail.h:124
Definition SampleThumbnail.h:82
Peak operator+(const SampleFrame &frame) const
Definition SampleThumbnail.h:98
Peak(float min, float max)
Definition SampleThumbnail.h:85
Peak operator+(const Peak &other) const
Definition SampleThumbnail.h:97
Peak(const SampleFrame &frame)
Definition SampleThumbnail.h:91
float min
Definition SampleThumbnail.h:100
float max
Definition SampleThumbnail.h:101
Definition SampleThumbnail.h:58
float sampleEnd
Where the sample ends for drawing.
Definition SampleThumbnail.h:68
QRect viewportRect
sampleRect when null.
Definition SampleThumbnail.h:61
float sampleStart
Where the sample begins for drawing.
Definition SampleThumbnail.h:66
float amplification
The amount of amplification to apply to the waveform.
Definition SampleThumbnail.h:64
QRect sampleRect
A rectangle that covers the entire range of samples.
Definition SampleThumbnail.h:59
bool reversed
Determines if the waveform is drawn in reverse or not.
Definition SampleThumbnail.h:70
signed int sample
Definition tap_dynamics_m.c:41
ulg size
Definition extract.c:2350