| 398 | std::vector<float> window(static_cast<size_t>(chunk_samples), 1.0F); |
| 399 | const int64_t rising = chunk_samples / 2; |
| 400 | const int64_t falling = chunk_samples - rising; |
| 401 | for (int64_t i = 0; i < rising; ++i) { |
| 402 | window[static_cast<size_t>(i)] = static_cast<float>(i + 1); |
| 403 | } |
| 404 | for (int64_t i = 0; i < falling; ++i) { |
| 405 | window[static_cast<size_t>(rising + i)] = static_cast<float>(falling - i); |
| 406 | } |
| 407 | const float max_value = *std::max_element(window.begin(), window.end()); |
| 408 | for (float & value : window) { |
| 409 | value /= max_value; |
| 410 | } |
| 411 | return window; |
| 412 | } |
| 413 | |
| 414 | std::vector<float> make_linear_fade_window(int64_t chunk_samples, int64_t fade_samples) { |
| 415 | require_positive(chunk_samples, "chunk samples"); |
| 416 | if (fade_samples < 0 || fade_samples * 2 > chunk_samples) { |
| 417 | throw std::runtime_error("Audio chunker fade_samples is invalid"); |
| 418 | } |
| 419 | std::vector<float> window(static_cast<size_t>(chunk_samples), 1.0F); |
| 420 | if (fade_samples <= 0) { |
| 421 | return window; |
| 422 | } |
| 423 | for (int64_t i = 0; i < fade_samples; ++i) { |
| 424 | const float alpha = fade_samples == 1 |
| 425 | ? 1.0F |
| 426 | : static_cast<float>(i) / static_cast<float>(fade_samples - 1); |
| 427 | window[static_cast<size_t>(i)] = alpha; |
| 428 | window[static_cast<size_t>(chunk_samples - fade_samples + i)] = 1.0F - alpha; |
| 429 | } |
| 430 | return window; |
| 431 | } |
| 432 | |
| 433 | void copy_interleaved_chunk_to_planar( |
| 434 | std::vector<float> & output_planar, |
| 435 | const std::vector<float> & input_interleaved, |
| 436 | int64_t channels, |
| 437 | int64_t input_frames, |
| 438 | const AudioChunkSpan & span, |
| 439 | const AudioChunkSpec & spec) { |
| 440 | validate_copy_shape(input_interleaved, channels, input_frames, output_planar, spec); |
| 441 | std::fill(output_planar.begin(), output_planar.end(), 0.0F); |
| 442 | const bool reflect = should_reflect_pad(span, spec); |
| 443 | #ifdef _OPENMP |
| 444 | #pragma omp parallel for if(channels >= 2) |
| 445 | #endif |
| 446 | for (int64_t ch = 0; ch < channels; ++ch) { |
| 447 | float * dst = output_planar.data() + static_cast<size_t>(ch * spec.chunk_samples); |
| 448 | for (int64_t i = 0; i < spec.chunk_samples; ++i) { |