Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
headless.hpp
Go to the documentation of this file.
1#pragma once
2
7
11
12namespace pulp::format {
13
30public:
32 explicit HeadlessHost(ProcessorFactory factory);
33
39 void prepare(double sample_rate, int max_buffer_size,
40 int input_channels = 2, int output_channels = 2);
41
48 [[nodiscard]] bool try_prepare(
49 double sample_rate, int max_buffer_size,
50 int input_channels = 2, int output_channels = 2,
51 PrepareResourceLimits resource_limits = {});
52
56 [[nodiscard]] bool try_prepare_bus_layout(
57 std::size_t layout_index, double sample_rate, int max_buffer_size,
58 PrepareResourceLimits resource_limits = {});
59
63 return last_prepare_limit_failure_;
64 }
65
70
76 ProcessContext context);
77
84 const audio::BufferView<const float>& sidechain,
85 ProcessContext context = {});
86
90 midi::MidiBuffer& midi_in,
91 midi::MidiBuffer& midi_out);
92
96 const state::ParameterEventQueue& param_events);
97
102 midi::MidiBuffer& midi_in,
103 midi::MidiBuffer& midi_out,
104 ProcessContext context);
105
109 const audio::BufferView<const float>& sidechain,
110 midi::MidiBuffer& midi_in,
111 midi::MidiBuffer& midi_out,
112 ProcessContext context);
113
117 midi::MidiBuffer& midi_in,
118 midi::MidiBuffer& midi_out,
119 const state::ParameterEventQueue& param_events,
120 ProcessContext context);
121
126
132 ProcessContext context);
133
137 midi::MidiBuffer& midi_in,
138 midi::MidiBuffer& midi_out);
139
144 const state::ParameterEventQueue& param_events);
145
150 midi::MidiBuffer& midi_in,
151 midi::MidiBuffer& midi_out,
152 ProcessContext context);
153
158 midi::MidiBuffer& midi_in,
159 midi::MidiBuffer& midi_out,
160 const state::ParameterEventQueue& param_events,
161 ProcessContext context);
162
167 std::optional<audio::AudioFileData> render_offline(
168 const audio::AudioFileData& input,
169 const audio::OfflineRenderOptions& options = {});
170
174 std::optional<audio::AudioFileData> render_offline_with_sidechain(
175 const audio::AudioFileData& input,
176 const audio::AudioFileData& sidechain,
177 const audio::OfflineRenderOptions& options = {});
178
180 void release();
181
183 bool valid() const noexcept { return processor_ != nullptr; }
184
188 Processor* processor() noexcept { return processor_.get(); }
190 const Processor* processor() const noexcept { return processor_.get(); }
193 template <class T>
194 T* processor_as() noexcept { return dynamic_cast<T*>(processor_.get()); }
195
197 state::StateStore& state() { return store_; }
199 const state::StateStore& state() const { return store_; }
200
202 const PluginDescriptor& descriptor() const { return descriptor_; }
203
208 std::vector<uint8_t> save_state() const;
209
212 bool load_state(std::span<const uint8_t> data);
213
214private:
215 std::optional<audio::AudioFileData> render_offline_impl(
216 const audio::AudioFileData& input,
217 const audio::AudioFileData* sidechain,
218 const audio::OfflineRenderOptions& options);
219 // The store is declared before the Processor so it is destroyed after it.
220 // `Processor::state()` dereferences a pointer to this store, and a Processor
221 // may read it from its destructor or from a worker thread that destructor is
222 // about to join. Reversing these two lines hands that thread a freed store.
223 state::StateStore store_;
224 std::unique_ptr<Processor> processor_;
225 PluginDescriptor descriptor_;
226 std::shared_ptr<PanicState> panic_state_;
227 double sample_rate_ = 48000.0;
228 PrepareResourceLimit last_prepare_limit_failure_ = PrepareResourceLimit::None;
229};
230
231} // namespace pulp::format
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out, const state::ParameterEventQueue &param_events, ProcessContext context)
Low-level double-precision process call with MIDI, context, and parameter events.
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out, ProcessContext context)
Process a double-precision block with MIDI and explicit transport / timeline context.
std::optional< audio::AudioFileData > render_offline(const audio::AudioFileData &input, const audio::OfflineRenderOptions &options={})
Render an effect-shaped in-memory audio file through this processor.
bool try_prepare_bus_layout(std::size_t layout_index, double sample_rate, int max_buffer_size, PrepareResourceLimits resource_limits={})
Prepare one of PluginDescriptor::supported_bus_layouts by index.
HeadlessHost(ProcessorFactory factory)
Construct from a factory function that creates a Processor instance.
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out)
Process a block of audio with MIDI input and output.
Processor * processor() noexcept
The wrapped processor instance (null when the factory returned nullptr).
Definition headless.hpp:188
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out, const state::ParameterEventQueue &param_events, ProcessContext context)
Low-level process call with MIDI, context, and parameter events.
state::StateStore & state()
Access the parameter store for reading/writing parameter values.
Definition headless.hpp:197
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input)
Process a block of audio (no MIDI).
const PluginDescriptor & descriptor() const
The plugin's static descriptor (name, vendor, bus layout, etc.).
Definition headless.hpp:202
bool load_state(std::span< const uint8_t > data)
Restore plugin state from a binary blob.
bool valid() const noexcept
True when the factory produced a processor instance.
Definition headless.hpp:183
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input, const state::ParameterEventQueue &param_events)
Process a double-precision block with explicit sample-accurate parameter events.
void prepare(double sample_rate, int max_buffer_size, int input_channels=2, int output_channels=2)
Prepare the processor for audio rendering.
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out)
Process a double-precision block with MIDI input and output.
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input)
Process a double-precision block of audio (no MIDI).
std::optional< audio::AudioFileData > render_offline_with_sidechain(const audio::AudioFileData &input, const audio::AudioFileData &sidechain, const audio::OfflineRenderOptions &options={})
Offline render with a separate sidechain file.
void process_with_sidechain(audio::BufferView< float > &output, const audio::BufferView< const float > &input, const audio::BufferView< const float > &sidechain, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out, ProcessContext context)
T * processor_as() noexcept
Typed access to the wrapped processor; returns nullptr if the dynamic type does not match T.
Definition headless.hpp:194
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, ProcessContext context)
Process a block of audio with explicit transport/timeline context.
bool try_prepare(double sample_rate, int max_buffer_size, int input_channels=2, int output_channels=2, PrepareResourceLimits resource_limits={})
Prepare with explicit resource limits.
PrepareResourceLimit last_prepare_limit_failure() const
Last prepare-limit failure from try_prepare().
Definition headless.hpp:62
std::vector< uint8_t > save_state() const
Serialize the current plugin state to a binary blob.
void process_with_sidechain(audio::BufferView< float > &output, const audio::BufferView< const float > &input, const audio::BufferView< const float > &sidechain, ProcessContext context={})
Process with an independently supplied sidechain bus.
const state::StateStore & state() const
Access the parameter store for reading/writing parameter values.
Definition headless.hpp:199
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, const state::ParameterEventQueue &param_events)
Process a block with explicit sample-accurate parameter events.
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, midi::MidiBuffer &midi_in, midi::MidiBuffer &midi_out, ProcessContext context)
Process a block of audio with MIDI and explicit transport/timeline context.
void release()
Release processing resources. Safe to call multiple times.
void process_f64(audio::BufferView< double > &output, const audio::BufferView< const double > &input, ProcessContext context)
Process a double-precision block with explicit transport/timeline context.
const Processor * processor() const noexcept
The wrapped processor instance (null when the factory returned nullptr).
Definition headless.hpp:190
Definition processor.hpp:174
Collection of timestamped MIDI events within a single audio buffer period.
Definition buffer.hpp:31
Definition parameter_event_queue.hpp:82
Centralized parameter storage with lock-free value access.
Definition store.hpp:164
What the product grants a device: the quota table indexed by capability tier and live thermal state.
Definition aax_editor.hpp:31
std::unique_ptr< Processor >(*)() ProcessorFactory
Factory function type — plugins provide this to create processor instances.
Definition processor.hpp:1416
PrepareResourceLimit
Prepare context — passed once before processing starts.
Definition prepare_resources.hpp:16
@ None
Definition prepare_resources.hpp:17
Definition audio_file.hpp:24
Advanced offline render options.
Definition offline_processor.hpp:86
Plugin metadata — declared once, immutable.
Definition plugin_descriptor.hpp:245
Optional prepare-time resource caps supplied by a host or test harness.
Definition prepare_resources.hpp:35
Process context — passed every audio callback with transport state.
Definition process_context.hpp:89