Load file data into an existing SignalSourceContainer.
544{
545 if (!container) {
547 return false;
548 }
549
550 auto sc = std::dynamic_pointer_cast<Kakshya::SoundFileContainer>(container);
551 if (!sc) {
552 set_error(
"Container is not a SoundFileContainer");
553 return false;
554 }
555
556 std::shared_ptr<AudioStreamContext> audio;
557 {
561 return false;
562 }
564 }
565
566 sc->setup(audio->total_frames, audio->sample_rate, audio->channels);
567
569 sc->get_structure().organization = planar
572
574 if (data.empty()) {
576 return false;
577 }
578
579 sc->set_raw_data(data);
580
583 for (const auto& [name, group] : region_groups)
585
586 sc->create_default_processor();
587 sc->mark_ready_for_processing(true);
588 return true;
589}
static std::unordered_map< std::string, Kakshya::RegionGroup > regions_to_groups(const std::vector< FileRegion > ®ions)
Convert file regions to region groups.
std::vector< Kakshya::DataVariant > read_all() override
Read the entire audio file into memory.
std::shared_ptr< AudioStreamContext > m_audio
Codec + resampler state.
std::shared_mutex m_context_mutex
Guards both context pointers.
void set_error(const std::string &error) const
Set the last error message.
AudioReadOptions m_audio_options
Audio-specific read options.
std::shared_ptr< FFmpegDemuxContext > m_demux
Container / format state.
std::vector< FileRegion > get_regions() const override
Get all regions (markers, loops, etc.) from the file.
@ DEINTERLEAVE
Output planar (per-channel) doubles instead of interleaved.
void add_region_group(std::unordered_map< std::string, RegionGroup > &groups, const RegionGroup &group)
Add a RegionGroup to a group map.
@ PLANAR
Separate DataVariant per logical unit (LLL...RRR for stereo)
@ INTERLEAVED
Single DataVariant with interleaved data (LRLRLR for stereo)