Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
scripted_ui_host.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <memory>
6#include <utility>
7#include <vector>
8
10
26namespace pulp::timeline_editor {
27
40
41template <class Intent>
42class ScriptedUiHost final : public SequencerUiHostT<Intent> {
43 public:
49
50 ScriptedUiHost() : program_(std::make_unique<ScriptedProgram>()) {}
51
52 // ── Scripting (caller side) ──────────────────────────────────────────────
53
56 void set_program(const ScriptedProgram& program) {
57 *program_ = program;
58 ++sequence_;
59 }
60
64 void swap_program(const ScriptedProgram& program) {
65 program_.reset();
66 program_ = std::make_unique<ScriptedProgram>(program);
67 ++generation_;
68 ++sequence_;
69 }
70
71 std::uint64_t program_generation() const { return generation_; }
72
75 void set_audition_status(AuditionStatus status) { audition_status_ = status; }
76
78 void set_intent_status(IntentStatus status) { intent_status_ = status; }
79
80 // ── What the view emitted (test side) ────────────────────────────────────
81
82 const std::vector<AuditionRecord>& auditions() const { return auditions_; }
83 const std::vector<AuditionHandle>& ended_auditions() const { return ended_; }
84 const std::vector<Intent>& intents() const { return intents_; }
85
87 auditions_.clear();
88 ended_.clear();
89 intents_.clear();
90 }
91
92 // ── SequencerUiHost ──────────────────────────────────────────────────────
93
94 UiPlayhead playhead() const noexcept override {
95 const ScriptedProgram& current = *program_;
96 UiPlayhead reading;
97 reading.program_generation = generation_;
98 reading.sequence = sequence_;
99 reading.continuity_epoch = current.continuity_epoch;
100 reading.position = current.position;
101 reading.loop = current.loop;
102 reading.state = current.state;
103 reading.tempo_bpm = current.tempo_bpm;
104 return reading;
105 }
106
107 AuditionResult begin_audition(const AuditionRequest& request) noexcept override {
108 // The recording vectors allocate, which is why this host belongs on the
109 // UI side of a real implementation's queue and never on an audio thread.
110 AuditionResult result;
111 result.status = audition_status_;
112 if (audition_status_ == AuditionStatus::Started && request.duration.value == 0)
113 result.handle = AuditionHandle{++next_handle_};
114 auditions_.push_back(AuditionRecord{request, result});
115 return result;
116 }
117
118 void end_audition(AuditionHandle handle) noexcept override {
119 ended_.push_back(handle);
120 }
121
122 IntentResult submit_intent(const Intent& intent) noexcept override {
123 intents_.push_back(intent);
124 IntentResult result;
125 result.status = intent_status_;
126 if (intent_status_ == IntentStatus::Accepted)
127 result.sequence = ++next_intent_sequence_;
128 return result;
129 }
130
131 private:
132 std::unique_ptr<ScriptedProgram> program_;
133 std::uint64_t generation_ = 1;
134 std::uint64_t sequence_ = 1;
135 std::uint64_t next_handle_ = 0;
136 std::uint64_t next_intent_sequence_ = 0;
137 AuditionStatus audition_status_ = AuditionStatus::Started;
138 IntentStatus intent_status_ = IntentStatus::Accepted;
139
140 std::vector<AuditionRecord> auditions_;
141 std::vector<AuditionHandle> ended_;
142 std::vector<Intent> intents_;
143};
144
145} // namespace pulp::timeline_editor
void set_program(const ScriptedProgram &program)
Update the current program in place.
Definition scripted_ui_host.hpp:56
void swap_program(const ScriptedProgram &program)
Adopt a different compiled program, as an engine does when a recompile lands.
Definition scripted_ui_host.hpp:64
ScriptedUiHost()
Definition scripted_ui_host.hpp:50
void set_audition_status(AuditionStatus status)
What the host does with the next audition request.
Definition scripted_ui_host.hpp:75
AuditionResult begin_audition(const AuditionRequest &request) noexcept override
Ask to hear something.
Definition scripted_ui_host.hpp:107
void clear_emissions()
Definition scripted_ui_host.hpp:86
void set_intent_status(IntentStatus status)
What the host does with the next intent.
Definition scripted_ui_host.hpp:78
const std::vector< Intent > & intents() const
Definition scripted_ui_host.hpp:84
const std::vector< AuditionRecord > & auditions() const
Definition scripted_ui_host.hpp:82
IntentResult submit_intent(const Intent &intent) noexcept override
Hand over one intent a gesture produced.
Definition scripted_ui_host.hpp:122
void end_audition(AuditionHandle handle) noexcept override
End a sustained audition.
Definition scripted_ui_host.hpp:118
std::uint64_t program_generation() const
Definition scripted_ui_host.hpp:71
UiPlayhead playhead() const noexcept override
The latest playhead reading, by value.
Definition scripted_ui_host.hpp:94
const std::vector< AuditionHandle > & ended_auditions() const
Definition scripted_ui_host.hpp:83
Adds intent submission for one intent vocabulary.
Definition sequencer_ui_host.hpp:213
ScriptedUiHost is a SequencerUiHost whose playhead is written by the caller instead of an engine,...
Definition edit_intent.hpp:14
UiTransportState
Whether the playhead is moving, and why.
Definition sequencer_ui_host.hpp:49
@ Stopped
Definition sequencer_ui_host.hpp:50
AuditionStatus
Definition sequencer_ui_host.hpp:144
@ Started
The host is sounding it. A sustained request also yields a valid handle.
Definition sequencer_ui_host.hpp:146
IntentStatus
Definition sequencer_ui_host.hpp:165
@ Accepted
The host took the intent and will apply it.
Definition sequencer_ui_host.hpp:167
STL namespace.
The loop bounds a transport honours, in document ticks.
Definition loop_region.hpp:20
Definition tick.hpp:61
Names a sustained audition so it can be ended.
Definition sequencer_ui_host.hpp:137
What a view asks to hear, in document terms only.
Definition sequencer_ui_host.hpp:109
Returned by value so a view driven by a host that cannot audition is observable in a test without a m...
Definition sequencer_ui_host.hpp:158
AuditionHandle handle
Definition sequencer_ui_host.hpp:160
AuditionStatus status
Definition sequencer_ui_host.hpp:159
Definition sequencer_ui_host.hpp:175
std::uint64_t sequence
Host-assigned identity of an accepted intent, so a view can correlate what it emitted with what later...
Definition sequencer_ui_host.hpp:180
IntentStatus status
Definition sequencer_ui_host.hpp:176
What the caller scripts. Held by value inside the host's current program.
Definition scripted_ui_host.hpp:29
UiTransportState state
Definition scripted_ui_host.hpp:37
std::uint64_t continuity_epoch
Scripted rather than counted by the host, because only whoever moves the position knows when it stopp...
Definition scripted_ui_host.hpp:35
double tempo_bpm
Definition scripted_ui_host.hpp:38
timebase::TickPosition position
Definition scripted_ui_host.hpp:30
timebase::LoopRegion loop
Definition scripted_ui_host.hpp:36
One audition the host was asked for, with the outcome it gave back.
Definition scripted_ui_host.hpp:45
AuditionRequest request
Definition scripted_ui_host.hpp:46
AuditionResult result
Definition scripted_ui_host.hpp:47
One complete reading of where playback is.
Definition sequencer_ui_host.hpp:70
double tempo_bpm
Definition sequencer_ui_host.hpp:88
std::uint64_t sequence
Monotonic per publish.
Definition sequencer_ui_host.hpp:76
std::uint64_t continuity_epoch
Identity of the continuous interval this reading's position belongs to.
Definition sequencer_ui_host.hpp:83
timebase::LoopRegion loop
Definition sequencer_ui_host.hpp:86
std::uint64_t program_generation
Identity of the compiled program this reading came from.
Definition sequencer_ui_host.hpp:73
UiTransportState state
Definition sequencer_ui_host.hpp:87
timebase::TickPosition position
Document position. This is the value a ruler and a playhead line draw.
Definition sequencer_ui_host.hpp:85