| 288 | execution_context_(&execution_context) {} |
| 289 | |
| 290 | std::vector<float> MioCodecWaveformReconstructor::reconstruct( |
| 291 | const MioCodecWaveHead & head, |
| 292 | const std::vector<float> & window) { |
| 293 | const auto threads = static_cast<size_t>(std::max(1, execution_context_->config().threads)); |
| 294 | if (execution_context_->backend_type() != engine::core::BackendType::Cuda) { |
| 295 | if (host_istft_ == nullptr || host_istft_frames_ != head.frames) { |
| 296 | host_istft_ = std::make_unique<engine::audio::HostLogMagnitudePhaseISTFT>( |
| 297 | engine::audio::HostLogMagnitudePhaseISTFTConfig{ |
| 298 | head.frames, |
| 299 | assets_->config.n_fft, |
| 300 | assets_->config.hop_length, |
| 301 | assets_->config.n_fft + 2, |
| 302 | threads, |
| 303 | }); |
| 304 | host_istft_frames_ = head.frames; |
| 305 | engine::debug::timing_log_scalar("miocodec.istft.workspace_rebuilt", true); |
| 306 | } else { |
| 307 | engine::debug::timing_log_scalar("miocodec.istft.workspace_rebuilt", false); |
| 308 | } |
| 309 | const auto result = host_istft_->compute(head.values, window); |
| 310 | engine::debug::timing_log_scalar("miocodec.istft.spectrum_ms", result.timing.spectrum_ms); |
| 311 | engine::debug::timing_log_scalar("miocodec.istft.framed_clear_ms", result.timing.framed_clear_ms); |
| 312 | engine::debug::timing_log_scalar("miocodec.istft.fft_inverse_ms", result.timing.fft_inverse_ms); |
| 313 | engine::debug::timing_log_scalar("miocodec.istft.fold_clear_ms", result.timing.fold_clear_ms); |
| 314 | engine::debug::timing_log_scalar("miocodec.istft.overlap_add_ms", result.timing.overlap_add_ms); |
| 315 | engine::debug::timing_log_scalar("miocodec.istft.normalize_ms", result.timing.normalize_ms); |
| 316 | engine::debug::timing_log_scalar("miocodec.istft.total_ms", result.timing.total_ms); |
| 317 | return result.audio; |
| 318 | } |
| 319 | if (cuda_istft_ == nullptr || cuda_istft_frames_ != head.frames) { |
| 320 | const auto runtime_build_start = Clock::now(); |
| 321 | cuda_istft_ = std::make_unique<engine::audio::CudaLogMagnitudePhaseISTFT>( |
| 322 | engine::audio::CudaLogMagnitudePhaseISTFTConfig{ |
| 323 | head.frames, |
| 324 | assets_->config.n_fft, |
| 325 | assets_->config.hop_length, |
| 326 | assets_->config.n_fft + 2, |
| 327 | execution_context_->config().device, |
| 328 | }); |
| 329 | cuda_istft_frames_ = head.frames; |
| 330 | engine::debug::timing_log_scalar("miocodec.istft.runtime_rebuilt", true); |
| 331 | engine::debug::timing_log_scalar( |
| 332 | "miocodec.istft.runtime_build_ms", |
| 333 | engine::debug::elapsed_ms(runtime_build_start)); |
| 334 | } else { |
| 335 | engine::debug::timing_log_scalar("miocodec.istft.runtime_rebuilt", false); |
| 336 | engine::debug::timing_log_scalar("miocodec.istft.runtime_build_ms", 0.0); |
| 337 | } |
| 338 | const auto result = cuda_istft_->compute(head.values, window); |
| 339 | engine::debug::timing_log_scalar("miocodec.istft.input_upload_ms", result.timing.input_upload_ms); |
| 340 | engine::debug::timing_log_scalar("miocodec.istft.spectrum_kernel_ms", result.timing.spectrum_kernel_ms); |
| 341 | engine::debug::timing_log_scalar("miocodec.istft.fft_inverse_ms", result.timing.fft_inverse_ms); |
| 342 | engine::debug::timing_log_scalar("miocodec.istft.overlap_add_ms", result.timing.overlap_add_ms); |
| 343 | engine::debug::timing_log_scalar("miocodec.istft.normalize_ms", result.timing.normalize_ms); |
| 344 | engine::debug::timing_log_scalar("miocodec.istft.audio_read_ms", result.timing.audio_read_ms); |
| 345 | engine::debug::timing_log_scalar("miocodec.istft.total_ms", result.timing.total_ms); |
| 346 | return result.audio; |
| 347 | } |
no test coverage detected