LMMS
Loading...
Searching...
No Matches
Sample.h
Go to the documentation of this file.
1/*
2 * Sample.h
3 *
4 * Copyright (c) 2025 saker <sakertooth@gmail.com>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25#ifndef LMMS_SAMPLE_H
26#define LMMS_SAMPLE_H
27
28#include <memory>
29
30#include "AudioResampler.h"
31#include "Note.h"
32#include "SampleBuffer.h"
33#include "lmms_export.h"
34
35namespace lmms {
36class LMMS_EXPORT Sample
37{
38public:
39 enum class Loop
40 {
41 Off,
42 On,
43 PingPong
44 };
45
46 class LMMS_EXPORT PlaybackState
47 {
48 public:
50 : m_resampler(interpolationMode)
52 {
53 }
54
55 auto frameIndex() const -> int { return m_frameIndex; }
56 auto backwards() const -> bool { return m_backwards; }
57
58 void setFrameIndex(int index) { m_frameIndex = index; }
60
61 private:
63 std::array<SampleFrame, DEFAULT_BUFFER_SIZE> m_buffer;
64 std::span<SampleFrame> m_bufferView;
65 int m_frameIndex = 0;
66 bool m_backwards = false;
67 friend class Sample;
68 };
69
70 Sample() = default;
71
72 Sample(const SampleFrame* data, size_t numFrames, int sampleRate = Engine::audioEngine()->outputSampleRate());
73 Sample(const Sample& other);
74 Sample(Sample&& other) noexcept;
75 explicit Sample(std::shared_ptr<const SampleBuffer> buffer);
76
77 auto operator=(const Sample&) -> Sample&;
78 auto operator=(Sample&&) noexcept -> Sample&;
79
80 auto play(SampleFrame* dst, PlaybackState* state, size_t numFrames, Loop loopMode = Loop::Off,
81 double ratio = 1.0) const -> bool;
82
83 auto sampleDuration() const -> std::chrono::milliseconds;
84 auto sampleFile() const -> const QString& { return m_buffer->audioFile(); }
85 auto sampleRate() const -> int { return m_buffer->sampleRate(); }
86 auto sampleSize() const -> size_t { return m_buffer->size(); }
87
88 auto toBase64() const -> QString { return m_buffer->toBase64(); }
89
90 auto data() const -> const SampleFrame* { return m_buffer->data(); }
91 auto buffer() const -> std::shared_ptr<const SampleBuffer> { return m_buffer; }
92 auto startFrame() const -> int { return m_startFrame.load(std::memory_order_relaxed); }
93 auto endFrame() const -> int { return m_endFrame.load(std::memory_order_relaxed); }
94 auto loopStartFrame() const -> int { return m_loopStartFrame.load(std::memory_order_relaxed); }
95 auto loopEndFrame() const -> int { return m_loopEndFrame.load(std::memory_order_relaxed); }
96 auto amplification() const -> float { return m_amplification.load(std::memory_order_relaxed); }
97 auto frequency() const -> float { return m_frequency.load(std::memory_order_relaxed); }
98 auto reversed() const -> bool { return m_reversed.load(std::memory_order_relaxed); }
99
100 void setStartFrame(int startFrame) { m_startFrame.store(startFrame, std::memory_order_relaxed); }
101 void setEndFrame(int endFrame) { m_endFrame.store(endFrame, std::memory_order_relaxed); }
102 void setLoopStartFrame(int loopStartFrame) { m_loopStartFrame.store(loopStartFrame, std::memory_order_relaxed); }
103 void setLoopEndFrame(int loopEndFrame) { m_loopEndFrame.store(loopEndFrame, std::memory_order_relaxed); }
104 void setAllPointFrames(int startFrame, int endFrame, int loopStartFrame, int loopEndFrame);
105 void setAmplification(float amplification) { m_amplification.store(amplification, std::memory_order_relaxed); }
106 void setFrequency(float frequency) { m_frequency.store(frequency, std::memory_order_relaxed); }
107 void setReversed(bool reversed) { m_reversed.store(reversed, std::memory_order_relaxed); }
108
109private:
110 f_cnt_t render(SampleFrame* dst, f_cnt_t size, PlaybackState* state, Loop loop) const;
111 std::shared_ptr<const SampleBuffer> m_buffer = SampleBuffer::emptyBuffer();
112 std::atomic<int> m_startFrame = 0;
113 std::atomic<int> m_endFrame = 0;
114 std::atomic<int> m_loopStartFrame = 0;
115 std::atomic<int> m_loopEndFrame = 0;
116 std::atomic<float> m_amplification = 1.0f;
117 std::atomic<float> m_frequency = DefaultBaseFreq;
118 std::atomic<bool> m_reversed = false;
119};
120} // namespace lmms
121#endif
#define noexcept
Definition DistrhoDefines.h:72
goto loop
Definition Spc_Cpu.h:155
A utility class for resampling interleaved audio buffers using various resampling algorithms.
Definition AudioResampler.h:41
Mode
Defines the resampling method to use.
Definition AudioResampler.h:48
@ Linear
Linear interpolation.
Definition AudioResampler.h:50
static AudioEngine * audioEngine()
Definition Engine.h:59
Definition Sample.h:47
std::array< SampleFrame, DEFAULT_BUFFER_SIZE > m_buffer
Definition Sample.h:63
bool m_backwards
Definition Sample.h:66
friend class Sample
Definition Sample.h:67
void setFrameIndex(int index)
Definition Sample.h:58
AudioResampler m_resampler
Definition Sample.h:62
int m_frameIndex
Definition Sample.h:65
auto frameIndex() const -> int
Definition Sample.h:55
auto backwards() const -> bool
Definition Sample.h:56
std::span< SampleFrame > m_bufferView
Definition Sample.h:64
PlaybackState(AudioResampler::Mode interpolationMode=AudioResampler::Mode::Linear, int frameIndex=0)
Definition Sample.h:49
void setBackwards(bool backwards)
Definition Sample.h:59
Definition SampleBuffer.h:39
static auto emptyBuffer() -> std::shared_ptr< const SampleBuffer >
Definition SampleBuffer.cpp:67
Definition SampleFrame.h:41
auto toBase64() const -> QString
Definition Sample.h:88
auto endFrame() const -> int
Definition Sample.h:93
auto buffer() const -> std::shared_ptr< const SampleBuffer >
Definition Sample.h:91
std::atomic< int > m_loopEndFrame
Definition Sample.h:115
std::atomic< int > m_startFrame
Definition Sample.h:112
auto sampleDuration() const -> std::chrono::milliseconds
Definition Sample.cpp:176
std::atomic< float > m_frequency
Definition Sample.h:117
auto amplification() const -> float
Definition Sample.h:96
void setEndFrame(int endFrame)
Definition Sample.h:101
auto operator=(const Sample &) -> Sample &
Definition Sample.cpp:71
std::atomic< int > m_loopStartFrame
Definition Sample.h:114
Sample()=default
auto sampleFile() const -> const QString &
Definition Sample.h:84
void setLoopEndFrame(int loopEndFrame)
Definition Sample.h:103
void setReversed(bool reversed)
Definition Sample.h:107
void setFrequency(float frequency)
Definition Sample.h:106
std::atomic< int > m_endFrame
Definition Sample.h:113
auto reversed() const -> bool
Definition Sample.h:98
std::atomic< bool > m_reversed
Definition Sample.h:118
auto sampleSize() const -> size_t
Definition Sample.h:86
void setStartFrame(int startFrame)
Definition Sample.h:100
auto play(SampleFrame *dst, PlaybackState *state, size_t numFrames, Loop loopMode=Loop::Off, double ratio=1.0) const -> bool
Definition Sample.cpp:99
auto sampleRate() const -> int
Definition Sample.h:85
Loop
Definition Sample.h:40
std::atomic< float > m_amplification
Definition Sample.h:116
auto loopEndFrame() const -> int
Definition Sample.h:95
std::shared_ptr< const SampleBuffer > m_buffer
Definition Sample.h:111
auto frequency() const -> float
Definition Sample.h:97
void setAmplification(float amplification)
Definition Sample.h:105
auto loopStartFrame() const -> int
Definition Sample.h:94
void setLoopStartFrame(int loopStartFrame)
Definition Sample.h:102
auto data() const -> const SampleFrame *
Definition Sample.h:90
auto startFrame() const -> int
Definition Sample.h:92
Definition AudioAlsa.cpp:35
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
const float DefaultBaseFreq
Definition Note.h:94
Definition juce_Uuid.h:141
ulg size
Definition extract.c:2350
#define const
Definition zconf.h:137