68 uint64_t write_frames(std::span<const double> data, uint64_t start_frame = 0, uint32_t channel = 0);
69 uint64_t write_frames(std::vector<std::span<const double>> data, uint64_t start_frame = 0);
84 uint64_t append_frames(std::span<const double> data, uint32_t channel = 0);
97 [[nodiscard]] std::shared_ptr<DynamicSoundStream> snapshot(uint64_t frames)
const;
107 return channel < m_write_heads.size() ? m_write_heads[channel] : 0;
118 return read_sequential(output,
count);
138 void ensure_capacity(uint64_t required_frames);
145 void enable_circular_buffer(uint64_t capacity);
151 void disable_circular_buffer();
163 std::span<const double> get_channel_frames(uint32_t channel, uint64_t start_frame, uint64_t num_frames)
const;
165 void get_channel_frames(std::span<double> output, uint32_t channel, uint64_t start_frame)
const;
179 uint32_t allocate_dynamic_slot();
185 void release_dynamic_slot(uint32_t
index);
191 [[nodiscard]] std::vector<DataVariant>& get_dynamic_data(uint32_t
index);
192 [[nodiscard]]
const std::vector<DataVariant>& get_dynamic_data(uint32_t
index)
const;
196 bool m_is_circular {};
197 uint64_t m_circular_capacity {};
202 void expand_to(uint64_t target_frames);
204 std::vector<DataVariant> create_expanded_data(uint64_t new_frame_count);
207 void set_all_data(
const std::vector<DataVariant>& new_data);
209 uint64_t validate(std::vector<std::span<const double>>& data, uint64_t start_frame = 0);
211 uint64_t validate_single_channel(std::span<const double> data, uint64_t start_frame = 0, uint32_t channel = 0);
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.