| 2354 | // ============================================================================= |
| 2355 | |
| 2356 | int rcli_process_wav(RCLIHandle handle, |
| 2357 | const char* input_wav, |
| 2358 | const char* output_wav, |
| 2359 | RCLIEventCallback callback, |
| 2360 | void* user_data) { |
| 2361 | if (!handle || !input_wav || !output_wav) return -1; |
| 2362 | auto* engine = static_cast<RCLIEngine*>(handle); |
| 2363 | if (!engine->initialized) return -1; |
| 2364 | |
| 2365 | // Set state callback to forward events |
| 2366 | engine->pipeline.set_state_callback([callback, user_data](PipelineState /*old_state*/, PipelineState new_state) { |
| 2367 | if (!callback) return; |
| 2368 | const char* state_str = "unknown"; |
| 2369 | switch (new_state) { |
| 2370 | case PipelineState::IDLE: state_str = "idle"; break; |
| 2371 | case PipelineState::LISTENING: state_str = "listening"; break; |
| 2372 | case PipelineState::PROCESSING: state_str = "processing"; break; |
| 2373 | case PipelineState::SPEAKING: state_str = "speaking"; break; |
| 2374 | case PipelineState::INTERRUPTED: state_str = "interrupted"; break; |
| 2375 | } |
| 2376 | callback("state_change", state_str, user_data); |
| 2377 | }); |
| 2378 | |
| 2379 | LOG_DEBUG("RCLI", "Processing: %s -> %s", input_wav, output_wav); |
| 2380 | |
| 2381 | bool ok = engine->pipeline.run_file_pipeline(input_wav, output_wav); |
| 2382 | |
| 2383 | // Send timings |
| 2384 | if (callback) { |
| 2385 | auto& t = engine->pipeline.last_timings(); |
| 2386 | char buf[512]; |
| 2387 | snprintf(buf, sizeof(buf), |
| 2388 | "{\"stt_ms\":%.1f,\"llm_ttft_ms\":%.1f,\"llm_total_ms\":%.1f," |
| 2389 | "\"tts_first_ms\":%.1f,\"e2e_ms\":%.1f,\"total_ms\":%.1f}", |
| 2390 | t.stt_latency_us / 1000.0, |
| 2391 | t.llm_first_token_us / 1000.0, |
| 2392 | t.llm_total_us / 1000.0, |
| 2393 | t.tts_first_sentence_us / 1000.0, |
| 2394 | t.e2e_latency_us / 1000.0, |
| 2395 | t.total_us / 1000.0); |
| 2396 | callback("timings", buf, user_data); |
| 2397 | } |
| 2398 | |
| 2399 | engine->pipeline.set_state_callback(nullptr); |
| 2400 | return ok ? 0 : -1; |
| 2401 | } |
| 2402 | |
| 2403 | char* rcli_get_timings(RCLIHandle handle) { |
| 2404 | if (!handle) return nullptr; |
nothing calls this directly
no test coverage detected