Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
sample_edit_document.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <vector>
6
9
10namespace pulp::audio {
11
13 std::uint32_t sample_id = kInvalidSampleId;
14 std::uint64_t generation = 0;
15 std::uint32_t num_channels = 0;
16 std::uint64_t num_frames = 0;
17 double sample_rate = 0.0;
18
19 [[nodiscard]] bool valid() const noexcept;
21 const PublishedSampleView& view) noexcept;
22};
23
26 std::uint64_t revision = 0;
27 std::uint64_t trim_start = 0;
28 std::uint64_t trim_end = 0;
29 std::uint64_t fade_in_frames = 0;
30 std::uint64_t fade_out_frames = 0;
31 bool reversed = false;
32 float normalize_gain = 1.0f;
33 bool has_loop = false;
34 std::uint64_t loop_start = 0;
35 std::uint64_t loop_end = 0;
36
37 [[nodiscard]] bool valid() const noexcept;
38 [[nodiscard]] std::uint64_t trimmed_frames() const noexcept;
39};
40
50
58
59// Metadata-only sample edit document for control/editor code.
60//
61// The document owns no sample audio and performs no import/export, file I/O, or
62// destructive buffer mutation. Operations describe edit intent that a later
63// renderer/exporter can materialize off the audio thread.
65public:
66 bool reset(EditableSampleSource source) noexcept;
67 void clear() noexcept;
68
69 [[nodiscard]] bool valid() const noexcept { return state_.valid(); }
70 [[nodiscard]] const EditableSampleState& state() const noexcept { return state_; }
71
72 [[nodiscard]] SampleEditOperation make_set_trim(std::uint64_t start,
73 std::uint64_t end) const noexcept;
74 [[nodiscard]] SampleEditOperation make_set_fades(std::uint64_t fade_in_frames,
75 std::uint64_t fade_out_frames) const noexcept;
76 [[nodiscard]] SampleEditOperation make_set_loop(std::uint64_t start,
77 std::uint64_t end) const noexcept;
78 [[nodiscard]] SampleEditOperation make_clear_loop() const noexcept;
79 [[nodiscard]] SampleEditOperation make_set_reverse(bool reversed) const noexcept;
80 [[nodiscard]] SampleEditOperation make_set_normalize_gain(float gain) const noexcept;
81
82 bool apply(const SampleEditOperation& operation) noexcept;
84
85private:
86 [[nodiscard]] SampleEditOperation make_operation(SampleEditOperationKind kind,
87 EditableSampleState after) const noexcept;
88
89 EditableSampleState state_{};
90};
91
92// Bounded undo/redo stack for editor-owned sample edit operations.
93// prepare() reserves storage; perform/undo/redo do not allocate while the
94// operation count remains within the prepared capacity. This is still a
95// control-thread/editor primitive, not an audio-callback data structure.
97public:
98 bool prepare(std::size_t max_operations);
99 void clear() noexcept;
100
101 [[nodiscard]] std::size_t capacity() const noexcept { return capacity_; }
102 [[nodiscard]] std::size_t undo_count() const noexcept { return undo_stack_.size(); }
103 [[nodiscard]] std::size_t redo_count() const noexcept { return redo_stack_.size(); }
104 [[nodiscard]] bool can_undo() const noexcept { return !undo_stack_.empty(); }
105 [[nodiscard]] bool can_redo() const noexcept { return !redo_stack_.empty(); }
106
107 bool perform(EditableSampleDocument& document, const SampleEditOperation& operation);
110
111private:
112 std::size_t capacity_ = 0;
113 std::vector<SampleEditOperation> undo_stack_;
114 std::vector<SampleEditOperation> redo_stack_;
115};
116
117} // namespace pulp::audio
Definition sample_edit_document.hpp:64
const EditableSampleState & state() const noexcept
Definition sample_edit_document.hpp:70
bool apply(const SampleEditOperation &operation) noexcept
SampleEditOperation make_set_fades(std::uint64_t fade_in_frames, std::uint64_t fade_out_frames) const noexcept
SampleEditOperation make_set_reverse(bool reversed) const noexcept
bool valid() const noexcept
Definition sample_edit_document.hpp:69
bool reset(EditableSampleSource source) noexcept
bool restore_state(const EditableSampleState &state) noexcept
SampleEditOperation make_set_normalize_gain(float gain) const noexcept
SampleEditOperation make_set_loop(std::uint64_t start, std::uint64_t end) const noexcept
SampleEditOperation make_set_trim(std::uint64_t start, std::uint64_t end) const noexcept
SampleEditOperation make_clear_loop() const noexcept
Definition sample_edit_document.hpp:96
bool can_undo() const noexcept
Definition sample_edit_document.hpp:104
bool perform(EditableSampleDocument &document, const SampleEditOperation &operation)
bool can_redo() const noexcept
Definition sample_edit_document.hpp:105
std::size_t capacity() const noexcept
Definition sample_edit_document.hpp:101
std::size_t redo_count() const noexcept
Definition sample_edit_document.hpp:103
bool prepare(std::size_t max_operations)
std::size_t undo_count() const noexcept
Definition sample_edit_document.hpp:102
bool undo(EditableSampleDocument &document)
bool redo(EditableSampleDocument &document)
Definition analyzer_provider.hpp:12
SampleEditOperationKind
Definition sample_edit_document.hpp:41
@ set_reverse
Definition sample_edit_document.hpp:47
@ set_loop
Definition sample_edit_document.hpp:45
@ none
Definition sample_edit_document.hpp:42
@ set_fades
Definition sample_edit_document.hpp:44
@ set_trim
Definition sample_edit_document.hpp:43
@ clear_loop
Definition sample_edit_document.hpp:46
@ set_normalize_gain
Definition sample_edit_document.hpp:48
constexpr std::uint32_t kInvalidSampleId
Definition sample_identity.hpp:8
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
STL namespace.
Definition sample_edit_document.hpp:12
double sample_rate
Definition sample_edit_document.hpp:17
std::uint32_t sample_id
Definition sample_edit_document.hpp:13
std::uint64_t generation
Definition sample_edit_document.hpp:14
std::uint32_t num_channels
Definition sample_edit_document.hpp:15
static EditableSampleSource from_published_sample(std::uint32_t sample_id, const PublishedSampleView &view) noexcept
bool valid() const noexcept
std::uint64_t num_frames
Definition sample_edit_document.hpp:16
Definition sample_edit_document.hpp:24
std::uint64_t fade_in_frames
Definition sample_edit_document.hpp:29
std::uint64_t loop_end
Definition sample_edit_document.hpp:35
std::uint64_t revision
Definition sample_edit_document.hpp:26
float normalize_gain
Definition sample_edit_document.hpp:32
bool reversed
Definition sample_edit_document.hpp:31
bool valid() const noexcept
std::uint64_t trim_start
Definition sample_edit_document.hpp:27
std::uint64_t trim_end
Definition sample_edit_document.hpp:28
std::uint64_t fade_out_frames
Definition sample_edit_document.hpp:30
bool has_loop
Definition sample_edit_document.hpp:33
std::uint64_t trimmed_frames() const noexcept
std::uint64_t loop_start
Definition sample_edit_document.hpp:34
EditableSampleSource source
Definition sample_edit_document.hpp:25
Definition sample_slot_bank.hpp:22
Definition sample_edit_document.hpp:51
SampleEditOperationKind kind
Definition sample_edit_document.hpp:52
bool valid() const noexcept
EditableSampleState after
Definition sample_edit_document.hpp:54
EditableSampleState before
Definition sample_edit_document.hpp:53