| 27 | } |
| 28 | |
| 29 | AceStepPlan make_direct_dit_plan(const AceStepRequest &request, const AceStepTaskRoute &route) { |
| 30 | AceStepPlan plan; |
| 31 | plan.caption = request.prompt; |
| 32 | if (request.bpm.has_value() && *request.bpm > 0) { |
| 33 | plan.metadata.bpm = request.bpm; |
| 34 | } |
| 35 | if (request.keyscale.has_value() && ace_step_metadata_text_is_provided(*request.keyscale)) { |
| 36 | plan.metadata.keyscale = request.keyscale; |
| 37 | } |
| 38 | if (request.timesignature.has_value() && ace_step_metadata_text_is_provided(*request.timesignature)) { |
| 39 | plan.metadata.timesignature = request.timesignature; |
| 40 | } |
| 41 | const bool locks_duration_to_source = |
| 42 | (route.locks_duration_to_source || ace_step_request_uses_flow_edit_morph(request)) && |
| 43 | request.source_audio.has_value() && |
| 44 | request.audio_code_ids.empty(); |
| 45 | if (locks_duration_to_source) { |
| 46 | const runtime::AudioBuffer &audio = *request.source_audio; |
| 47 | plan.metadata.duration = |
| 48 | static_cast<int64_t>(static_cast<float>(audio.samples.size() / static_cast<size_t>(audio.channels)) / |
| 49 | static_cast<float>(audio.sample_rate)); |
| 50 | } else if (request.generation.duration_seconds > 0.0F) { |
| 51 | plan.metadata.duration = static_cast<int64_t>(request.generation.duration_seconds); |
| 52 | } |
| 53 | plan.metadata.language = request.vocal_language; |
| 54 | return plan; |
| 55 | } |
| 56 | |
| 57 | void apply_request_audio_codes(AceStepPlan &plan, const AceStepRequest &request) { |
| 58 | if (request.audio_code_ids.empty() || ace_step_request_uses_flow_edit_morph(request)) { |
no test coverage detected