Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
recording.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <cstdint>
8#include <memory>
9#include <optional>
10#include <span>
11#include <string>
12#include <type_traits>
13#include <utility>
14#include <vector>
15
16namespace pulp::timeline {
17
21
22// A Take is one recorded region that references a sealed media asset. It lives
23// in a TakeLane on a Track and is anchored to absolute (sample) time: raw
24// captures are sample-accurate against the transport, not musical. The take's
25// timeline length is its media frame_count. A Take owns a stable ItemId because
26// comps select take segments by identity. The asset reference is
27// external (Project::create validates it exists); the take never owns the asset.
29class Take {
30 public:
37
39 ItemId id() const noexcept {
40 return id_;
41 }
42
43 const MediaRef& media() const noexcept {
44 return media_;
45 }
46
48 return placement_start_;
49 }
50
52 return sample_rate_;
53 }
54
55 private:
58 : id_(id), media_(media), placement_start_(placement_start), sample_rate_(sample_rate) {}
59
60 ItemId id_;
61 MediaRef media_;
62 timebase::SamplePosition placement_start_;
63 timebase::RationalRate sample_rate_;
64};
65
66static_assert(std::is_nothrow_copy_constructible_v<Take>);
67static_assert(std::is_nothrow_move_constructible_v<Take>);
68
76 constexpr bool operator==(const TakeCompSegment& other) const noexcept {
77 return take_id == other.take_id && range.start == other.range.start &&
78 range.sample_count == other.range.sample_count &&
79 range.sample_rate == other.range.sample_rate;
80 }
81};
82
90 constexpr bool operator==(const TrackFreeze& other) const noexcept {
91 return media.asset_id == other.media.asset_id &&
92 media.source_start == other.media.source_start &&
93 media.frame_count == other.media.frame_count &&
94 placement_start == other.placement_start && sample_rate == other.sample_rate &&
95 render_plan_hash == other.render_plan_hash;
96 }
97};
98
103class TakeLane {
104 public:
107 std::vector<Take> takes,
108 std::vector<TakeCompSegment> comp = {});
117 with_comp_segments(std::vector<TakeCompSegment> comp) const;
118
120 ItemId id() const noexcept;
122 const std::string& name() const noexcept;
124 std::span<const Take> takes() const noexcept;
126 std::span<const TakeCompSegment> comp_segments() const noexcept;
128 const Take* find_take(ItemId id) const noexcept;
129
130 private:
131 struct Data;
132 explicit TakeLane(std::shared_ptr<const Data> data) : data_(std::move(data)) {}
133 std::shared_ptr<const Data> data_;
134};
135
140 float gain_linear = 1.0f;
141 float pan = 0.0f;
142 constexpr bool operator==(const TrackMixer&) const = default;
143};
144
146inline constexpr float kMaximumTrackGainLinear = 64.0f;
147
149
150} // namespace pulp::timeline
Result<T, E> — either holds a T or an E, never both.
Definition result.hpp:76
Durable SHA-256 identity for sealed media bytes.
Definition assets.hpp:24
static runtime::Result< TakeLane, ModelError > create(ItemId id, std::string name, std::vector< Take > takes, std::vector< TakeCompSegment > comp={})
Validates and creates a lane with its takes and optional comp.
runtime::Result< TakeLane, ModelError > insert_take(Take take) const
Returns a snapshot with take inserted, or a duplicate/invalid error.
std::span< const TakeCompSegment > comp_segments() const noexcept
Returns comp segments ordered by timeline start then take identity.
const std::string & name() const noexcept
Returns the authored lane name.
const Take * find_take(ItemId id) const noexcept
Finds a take by identity, or returns nullptr when absent.
ItemId id() const noexcept
Returns the lane's stable document identity.
runtime::Result< TakeLane, ModelError > erase_take(ItemId id) const
Returns a snapshot without id.
runtime::Result< TakeLane, ModelError > with_comp_segments(std::vector< TakeCompSegment > comp) const
Returns a snapshot with a validated, canonical replacement comp.
std::span< const Take > takes() const noexcept
Returns takes in canonical identity order.
Immutable sample-anchored recording take referencing a project media asset.
Definition recording.hpp:29
timebase::RationalRate sample_rate() const noexcept
Returns the rational rate governing placement and take duration.
Definition recording.hpp:51
const MediaRef & media() const noexcept
Returns the referenced asset range.
Definition recording.hpp:43
ItemId id() const noexcept
Returns the take's stable document identity.
Definition recording.hpp:39
static runtime::Result< Take, ModelError > create(ItemId id, MediaRef media, timebase::SamplePosition placement_start, timebase::RationalRate sample_rate)
Creates a sample-anchored take referencing a sealed media range.
timebase::SamplePosition placement_start() const noexcept
Returns the absolute timeline start in samples at sample_rate().
Definition recording.hpp:47
constexpr float kMaximumTrackGainLinear
Largest admitted authored linear track gain.
Definition recording.hpp:146
Definition program_compiler.hpp:18
STL namespace.
Result<T, E> — success / failure union for fallible operations.
Definition rational_time.hpp:14
Definition rational_time.hpp:9
Absolute clip placement in samples at an explicit rational rate.
Definition clip.hpp:188
Nonzero monotonic identity for a Timeline-owned object.
Definition item_id.hpp:19
Borrowed range of frames from a project-owned MediaAsset.
Definition clip.hpp:153
Exact absolute-time selection from one take for a comp.
Definition recording.hpp:72
ItemId take_id
Definition recording.hpp:73
constexpr bool operator==(const TakeCompSegment &other) const noexcept
Compares the referenced take and exact absolute-time range.
Definition recording.hpp:76
AbsoluteTimeRange range
Definition recording.hpp:74
Sealed offline-rendered track artifact and its source-plan identity.
Definition recording.hpp:84
ContentHash render_plan_hash
Definition recording.hpp:88
timebase::RationalRate sample_rate
Definition recording.hpp:87
constexpr bool operator==(const TrackFreeze &other) const noexcept
Compares the rendered media, placement, rate, and source-plan hash.
Definition recording.hpp:90
MediaRef media
Definition recording.hpp:85
timebase::SamplePosition placement_start
Definition recording.hpp:86
Track-owned linear gain and stereo balance.
Definition recording.hpp:139
constexpr bool operator==(const TrackMixer &) const =default
float pan
Definition recording.hpp:141
float gain_linear
Definition recording.hpp:140