21class ClipPlaybackDataProvider final
26 std::vector<dsp::SampleBasedMidiEvent> &&midi_events,
27 structure::tracks::ClipQuantizeOption quantize_opt,
28 units::precise_tick_t end_position)
29 : midi_events_ (std::move (midi_events)), quantize_opt_ (quantize_opt),
30 end_position_ (end_position)
33 std::vector<dsp::SampleBasedMidiEvent> midi_events_;
34 structure::tracks::ClipQuantizeOption quantize_opt_;
39 units::precise_tick_t end_position_;
45 juce::AudioSampleBuffer audio_buffer,
46 structure::tracks::ClipQuantizeOption quantize_opt,
47 units::precise_tick_t end_position)
48 : audio_buffer_ (std::move (audio_buffer)),
49 quantize_opt_ (quantize_opt), end_position_ (end_position)
53 juce::AudioSampleBuffer audio_buffer_;
54 structure::tracks::ClipQuantizeOption quantize_opt_;
59 units::precise_tick_t end_position_;
63 ClipPlaybackDataProvider (
const dsp::TempoMap &tempo_map);
73 structure::tracks::ClipQuantizeOption quantize_option);
82 structure::tracks::ClipQuantizeOption quantize_option);
93 void process_midi_events (
102 std::span<float> left_buffer,
103 std::span<float> right_buffer)
noexcept [[clang::nonblocking]];
108 auto playing ()
const {
return playing_.load (); }
110 auto current_playback_position_in_clip ()
const
112 return internal_clip_buffer_position_.load ();
120 void update_playback_position (
122 units::sample_t clip_loop_end_samples);
127 std::pair<units::sample_t, units::sample_t> handle_quantization_and_start (
129 units::sample_t clip_loop_end_samples,
130 structure::tracks::ClipQuantizeOption quantize_opt);
135 template <
typename ProcessFunc>
136 void process_chunks_with_looping (
137 units::sample_t internal_buffer_start_offset,
138 units::sample_t samples_to_process,
139 units::sample_t clip_loop_end_samples,
140 units::sample_t output_buffer_timestamp_offset,
141 ProcessFunc process_chunk);
148 void clear_active_buffers ();
152 farbot::RealtimeObject<
153 std::optional<MidiCache>,
154 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
155 active_midi_playback_sequence_;
158 farbot::RealtimeObject<
159 std::optional<AudioCache>,
160 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
161 active_audio_playback_buffer_;
163 const dsp::TempoMap &tempo_map_;
173 std::atomic<bool> playing_{
false };
182 bool was_playing_{
false };
190 std::atomic<units::sample_t> internal_clip_buffer_position_;
198 std::atomic<units::sample_t> last_seen_timeline_position_;
206 std::atomic<units::sample_t> clip_launch_timeline_position_;
208 static_assert (
decltype (internal_clip_buffer_position_)::is_always_lock_free);
209 static_assert (
decltype (last_seen_timeline_position_)::is_always_lock_free);
210 static_assert (
decltype (clip_launch_timeline_position_)::is_always_lock_free);