Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
instrument_voice_allocator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <span>
6#include <vector>
7
9
10namespace pulp::audio {
11
12enum class VoiceStealPolicy : std::uint8_t {
15};
16
17enum class VoiceState : std::uint8_t {
21};
22
23enum class VoiceTerminationReason : std::uint8_t {
26};
27
28inline constexpr std::uint32_t kDefaultVoiceTerminationFadeFrames = 64;
29
32 std::uint64_t voice_id = 0;
33 std::uint64_t started_at = 0;
34 int note = -1;
35 std::uint32_t sample_id = kInvalidSampleId;
36 std::uint32_t voice_group = 0;
37 std::uint32_t choke_group = 0;
38};
39
46
48 int note = 60;
49 std::uint32_t sample_id = kInvalidSampleId;
50 std::uint32_t voice_group = 0;
51 // Non-zero choke_group is an exclusive group: triggering a voice in group N
52 // force-terminates existing voices in group N before allocating the new one.
53 std::uint32_t choke_group = 0;
54};
55
57 bool allocated = false;
58 bool stolen = false;
59 std::uint32_t voice_index = 0;
60 std::uint64_t voice_id = 0;
61 std::uint32_t stolen_voice_index = 0;
62 std::uint64_t stolen_voice_id = 0;
63 std::uint32_t choked_count = 0;
64 std::uint32_t termination_count = 0;
65 std::uint32_t termination_overflow_count = 0;
66};
67
69public:
71
72 // Control/background-thread only. Allocates fixed voice storage.
73 bool prepare(std::uint32_t max_voices);
74 void reset() noexcept;
75
76 std::uint32_t max_voices() const noexcept { return max_voices_; }
77 // After prepare(), this is audio-thread-owned mutable runtime state. Do not
78 // read voices() or mutate policy from UI/control threads while realtime
79 // trigger/release calls may run; publish telemetry through a separate
80 // RT-to-control snapshot/queue.
81 std::uint32_t active_voice_count() const noexcept;
82 std::uint32_t allocated_voice_count() const noexcept;
83 std::span<const InstrumentVoice> voices() const noexcept { return voices_; }
84
85 void set_steal_policy(VoiceStealPolicy policy) noexcept { steal_policy_ = policy; }
86 VoiceStealPolicy steal_policy() const noexcept { return steal_policy_; }
87 void set_termination_fade_frames(std::uint32_t frames) noexcept {
88 termination_fade_frames_ = frames;
89 }
90 std::uint32_t termination_fade_frames() const noexcept {
91 return termination_fade_frames_;
92 }
93
94 // RT-safe after prepare. Mutates only prepared voice slots.
97 std::span<VoiceTermination> terminations = {}) noexcept;
98 bool release_voice(std::uint32_t voice_index) noexcept;
99 std::uint32_t release_note(int note,
100 std::uint32_t sample_id = kInvalidSampleId) noexcept;
101 bool finish_voice(std::uint32_t voice_index) noexcept;
102
103private:
104 static bool trigger_valid(const InstrumentVoiceTrigger& trigger) noexcept;
105 static bool voice_allocated(const InstrumentVoice& voice) noexcept;
106 int find_idle_voice() const noexcept;
107 int choose_voice_to_steal(const InstrumentVoiceTrigger& trigger) const noexcept;
108 void record_termination(VoiceAllocationResult& result,
109 std::span<VoiceTermination> terminations,
110 std::uint32_t voice_index,
111 std::uint64_t voice_id,
112 VoiceTerminationReason reason) noexcept;
113 std::uint32_t choke_matching_voices(
115 VoiceAllocationResult& result,
116 std::span<VoiceTermination> terminations) noexcept;
117 void activate_voice(std::uint32_t voice_index,
118 const InstrumentVoiceTrigger& trigger) noexcept;
119 void free_voice(std::uint32_t voice_index) noexcept;
120
121 std::vector<InstrumentVoice> voices_;
122 std::uint32_t max_voices_ = 0;
123 std::uint64_t next_voice_id_ = 1;
124 std::uint64_t trigger_counter_ = 1;
125 std::uint32_t termination_fade_frames_ = kDefaultVoiceTerminationFadeFrames;
127};
128
129} // namespace pulp::audio
std::uint32_t active_voice_count() const noexcept
bool prepare(std::uint32_t max_voices)
void set_termination_fade_frames(std::uint32_t frames) noexcept
Definition instrument_voice_allocator.hpp:87
VoiceStealPolicy steal_policy() const noexcept
Definition instrument_voice_allocator.hpp:86
std::uint32_t termination_fade_frames() const noexcept
Definition instrument_voice_allocator.hpp:90
bool release_voice(std::uint32_t voice_index) noexcept
std::span< const InstrumentVoice > voices() const noexcept
Definition instrument_voice_allocator.hpp:83
VoiceAllocationResult trigger(const InstrumentVoiceTrigger &trigger, std::span< VoiceTermination > terminations={}) noexcept
std::uint32_t release_note(int note, std::uint32_t sample_id=kInvalidSampleId) noexcept
std::uint32_t max_voices() const noexcept
Definition instrument_voice_allocator.hpp:76
void set_steal_policy(VoiceStealPolicy policy) noexcept
Definition instrument_voice_allocator.hpp:85
std::uint32_t allocated_voice_count() const noexcept
bool finish_voice(std::uint32_t voice_index) noexcept
Definition analyzer_provider.hpp:12
VoiceStealPolicy
Definition instrument_voice_allocator.hpp:12
@ Oldest
Definition instrument_voice_allocator.hpp:13
@ PreferSameVoiceGroupOldest
Definition instrument_voice_allocator.hpp:14
constexpr std::uint32_t kDefaultVoiceTerminationFadeFrames
Definition instrument_voice_allocator.hpp:28
VoiceTerminationReason
Definition instrument_voice_allocator.hpp:23
@ Stolen
Definition instrument_voice_allocator.hpp:25
@ Choked
Definition instrument_voice_allocator.hpp:24
VoiceState
Definition instrument_voice_allocator.hpp:17
@ Active
Definition instrument_voice_allocator.hpp:19
@ Free
Definition instrument_voice_allocator.hpp:18
@ Released
Definition instrument_voice_allocator.hpp:20
constexpr std::uint32_t kInvalidSampleId
Definition sample_identity.hpp:8
STL namespace.
Definition instrument_voice_allocator.hpp:47
int note
Definition instrument_voice_allocator.hpp:48
std::uint32_t voice_group
Definition instrument_voice_allocator.hpp:50
std::uint32_t choke_group
Definition instrument_voice_allocator.hpp:53
std::uint32_t sample_id
Definition instrument_voice_allocator.hpp:49
Definition instrument_voice_allocator.hpp:30
std::uint32_t choke_group
Definition instrument_voice_allocator.hpp:37
std::uint32_t sample_id
Definition instrument_voice_allocator.hpp:35
VoiceState state
Definition instrument_voice_allocator.hpp:31
int note
Definition instrument_voice_allocator.hpp:34
std::uint64_t started_at
Definition instrument_voice_allocator.hpp:33
std::uint32_t voice_group
Definition instrument_voice_allocator.hpp:36
std::uint64_t voice_id
Definition instrument_voice_allocator.hpp:32
Definition instrument_voice_allocator.hpp:56
std::uint32_t voice_index
Definition instrument_voice_allocator.hpp:59
std::uint32_t choked_count
Definition instrument_voice_allocator.hpp:63
std::uint32_t stolen_voice_index
Definition instrument_voice_allocator.hpp:61
std::uint32_t termination_overflow_count
Definition instrument_voice_allocator.hpp:65
bool allocated
Definition instrument_voice_allocator.hpp:57
std::uint64_t voice_id
Definition instrument_voice_allocator.hpp:60
std::uint32_t termination_count
Definition instrument_voice_allocator.hpp:64
bool stolen
Definition instrument_voice_allocator.hpp:58
std::uint64_t stolen_voice_id
Definition instrument_voice_allocator.hpp:62
Definition instrument_voice_allocator.hpp:40
VoiceTerminationReason reason
Definition instrument_voice_allocator.hpp:43
std::uint32_t voice_index
Definition instrument_voice_allocator.hpp:41
std::uint64_t voice_id
Definition instrument_voice_allocator.hpp:42
std::uint32_t fade_out_frames
Definition instrument_voice_allocator.hpp:44