Peek at data without advancing the read position.
Enables lookahead, preview, or non-destructive inspection of stream data.
506{
508 if (interleaved_span.empty() ||
output.empty())
509 return 0;
510
513 uint64_t elements_to_read = std::min<uint64_t>(
count,
static_cast<uint64_t
>(
output.size()));
514
517 if (linear_start >= interleaved_span.size()) {
518 std::ranges::fill(
output, 0.0);
519 return 0;
520 }
521 auto view = interleaved_span
522 | std::views::drop(linear_start)
523 | std::views::take(elements_to_read);
524
525 auto copied = std::ranges::copy(view,
output.begin());
526 std::ranges::fill(
output.subspan(copied.out -
output.begin()), 0.0);
527 return static_cast<uint64_t
>(copied.out -
output.begin());
528 }
529
531 std::ranges::fill(
output, 0.0);
532 return 0;
533 }
534
537 uint64_t loop_length_frames = loop_end_frame - loop_start_frame + 1;
538
539 std::ranges::for_each(
540 std::views::iota(0UZ, elements_to_read),
541 [&](uint64_t i) {
545
546 uint64_t wrapped_frame = ((frame_pos - loop_start_frame) % loop_length_frames) + loop_start_frame;
547 uint64_t wrapped_element = wrapped_frame *
m_num_channels + channel_offset;
548
549 output[i] = (wrapped_element < interleaved_span.size()) ? interleaved_span[wrapped_element] : 0.0;
550 });
551
552 if (elements_to_read <
output.size()) {
553 std::ranges::fill(
output.subspan(elements_to_read), 0.0);
554 }
555 return elements_to_read;
556}
std::shared_ptr< Core::VKImage > output
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)