Peek at data without advancing the read position.
Enables lookahead, preview, or non-destructive inspection of stream data.
543{
545 if (interleaved_span.empty() || output.empty())
546 return 0;
547
550 uint64_t elements_to_read = std::min<uint64_t>(
count,
static_cast<uint64_t
>(output.size()));
551
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
568 std::ranges::fill(output, 0.0);
569 return 0;
570 }
571
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) {
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}
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)
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)