MayaFlux 0.2.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 558 of file SoundStreamContainer.cpp.

559{
560 auto interleaved_span = get_data_as_double();
561 if (interleaved_span.empty() || output.empty())
562 return 0;
563
564 uint64_t start_frame = m_read_position.empty() ? 0 : m_read_position[0].load();
565 start_frame += offset;
566 uint64_t elements_to_read = std::min<uint64_t>(count, static_cast<uint64_t>(output.size()));
567
568 if (!m_looping_enabled) {
569 uint64_t linear_start = start_frame * m_num_channels;
570 if (linear_start >= interleaved_span.size()) {
571 std::ranges::fill(output, 0.0);
572 return 0;
573 }
574 auto view = interleaved_span
575 | std::views::drop(linear_start)
576 | std::views::take(elements_to_read);
577
578 auto copied = std::ranges::copy(view, output.begin());
579 std::ranges::fill(output.subspan(copied.out - output.begin()), 0.0);
580 return static_cast<uint64_t>(copied.out - output.begin());
581 }
582
583 if (m_loop_region.start_coordinates.empty()) {
584 std::ranges::fill(output, 0.0);
585 return 0;
586 }
587
588 uint64_t loop_start_frame = m_loop_region.start_coordinates[0];
589 uint64_t loop_end_frame = m_loop_region.end_coordinates[0];
590 uint64_t loop_length_frames = loop_end_frame - loop_start_frame + 1;
591
592 std::ranges::for_each(
593 std::views::iota(0UZ, elements_to_read),
594 [&](uint64_t i) {
595 uint64_t element_pos = start_frame * m_num_channels + i;
596 uint64_t frame_pos = element_pos / m_num_channels;
597 uint64_t channel_offset = element_pos % m_num_channels;
598
599 uint64_t wrapped_frame = ((frame_pos - loop_start_frame) % loop_length_frames) + loop_start_frame;
600 uint64_t wrapped_element = wrapped_frame * m_num_channels + channel_offset;
601
602 output[i] = (wrapped_element < interleaved_span.size()) ? interleaved_span[wrapped_element] : 0.0;
603 });
604
605 if (elements_to_read < output.size()) {
606 std::ranges::fill(output.subspan(elements_to_read), 0.0);
607 }
608 return elements_to_read;
609}
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:72
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Definition Region.hpp:69

References MayaFlux::Kakshya::Region::end_coordinates, get_data_as_double(), m_loop_region, m_looping_enabled, m_num_channels, m_read_position, 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: