20class ClipPlaybackDataProvider final
25 juce::MidiMessageSequence &&midi_seq,
26 structure::tracks::ClipQuantizeOption quantize_opt,
27 units::precise_tick_t end_position)
28 : midi_seq_ (std::move (midi_seq)), quantize_opt_ (quantize_opt),
29 end_position_ (end_position)
32 juce::MidiMessageSequence midi_seq_;
33 structure::tracks::ClipQuantizeOption quantize_opt_;
38 units::precise_tick_t end_position_;
44 juce::AudioSampleBuffer audio_buffer,
45 structure::tracks::ClipQuantizeOption quantize_opt,
46 units::precise_tick_t end_position)
47 : audio_buffer_ (std::move (audio_buffer)),
48 quantize_opt_ (quantize_opt), end_position_ (end_position)
52 juce::AudioSampleBuffer audio_buffer_;
53 structure::tracks::ClipQuantizeOption quantize_opt_;
58 units::precise_tick_t end_position_;
62 ClipPlaybackDataProvider (
const dsp::TempoMap &tempo_map);
72 structure::tracks::ClipQuantizeOption quantize_option);
81 structure::tracks::ClipQuantizeOption quantize_option);
92 void process_midi_events (
101 std::span<float> left_buffer,
102 std::span<float> right_buffer)
noexcept [[clang::nonblocking]];
107 auto playing ()
const {
return playing_.load (); }
109 auto current_playback_position_in_clip ()
const
111 return internal_clip_buffer_position_.load ();
119 void update_playback_position (
121 units::sample_t clip_loop_end_samples);
126 std::pair<units::sample_t, units::sample_t> handle_quantization_and_start (
128 units::sample_t clip_loop_end_samples,
129 structure::tracks::ClipQuantizeOption quantize_opt);
134 template <
typename ProcessFunc>
135 void process_chunks_with_looping (
136 units::sample_t internal_buffer_start_offset,
137 units::sample_t samples_to_process,
138 units::sample_t clip_loop_end_samples,
139 units::sample_t output_buffer_timestamp_offset,
140 ProcessFunc process_chunk);
147 void clear_active_buffers ();
151 farbot::RealtimeObject<
152 std::optional<MidiCache>,
153 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
154 active_midi_playback_sequence_;
157 farbot::RealtimeObject<
158 std::optional<AudioCache>,
159 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
160 active_audio_playback_buffer_;
162 const dsp::TempoMap &tempo_map_;
172 std::atomic<bool> playing_{
false };
181 bool was_playing_{
false };
189 std::atomic<units::sample_t> internal_clip_buffer_position_;
197 units::sample_t last_seen_timeline_position_;
205 units::sample_t clip_launch_timeline_position_;
207 static_assert (
decltype (internal_clip_buffer_position_)::is_always_lock_free);