19class ClipPlaybackDataProvider final
24 juce::MidiMessageSequence &&midi_seq,
25 structure::tracks::ClipQuantizeOption quantize_opt,
26 units::precise_tick_t end_position)
27 : midi_seq_ (std::move (midi_seq)), quantize_opt_ (quantize_opt),
28 end_position_ (end_position)
31 juce::MidiMessageSequence midi_seq_;
32 structure::tracks::ClipQuantizeOption quantize_opt_;
37 units::precise_tick_t end_position_;
43 juce::AudioSampleBuffer audio_buffer,
44 structure::tracks::ClipQuantizeOption quantize_opt,
45 units::precise_tick_t end_position)
46 : audio_buffer_ (std::move (audio_buffer)),
47 quantize_opt_ (quantize_opt), end_position_ (end_position)
51 juce::AudioSampleBuffer audio_buffer_;
52 structure::tracks::ClipQuantizeOption quantize_opt_;
57 units::precise_tick_t end_position_;
61 ClipPlaybackDataProvider (
const dsp::TempoMap &tempo_map);
71 structure::tracks::ClipQuantizeOption quantize_option);
80 structure::tracks::ClipQuantizeOption quantize_option);
91 void process_midi_events (
100 std::span<float> left_buffer,
101 std::span<float> right_buffer)
noexcept [[clang::nonblocking]];
106 auto playing ()
const {
return playing_.load (); }
108 auto current_playback_position_in_clip ()
const
110 return internal_clip_buffer_position_.load ();
118 void update_playback_position (
120 units::sample_t clip_loop_end_samples);
125 std::pair<units::sample_t, units::sample_t> handle_quantization_and_start (
127 units::sample_t clip_loop_end_samples,
128 structure::tracks::ClipQuantizeOption quantize_opt);
133 template <
typename ProcessFunc>
134 void process_chunks_with_looping (
135 units::sample_t internal_buffer_start_offset,
136 units::sample_t samples_to_process,
137 units::sample_t clip_loop_end_samples,
138 units::sample_t output_buffer_timestamp_offset,
139 ProcessFunc process_chunk);
146 void clear_active_buffers ();
150 farbot::RealtimeObject<
151 std::optional<MidiCache>,
152 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
153 active_midi_playback_sequence_;
156 farbot::RealtimeObject<
157 std::optional<AudioCache>,
158 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
159 active_audio_playback_buffer_;
161 const dsp::TempoMap &tempo_map_;
171 std::atomic<bool> playing_{
false };
180 bool was_playing_{
false };
188 std::atomic<units::sample_t> internal_clip_buffer_position_;
196 units::sample_t last_seen_timeline_position_;
204 units::sample_t clip_launch_timeline_position_;
206 static_assert (
decltype (internal_clip_buffer_position_)::is_always_lock_free);