fix(android): run set_audio_mode_communication on Tauri main thread

spawn_blocking uses arbitrary thread-pool threads that don't have the
Android JNI context initialized, causing ndk_context::android_context()
to panic. Switch to run_on_main_thread (where the context is always
valid) via a oneshot channel, with a 2s timeout. Panic is caught and
forwarded as an Err so the debug log captures it rather than crashing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-05-25 08:18:18 +04:00
parent 77b036439b
commit bc1668ed96
2 changed files with 32 additions and 25 deletions

View File

@@ -663,15 +663,13 @@ impl CallEngine {
"connect:audio_mode_start",
serde_json::json!({ "t_ms": call_t0.elapsed().as_millis() }),
);
let audio_mode_task =
tokio::task::spawn_blocking(crate::android_audio::set_audio_mode_communication);
match tokio::time::timeout(std::time::Duration::from_secs(2), audio_mode_task).await {
Ok(Ok(Ok(()))) => crate::emit_call_debug(
match crate::android_audio::set_audio_mode_communication_on_main(app.clone()).await {
Ok(()) => crate::emit_call_debug(
&app,
"connect:audio_mode_done",
serde_json::json!({ "t_ms": call_t0.elapsed().as_millis() }),
),
Ok(Ok(Err(e))) => {
Err(e) => {
tracing::warn!("set_audio_mode_communication failed: {e}");
crate::emit_call_debug(
&app,
@@ -682,26 +680,6 @@ impl CallEngine {
}),
);
}
Ok(Err(e)) => {
crate::emit_call_debug(
&app,
"connect:audio_mode_panic",
serde_json::json!({
"t_ms": call_t0.elapsed().as_millis(),
"error": e.to_string(),
}),
);
}
Err(_) => {
crate::emit_call_debug(
&app,
"connect:audio_mode_timeout",
serde_json::json!({
"t_ms": call_t0.elapsed().as_millis(),
"timeout_ms": 2000,
}),
);
}
}
}