| 121 | if (!valid_merge_span(keep_span) || |
| 122 | keep_span.start_sample < source_span.start_sample || |
| 123 | keep_span.end_sample > source_span.end_sample) { |
| 124 | throw std::runtime_error(std::string("Audio chunker ") + label + " merge requires keep span inside source span"); |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | } // namespace |
| 129 | |
| 130 | std::vector<AudioChunkSpan> plan_audio_chunks(int64_t input_samples, const AudioChunkSpec & spec) { |
| 131 | require_positive(input_samples, "input samples"); |
| 132 | require_positive(spec.chunk_samples, "chunk samples"); |
| 133 | require_positive(spec.hop_samples, "hop samples"); |
| 134 | if (spec.hop_samples > spec.chunk_samples) { |
| 135 | throw std::runtime_error("Audio chunker hop_samples must be <= chunk_samples"); |
| 136 | } |
| 137 | |
| 138 | std::vector<AudioChunkSpan> spans; |
| 139 | int64_t start = 0; |
| 140 | int64_t index = 0; |
| 141 | while (start < input_samples) { |
| 142 | const int64_t valid = std::min(spec.chunk_samples, input_samples - start); |