37 uint32_t num_channels = 2,
38 uint64_t initial_capacity = 0,
39 bool circular_mode =
false);
43 std::vector<DataDimension> get_dimensions()
const override;
44 uint64_t get_total_elements()
const override;
48 uint64_t get_frame_size()
const override;
49 uint64_t get_num_frames()
const override;
51 std::vector<DataVariant> get_region_data(
const Region& region)
const override;
52 void set_region_data(
const Region& region,
const std::vector<DataVariant>& data)
override;
54 std::vector<DataVariant> get_region_group_data(
const RegionGroup& group)
const override;
55 std::vector<DataVariant> get_segments_data(
const std::vector<RegionSegment>& segment)
const override;
57 std::span<const double> get_frame(uint64_t frame_index)
const override;
58 void get_frames(std::span<double> output, uint64_t start_frame, uint64_t num_frames)
const override;
60 double get_value_at(
const std::vector<uint64_t>& coordinates)
const override;
61 void set_value_at(
const std::vector<uint64_t>& coordinates,
double value)
override;
63 uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coordinates)
const override;
64 std::vector<uint64_t> linear_index_to_coordinates(uint64_t linear_index)
const override;
66 void clear()
override;
67 void lock()
override { m_data_mutex.lock(); }
68 void unlock()
override { m_data_mutex.unlock(); }
69 bool try_lock()
override {
return m_data_mutex.try_lock(); }
71 const void* get_raw_data()
const override;
72 bool has_data()
const override;
81 std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
84 bool is_region_loaded(
const Region& region)
const override;
85 void load_region(
const Region& region)
override;
86 void unload_region(
const Region& region)
override;
88 void set_read_position(
const std::vector<uint64_t>& position)
override;
89 void update_read_position_for_channel(
size_t channel, uint64_t frame)
override;
90 const std::vector<uint64_t>& get_read_position()
const override;
91 void advance_read_position(
const std::vector<uint64_t>& frames)
override;
92 bool is_at_end()
const override;
93 void reset_read_position()
override;
99 void set_looping(
bool enable)
override;
100 bool is_looping()
const override {
return m_looping_enabled; }
101 void set_loop_region(
const Region& region)
override;
102 Region get_loop_region()
const override;
104 bool is_ready()
const override;
105 std::vector<uint64_t> get_remaining_frames()
const override;
106 uint64_t read_sequential(std::span<double> output, uint64_t count)
override;
107 uint64_t peek_sequential(std::span<double> output, uint64_t count, uint64_t offset = 0)
const override;
113 std::function<
void(std::shared_ptr<SignalSourceContainer>,
ProcessingState)> callback)
override
115 std::lock_guard<std::mutex> lock(m_state_mutex);
116 m_state_callback = callback;
121 std::lock_guard<std::mutex> lock(m_state_mutex);
122 m_state_callback =
nullptr;
125 bool is_ready_for_processing()
const override;
126 void mark_ready_for_processing(
bool ready)
override;
128 void create_default_processor()
override;
129 void process_default()
override;
131 void set_default_processor(std::shared_ptr<DataProcessor> processor)
override;
132 std::shared_ptr<DataProcessor> get_default_processor()
const override;
137 uint32_t register_dimension_reader(uint32_t dimension_index)
override;
138 void unregister_dimension_reader(uint32_t dimension_index)
override;
139 bool has_active_readers()
const override;
140 void mark_dimension_consumed(uint32_t dimension_index, uint32_t reader_id)
override;
141 bool all_dimensions_consumed()
const override;
143 virtual void clear_all_consumption();
147 return m_processed_data;
152 return m_processed_data;
171 return static_cast<uint32_t
>(m_structure.get_channel_count());
180 return m_processing_token_channel.compare_exchange_strong(expected, channel);
185 return m_processing_token_channel.load() == channel;
192 std::span<const double> get_data_as_double()
const;
194 inline const std::vector<DataVariant>&
get_data()
override {
return m_data; }
201 DataAccess channel_data(
size_t channel)
override;
206 std::vector<DataAccess> all_channel_data()
override;
209 void setup_dimensions();
214 const std::vector<std::span<double>>& get_span_cache()
const;
217 void invalidate_span_cache();
222 std::atomic<int> m_processing_token_channel { -1 };
224 uint32_t m_sample_rate = 48000;
225 uint32_t m_num_channels {};
226 uint64_t m_num_frames {};
229 bool m_looping_enabled =
false;
232 bool m_circular_mode {};
233 uint64_t m_circular_write_position {};
235 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
255 mutable std::atomic<bool> m_double_extraction_dirty {
true };
262 mutable std::atomic<bool> m_span_cache_dirty {
true };