MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ peek_sequential()

uint64_t MayaFlux::Kakshya::SoundStreamContainer::peek_sequential ( std::span< double >  output,
uint64_t  count,
uint64_t  offset = 0 
) const
overridevirtual

Peek at data without advancing the read position.

Parameters
outputBuffer to write data into
countNumber of elements to peek
offsetOffset from current position in primary dimension
Returns
Actual number of elements read

Enables lookahead, preview, or non-destructive inspection of stream data.

Implements MayaFlux::Kakshya::StreamContainer.

Definition at line 542 of file SoundStreamContainer.cpp.

543{
544 auto interleaved_span = get_data_as_double();
545 if (interleaved_span.empty() || output.empty())
546 return 0;
547
548 uint64_t start_frame = m_read_position.empty() ? 0 : m_read_position[0].load();
549 start_frame += offset;
550 uint64_t elements_to_read = std::min<uint64_t>(count, static_cast<uint64_t>(output.size()));
551
552 if (!m_looping_enabled) {
553 uint64_t linear_start = start_frame * m_num_channels;
554 if (linear_start >= interleaved_span.size()) {
555 std::ranges::fill(output, 0.0);
556 return 0;
557 }
558 auto view = interleaved_span
559 | std::views::drop(linear_start)
560 | std::views::take(elements_to_read);
561
562 auto copied = std::ranges::copy(view, output.begin());
563 std::ranges::fill(output.subspan(copied.out - output.begin()), 0.0);
564 return static_cast<uint64_t>(copied.out - output.begin());
565 }
566
567 if (m_loop_region.start_coordinates.empty()) {
568 std::ranges::fill(output, 0.0);
569 return 0;
570 }
571
572 uint64_t loop_start_frame = m_loop_region.start_coordinates[0];
573 uint64_t loop_end_frame = m_loop_region.end_coordinates[0];
574 uint64_t loop_length_frames = loop_end_frame - loop_start_frame + 1;
575
576 std::ranges::for_each(
577 std::views::iota(0UZ, elements_to_read),
578 [&](uint64_t i) {
579 uint64_t element_pos = start_frame * m_num_channels + i;
580 uint64_t frame_pos = element_pos / m_num_channels;
581 uint64_t channel_offset = element_pos % m_num_channels;
582
583 uint64_t wrapped_frame = ((frame_pos - loop_start_frame) % loop_length_frames) + loop_start_frame;
584 uint64_t wrapped_element = wrapped_frame * m_num_channels + channel_offset;
585
586 output[i] = (wrapped_element < interleaved_span.size()) ? interleaved_span[wrapped_element] : 0.0;
587 });
588
589 if (elements_to_read < output.size()) {
590 std::ranges::fill(output.subspan(elements_to_read), 0.0);
591 }
592 return elements_to_read;
593}
uint64_t offset
Definition Composite.cpp:10
size_t count
std::span< const double > get_data_as_double() const
Get the audio data as a specific type.
std::vector< std::atomic< uint64_t > > m_read_position
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
Definition Region.hpp:78
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Definition Region.hpp:75

References count, MayaFlux::Kakshya::Region::end_coordinates, get_data_as_double(), m_loop_region, m_looping_enabled, m_num_channels, m_read_position, offset, and MayaFlux::Kakshya::Region::start_coordinates.

Referenced by read_sequential().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: