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:
@@ -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,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user