Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
analyzer_provider.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <span>
6#include <string>
7#include <string_view>
8#include <vector>
9
10#include <pulp/audio/buffer.hpp>
11
12namespace pulp::audio {
13
26
33
42
50
56
65
73
83
84[[nodiscard]] const char* analyzer_capability_name(AnalyzerCapability capability) noexcept;
85[[nodiscard]] const char* analyzer_backend_name(AnalyzerBackend backend) noexcept;
86[[nodiscard]] const char* analyzer_availability_name(AnalyzerAvailability availability) noexcept;
87[[nodiscard]] const char* analyzer_license_policy_name(AnalyzerLicensePolicy policy) noexcept;
88[[nodiscard]] const char* analyzer_execution_context_name(AnalyzerExecutionContext context) noexcept;
89[[nodiscard]] const char* analyzer_descriptor_status_name(AnalyzerDescriptorStatus status) noexcept;
90[[nodiscard]] const char* time_pitch_prepare_status_name(TimePitchPrepareStatus status) noexcept;
91[[nodiscard]] const char* time_pitch_process_status_name(TimePitchProcessStatus status) noexcept;
92
94 std::string id;
95 std::string display_name;
96 std::string package_id;
97 std::string version;
98 std::string license_id;
99 std::string url;
103 std::vector<AnalyzerCapability> capabilities;
107 // True for permissive baseline/fallback analyzers that should not be
108 // treated as quality-equivalent to dedicated package-backed providers.
109 bool is_fallback = false;
110};
111
121
137
145
151
153 double source_sample_rate = 0.0;
154 std::uint32_t channels = 0;
155 std::uint32_t max_tempo_candidates = 8;
156 bool estimate_key = true;
157 bool estimate_tempo = true;
158};
159
160enum class MusicalKeyMode : std::uint8_t {
164};
165
167 bool ok = false;
168 double tempo_bpm = 0.0;
169 double tempo_confidence = 0.0;
170 // Pitch-class root, C=0 through B=11. -1 means unavailable.
171 int key_root = -1;
173 double key_confidence = 0.0;
175};
176
191
193 std::uint64_t frame = 0;
194 double confidence = 0.0;
197 // When present, this is the zero-based index into the candidate_frames span
198 // passed to TransientClassifier::classify(), not the filtered result index.
199 std::uint32_t candidate_index = 0;
201};
202
204 double sample_rate = 0.0;
205 std::uint32_t channels = 0;
206 std::uint64_t max_input_frames = 0;
207 std::uint64_t max_output_frames = 0;
208};
209
211 double source_sample_rate = 0.0;
212 double time_ratio = 1.0;
214 std::uint64_t max_input_frames = 0;
215 std::uint64_t max_output_frames = 0;
216};
217
223
231
232// Optional provider interfaces. Implementations may allocate, use package code,
233// or perform longer scans unless their descriptor explicitly says otherwise.
235public:
236 virtual ~KeyTempoAnalyzer() = default;
237 [[nodiscard]] virtual const AnalyzerDescriptor& descriptor() const noexcept = 0;
238 [[nodiscard]] virtual KeyTempoAnalysisResult analyze(
239 BufferView<const float> source,
240 const KeyTempoAnalysisConfig& config) = 0;
241};
242
244public:
245 virtual ~TransientClassifier() = default;
246 [[nodiscard]] virtual const AnalyzerDescriptor& descriptor() const noexcept = 0;
247 [[nodiscard]] virtual std::vector<TransientClassification> classify(
248 BufferView<const float> source,
249 std::span<const std::uint64_t> candidate_frames) = 0;
250};
251
253public:
254 virtual ~TimePitchProcessor() = default;
255 [[nodiscard]] virtual const AnalyzerDescriptor& descriptor() const noexcept = 0;
256 // Control/background-thread preparation for implementations that need
257 // fixed scratch or package-owned state before processing.
258 [[nodiscard]] virtual TimePitchPrepareResult prepare(
259 const TimePitchPrepareConfig& config) = 0;
260 // Control/background-thread teardown. After release(), callers must prepare()
261 // again before process() can succeed.
262 virtual void release() noexcept = 0;
263 // Stateful processors treat repeated process() calls between prepare() and
264 // release() as one stream. Independent offline jobs should prepare a fresh
265 // processor state until explicit stream-boundary/flush controls land.
266 [[nodiscard]] virtual TimePitchProcessResult process(
267 BufferView<const float> input,
268 BufferView<float> output,
269 const TimePitchProcessSpec& spec) = 0;
270};
271
274 AnalyzerCapability capability) noexcept;
276 const AnalyzerDescriptor& descriptor) noexcept;
279 AnalyzerCapability capability,
280 const AnalyzerSelectionPolicy& policy = {}) noexcept;
281
283 std::string_view license_id) noexcept;
285 bool installed,
286 bool platform_supported,
287 bool license_accepted) noexcept;
289 const PackageAnalyzerDescriptorInput& input);
290
293 std::string analysis_id = {});
295 std::size_t marker_count,
296 std::span<const AnalyzerMarkerProvenance> provenance) noexcept;
298 std::span<const AnalyzerMarkerProvenance> provenance,
299 std::uint32_t marker_index) noexcept;
300
301[[nodiscard]] std::vector<AnalyzerDescriptor> built_in_analyzer_descriptors();
302
304public:
306 // The returned pointer is owned by the registry and may be invalidated by
307 // later add() calls. Cache descriptor ids instead of long-lived pointers.
308 [[nodiscard]] const AnalyzerDescriptor* find(std::string_view id) const noexcept;
309 [[nodiscard]] std::vector<AnalyzerDescriptor> descriptors() const;
310 [[nodiscard]] std::vector<AnalyzerDescriptor> descriptors_for(
311 AnalyzerCapability capability,
312 const AnalyzerSelectionPolicy& policy = {}) const;
313 [[nodiscard]] std::size_t size() const noexcept { return descriptors_.size(); }
314 [[nodiscard]] bool empty() const noexcept { return descriptors_.empty(); }
315
316private:
317 std::vector<AnalyzerDescriptor> descriptors_;
318};
319
320} // namespace pulp::audio
Definition analyzer_provider.hpp:303
std::vector< AnalyzerDescriptor > descriptors_for(AnalyzerCapability capability, const AnalyzerSelectionPolicy &policy={}) const
std::vector< AnalyzerDescriptor > descriptors() const
std::size_t size() const noexcept
Definition analyzer_provider.hpp:313
const AnalyzerDescriptor * find(std::string_view id) const noexcept
AnalyzerDescriptorStatus add(AnalyzerDescriptor descriptor)
bool empty() const noexcept
Definition analyzer_provider.hpp:314
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition analyzer_provider.hpp:234
virtual ~KeyTempoAnalyzer()=default
virtual const AnalyzerDescriptor & descriptor() const noexcept=0
virtual KeyTempoAnalysisResult analyze(BufferView< const float > source, const KeyTempoAnalysisConfig &config)=0
Definition analyzer_provider.hpp:252
virtual TimePitchProcessResult process(BufferView< const float > input, BufferView< float > output, const TimePitchProcessSpec &spec)=0
virtual TimePitchPrepareResult prepare(const TimePitchPrepareConfig &config)=0
virtual ~TimePitchProcessor()=default
virtual const AnalyzerDescriptor & descriptor() const noexcept=0
virtual void release() noexcept=0
Definition analyzer_provider.hpp:243
virtual std::vector< TransientClassification > classify(BufferView< const float > source, std::span< const std::uint64_t > candidate_frames)=0
virtual const AnalyzerDescriptor & descriptor() const noexcept=0
virtual ~TransientClassifier()=default
Definition analyzer_provider.hpp:12
MusicalKeyMode
Definition analyzer_provider.hpp:160
@ Major
Definition analyzer_provider.hpp:162
@ Minor
Definition analyzer_provider.hpp:163
@ Unknown
Definition analyzer_provider.hpp:161
const char * analyzer_execution_context_name(AnalyzerExecutionContext context) noexcept
const char * analyzer_availability_name(AnalyzerAvailability availability) noexcept
std::vector< AnalyzerDescriptor > built_in_analyzer_descriptors()
const char * time_pitch_prepare_status_name(TimePitchPrepareStatus status) noexcept
AnalyzerCapability
Definition analyzer_provider.hpp:14
@ PitchDetection
Definition analyzer_provider.hpp:24
@ LoopPointAnalysis
Definition analyzer_provider.hpp:18
@ SliceAnalysis
Definition analyzer_provider.hpp:17
@ BeatDetection
Definition analyzer_provider.hpp:16
@ OnsetDetection
Definition analyzer_provider.hpp:15
@ PitchShift
Definition analyzer_provider.hpp:23
@ TimeStretch
Definition analyzer_provider.hpp:22
@ KeyDetection
Definition analyzer_provider.hpp:19
@ TempoDetection
Definition analyzer_provider.hpp:20
bool validate_analyzer_marker_provenance(std::size_t marker_count, std::span< const AnalyzerMarkerProvenance > provenance) noexcept
bool analyzer_descriptor_has_capability(const AnalyzerDescriptor &descriptor, AnalyzerCapability capability) noexcept
AnalyzerBackend
Definition analyzer_provider.hpp:27
@ Package
Definition analyzer_provider.hpp:29
@ ExternalProcess
Definition analyzer_provider.hpp:30
@ ImportedMetadata
Definition analyzer_provider.hpp:31
@ BuiltIn
Definition analyzer_provider.hpp:28
TimePitchProcessStatus
Definition analyzer_provider.hpp:74
@ channel_mismatch
Definition analyzer_provider.hpp:79
@ frame_budget_exceeded
Definition analyzer_provider.hpp:80
@ processing_failed
Definition analyzer_provider.hpp:81
@ not_prepared
Definition analyzer_provider.hpp:78
const char * analyzer_license_policy_name(AnalyzerLicensePolicy policy) noexcept
bool analyzer_descriptor_selectable(const AnalyzerDescriptor &descriptor, AnalyzerCapability capability, const AnalyzerSelectionPolicy &policy={}) noexcept
AnalyzerDescriptorStatus
Definition analyzer_provider.hpp:57
@ missing_capability
Definition analyzer_provider.hpp:61
@ empty_display_name
Definition analyzer_provider.hpp:60
@ ok
Definition analyzer_provider.hpp:58
@ duplicate_id
Definition analyzer_provider.hpp:63
@ package_id_required
Definition analyzer_provider.hpp:62
@ empty_id
Definition analyzer_provider.hpp:59
const char * analyzer_backend_name(AnalyzerBackend backend) noexcept
const AnalyzerProvenance * find_analyzer_marker_provenance(std::span< const AnalyzerMarkerProvenance > provenance, std::uint32_t marker_index) noexcept
const char * analyzer_capability_name(AnalyzerCapability capability) noexcept
AnalyzerAvailability
Definition analyzer_provider.hpp:34
@ LicenseNotAccepted
Definition analyzer_provider.hpp:37
@ UnsupportedPlatform
Definition analyzer_provider.hpp:38
@ MissingPackage
Definition analyzer_provider.hpp:36
@ Unavailable
Definition analyzer_provider.hpp:40
@ Available
Definition analyzer_provider.hpp:35
@ Disabled
Definition analyzer_provider.hpp:39
const char * analyzer_descriptor_status_name(AnalyzerDescriptorStatus status) noexcept
const char * time_pitch_process_status_name(TimePitchProcessStatus status) noexcept
TimePitchPrepareStatus
Definition analyzer_provider.hpp:66
@ setup_failed
Definition analyzer_provider.hpp:71
@ invalid_config
Definition analyzer_provider.hpp:69
@ unavailable
Definition analyzer_provider.hpp:68
@ allocation_failed
Definition analyzer_provider.hpp:70
AnalyzerDescriptor make_package_analyzer_descriptor(const PackageAnalyzerDescriptorInput &input)
AnalyzerLicensePolicy
Definition analyzer_provider.hpp:43
@ NoticeRequired
Definition analyzer_provider.hpp:45
@ Copyleft
Definition analyzer_provider.hpp:46
@ Unknown
Definition analyzer_provider.hpp:48
@ Commercial
Definition analyzer_provider.hpp:47
@ Permissive
Definition analyzer_provider.hpp:44
AnalyzerLicensePolicy classify_analyzer_license_policy(std::string_view license_id) noexcept
AnalyzerProvenance analyzer_provenance_from_descriptor(const AnalyzerDescriptor &descriptor, std::string analysis_id={})
AnalyzerAvailability infer_package_analyzer_availability(bool installed, bool platform_supported, bool license_accepted) noexcept
AnalyzerDescriptorStatus validate_analyzer_descriptor(const AnalyzerDescriptor &descriptor) noexcept
TransientClass
Definition analyzer_provider.hpp:177
@ Snare
Definition analyzer_provider.hpp:180
@ Vocal
Definition analyzer_provider.hpp:186
@ Kick
Definition analyzer_provider.hpp:179
@ Unknown
Definition analyzer_provider.hpp:178
@ Cymbal
Definition analyzer_provider.hpp:183
@ Noise
Definition analyzer_provider.hpp:189
@ Hat
Definition analyzer_provider.hpp:182
@ Clap
Definition analyzer_provider.hpp:181
@ Bass
Definition analyzer_provider.hpp:185
@ Percussion
Definition analyzer_provider.hpp:187
@ Tom
Definition analyzer_provider.hpp:184
@ Tonal
Definition analyzer_provider.hpp:188
AnalyzerExecutionContext
Definition analyzer_provider.hpp:51
@ BackgroundThread
Definition analyzer_provider.hpp:53
@ RealtimeSafe
Definition analyzer_provider.hpp:54
@ OfflineOnly
Definition analyzer_provider.hpp:52
STL namespace.
Definition analyzer_provider.hpp:93
AnalyzerBackend backend
Definition analyzer_provider.hpp:100
AnalyzerLicensePolicy license_policy
Definition analyzer_provider.hpp:102
std::string package_id
Definition analyzer_provider.hpp:96
std::string license_id
Definition analyzer_provider.hpp:98
std::string url
Definition analyzer_provider.hpp:99
std::vector< AnalyzerCapability > capabilities
Definition analyzer_provider.hpp:103
AnalyzerAvailability availability
Definition analyzer_provider.hpp:101
std::string version
Definition analyzer_provider.hpp:97
AnalyzerExecutionContext execution_context
Definition analyzer_provider.hpp:104
bool is_fallback
Definition analyzer_provider.hpp:109
std::string id
Definition analyzer_provider.hpp:94
bool supports_offline_buffers
Definition analyzer_provider.hpp:106
bool supports_streaming_input
Definition analyzer_provider.hpp:105
std::string display_name
Definition analyzer_provider.hpp:95
Definition analyzer_provider.hpp:146
std::uint32_t marker_index
Definition analyzer_provider.hpp:147
AnalyzerProvenance provenance
Definition analyzer_provider.hpp:149
AnalyzerCapability capability
Definition analyzer_provider.hpp:148
Definition analyzer_provider.hpp:138
AnalyzerBackend backend
Definition analyzer_provider.hpp:143
std::string package_id
Definition analyzer_provider.hpp:140
std::string provider_id
Definition analyzer_provider.hpp:139
std::string version
Definition analyzer_provider.hpp:141
std::string analysis_id
Definition analyzer_provider.hpp:142
Definition analyzer_provider.hpp:112
bool include_commercial
Definition analyzer_provider.hpp:115
bool include_copyleft
Definition analyzer_provider.hpp:114
bool include_unknown_license
Definition analyzer_provider.hpp:116
bool include_unavailable
Definition analyzer_provider.hpp:113
bool allow_deferred_execution
Definition analyzer_provider.hpp:119
bool require_offline_buffers
Definition analyzer_provider.hpp:118
bool require_real_time_safe
Definition analyzer_provider.hpp:117
Definition analyzer_provider.hpp:152
std::uint32_t channels
Definition analyzer_provider.hpp:154
bool estimate_tempo
Definition analyzer_provider.hpp:157
double source_sample_rate
Definition analyzer_provider.hpp:153
std::uint32_t max_tempo_candidates
Definition analyzer_provider.hpp:155
bool estimate_key
Definition analyzer_provider.hpp:156
Definition analyzer_provider.hpp:166
double tempo_confidence
Definition analyzer_provider.hpp:169
MusicalKeyMode key_mode
Definition analyzer_provider.hpp:172
int key_root
Definition analyzer_provider.hpp:171
AnalyzerProvenance provenance
Definition analyzer_provider.hpp:174
double key_confidence
Definition analyzer_provider.hpp:173
double tempo_bpm
Definition analyzer_provider.hpp:168
bool ok
Definition analyzer_provider.hpp:167
Definition analyzer_provider.hpp:122
bool supports_offline_buffers
Definition analyzer_provider.hpp:135
bool installed
Definition analyzer_provider.hpp:130
bool platform_supported
Definition analyzer_provider.hpp:131
std::vector< AnalyzerCapability > capabilities
Definition analyzer_provider.hpp:129
bool supports_streaming_input
Definition analyzer_provider.hpp:134
std::string version
Definition analyzer_provider.hpp:126
bool license_accepted
Definition analyzer_provider.hpp:132
std::string url
Definition analyzer_provider.hpp:128
AnalyzerExecutionContext execution_context
Definition analyzer_provider.hpp:133
std::string license_id
Definition analyzer_provider.hpp:127
std::string package_id
Definition analyzer_provider.hpp:124
std::string display_name
Definition analyzer_provider.hpp:125
std::string provider_id
Definition analyzer_provider.hpp:123
Definition analyzer_provider.hpp:203
std::uint32_t channels
Definition analyzer_provider.hpp:205
std::uint64_t max_output_frames
Definition analyzer_provider.hpp:207
std::uint64_t max_input_frames
Definition analyzer_provider.hpp:206
double sample_rate
Definition analyzer_provider.hpp:204
Definition analyzer_provider.hpp:218
bool ok
Definition analyzer_provider.hpp:219
TimePitchPrepareStatus status
Definition analyzer_provider.hpp:220
AnalyzerProvenance provenance
Definition analyzer_provider.hpp:221
Definition analyzer_provider.hpp:224
AnalyzerProvenance provenance
Definition analyzer_provider.hpp:229
bool ok
Definition analyzer_provider.hpp:225
std::uint64_t output_frames_produced
Definition analyzer_provider.hpp:228
std::uint64_t input_frames_consumed
Definition analyzer_provider.hpp:227
TimePitchProcessStatus status
Definition analyzer_provider.hpp:226
Definition analyzer_provider.hpp:210
double time_ratio
Definition analyzer_provider.hpp:212
double source_sample_rate
Definition analyzer_provider.hpp:211
std::uint64_t max_output_frames
Definition analyzer_provider.hpp:215
double pitch_shift_semitones
Definition analyzer_provider.hpp:213
std::uint64_t max_input_frames
Definition analyzer_provider.hpp:214
Definition analyzer_provider.hpp:192
double confidence
Definition analyzer_provider.hpp:194
TransientClass transient_class
Definition analyzer_provider.hpp:195
bool has_candidate_index
Definition analyzer_provider.hpp:200
std::uint32_t candidate_index
Definition analyzer_provider.hpp:199
std::uint64_t frame
Definition analyzer_provider.hpp:193
AnalyzerProvenance provenance
Definition analyzer_provider.hpp:196