Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
subsection_reader.hpp
Go to the documentation of this file.
1#pragma once
2
3// AudioSubsectionReader — reads a sub-range of frames from audio file data.
4// Wraps AudioFileData and provides a view into a portion of the file.
5
7#include <algorithm>
8#include <cstdint>
9
10namespace pulp::audio {
11
15public:
17
19 AudioSubsectionReader(const AudioFileData& source, uint64_t start_frame, uint64_t length_frames)
20 : source_(&source)
21 , start_(std::min(start_frame, source.num_frames()))
22 , length_(std::min(length_frames, source.num_frames() - start_)) {}
23
25 uint64_t num_frames() const { return length_; }
26
28 uint32_t num_channels() const { return source_ ? source_->num_channels() : 0; }
29
31 uint32_t sample_rate() const { return source_ ? source_->sample_rate : 0; }
32
34 float sample(uint32_t channel, uint64_t frame) const {
35 if (!source_ || channel >= num_channels() || frame >= length_) return 0.0f;
36 return source_sample(channel, start_ + frame);
37 }
38
40 void read_frames(float* dest, uint32_t channel, uint64_t start, uint64_t count) const {
41 if (dest == nullptr) return;
42 if (!source_ || channel >= num_channels()) return;
43 uint64_t actual_start = start_ + std::min(start, length_);
44 uint64_t actual_count = std::min(count, length_ - std::min(start, length_));
45
46 for (uint64_t i = 0; i < actual_count; ++i)
47 dest[i] = source_sample(channel, actual_start + i);
48 }
49
52 AudioFileData result;
53 if (!source_) return result;
54
55 result.sample_rate = source_->sample_rate;
56 result.channels.resize(num_channels());
57 for (uint32_t ch = 0; ch < num_channels(); ++ch) {
58 result.channels[ch].resize(static_cast<size_t>(length_));
59 for (uint64_t i = 0; i < length_; ++i)
60 result.channels[ch][static_cast<size_t>(i)] =
61 source_sample(ch, start_ + i);
62 }
63 return result;
64 }
65
67 double duration_seconds() const {
68 return sample_rate() > 0 ? static_cast<double>(length_) / sample_rate() : 0;
69 }
70
72 bool is_valid() const { return source_ != nullptr && length_ > 0; }
73
74private:
75 const AudioFileData* source_ = nullptr;
76 uint64_t start_ = 0;
77 uint64_t length_ = 0;
78
79 float source_sample(uint32_t channel, uint64_t frame) const {
80 const auto& ch = source_->channels[channel];
81 if (frame >= ch.size()) return 0.0f;
82 return ch[static_cast<size_t>(frame)];
83 }
84};
85
86} // namespace pulp::audio
uint32_t sample_rate() const
Sample rate (inherited from source).
Definition subsection_reader.hpp:31
bool is_valid() const
Whether this reader has a valid source.
Definition subsection_reader.hpp:72
uint32_t num_channels() const
Number of channels.
Definition subsection_reader.hpp:28
float sample(uint32_t channel, uint64_t frame) const
Read a frame from this subsection.
Definition subsection_reader.hpp:34
void read_frames(float *dest, uint32_t channel, uint64_t start, uint64_t count) const
Copy frames from this subsection into a destination buffer.
Definition subsection_reader.hpp:40
AudioFileData extract() const
Extract this subsection as a new AudioFileData (copies data).
Definition subsection_reader.hpp:51
uint64_t num_frames() const
Number of frames in this subsection.
Definition subsection_reader.hpp:25
double duration_seconds() const
Duration in seconds.
Definition subsection_reader.hpp:67
AudioSubsectionReader(const AudioFileData &source, uint64_t start_frame, uint64_t length_frames)
Create a subsection from frame start_frame to start_frame + length_frames.
Definition subsection_reader.hpp:19
Definition analyzer_provider.hpp:12
STL namespace.
Definition audio_file.hpp:24
std::vector< std::vector< float > > channels
Definition audio_file.hpp:25
uint32_t sample_rate
Definition audio_file.hpp:26