feat: stabilize voice activity and audio routing

This commit is contained in:
Edison Jwa
2026-05-25 01:19:09 +09:00
parent eb9014cd81
commit 5515ff6643
34 changed files with 3054 additions and 1751 deletions
+76 -68
View File
@@ -38,7 +38,7 @@ flutter_rust_bridge::frb_generated_boilerplate!(
default_rust_auto_opaque = RustAutoOpaqueMoi,
);
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.12.0";
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1433826599;
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -560177922;
// Section: executor
@@ -743,7 +743,7 @@ fn wire__crate__api__list_audio_devices_impl(
rust_vec_len_: i32,
data_len_: i32,
) {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec, _, _>(
FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::<flutter_rust_bridge::for_generated::SseCodec, _, _, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "list_audio_devices",
port: Some(port_),
@@ -760,11 +760,14 @@ fn wire__crate__api__list_audio_devices_impl(
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
deserializer.end();
move |context| {
transform_result_sse::<_, ()>((move || {
let output_ok = Result::<_, ()>::Ok(crate::api::list_audio_devices())?;
Ok(output_ok)
})())
move |context| async move {
transform_result_sse::<_, crate::BridgeError>(
(move || async move {
let output_ok = crate::api::list_audio_devices().await?;
Ok(output_ok)
})()
.await,
)
}
},
)
@@ -1141,12 +1144,12 @@ fn wire__crate__api__set_input_device_impl(
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
let api_name = <Option<String>>::sse_decode(&mut deserializer);
let api_id = <Option<String>>::sse_decode(&mut deserializer);
deserializer.end();
move |context| async move {
transform_result_sse::<_, crate::BridgeError>(
(move || async move {
let output_ok = crate::api::set_input_device(api_name).await?;
let output_ok = crate::api::set_input_device(api_id).await?;
Ok(output_ok)
})()
.await,
@@ -1282,12 +1285,12 @@ fn wire__crate__api__set_output_device_impl(
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
let api_name = <Option<String>>::sse_decode(&mut deserializer);
let api_id = <Option<String>>::sse_decode(&mut deserializer);
deserializer.end();
move |context| async move {
transform_result_sse::<_, crate::BridgeError>(
(move || async move {
let output_ok = crate::api::set_output_device(api_name).await?;
let output_ok = crate::api::set_output_device(api_id).await?;
Ok(output_ok)
})()
.await,
@@ -1478,42 +1481,6 @@ fn wire__crate__api__set_release_tail_ms_impl(
},
)
}
fn wire__crate__api__set_ten_vad_model_path_impl(
port_: flutter_rust_bridge::for_generated::MessagePort,
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len_: i32,
data_len_: i32,
) {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::<flutter_rust_bridge::for_generated::SseCodec, _, _, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "set_ten_vad_model_path",
port: Some(port_),
mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
},
move || {
let message = unsafe {
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
ptr_,
rust_vec_len_,
data_len_,
)
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
let api_path = <String>::sse_decode(&mut deserializer);
deserializer.end();
move |context| async move {
transform_result_sse::<_, crate::BridgeError>(
(move || async move {
let output_ok = crate::api::set_ten_vad_model_path(api_path).await?;
Ok(output_ok)
})()
.await,
)
}
},
)
}
fn wire__crate__api__set_transmit_mode_impl(
port_: flutter_rust_bridge::for_generated::MessagePort,
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
@@ -1783,11 +1750,17 @@ impl SseDecode for crate::api::BridgeAudioBackend {
impl SseDecode for crate::api::BridgeAudioDevice {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_id = <String>::sse_decode(deserializer);
let mut var_name = <String>::sse_decode(deserializer);
let mut var_details = <String>::sse_decode(deserializer);
let mut var_isDefault = <bool>::sse_decode(deserializer);
let mut var_isSelected = <bool>::sse_decode(deserializer);
return crate::api::BridgeAudioDevice {
id: var_id,
name: var_name,
details: var_details,
is_default: var_isDefault,
is_selected: var_isSelected,
};
}
}
@@ -1859,6 +1832,11 @@ impl SseDecode for crate::api::BridgeAudioProcessingStats {
let mut var_outputUnderruns = <u64>::sse_decode(deserializer);
let mut var_callbackXruns = <u64>::sse_decode(deserializer);
let mut var_clippedSamples = <u64>::sse_decode(deserializer);
let mut var_zeroFrames = <u64>::sse_decode(deserializer);
let mut var_captureFrames = <u64>::sse_decode(deserializer);
let mut var_callbacks10Ms = <u64>::sse_decode(deserializer);
let mut var_callbacks20Ms = <u64>::sse_decode(deserializer);
let mut var_callbacksOther = <u64>::sse_decode(deserializer);
let mut var_sonoraEnabled = <bool>::sse_decode(deserializer);
let mut var_platformVoiceProcessingEnabled = <bool>::sse_decode(deserializer);
return crate::api::BridgeAudioProcessingStats {
@@ -1879,6 +1857,11 @@ impl SseDecode for crate::api::BridgeAudioProcessingStats {
output_underruns: var_outputUnderruns,
callback_xruns: var_callbackXruns,
clipped_samples: var_clippedSamples,
zero_frames: var_zeroFrames,
capture_frames: var_captureFrames,
callbacks_10ms: var_callbacks10Ms,
callbacks_20ms: var_callbacks20Ms,
callbacks_other: var_callbacksOther,
sonora_enabled: var_sonoraEnabled,
platform_voice_processing_enabled: var_platformVoiceProcessingEnabled,
};
@@ -2147,6 +2130,12 @@ impl SseDecode for crate::api::BridgeEvent {
};
}
12 => {
let mut var_message = <String>::sse_decode(deserializer);
return crate::api::BridgeEvent::ServerActivity {
message: var_message,
};
}
13 => {
let mut var_route = <crate::api::BridgeAudioRoute>::sse_decode(deserializer);
return crate::api::BridgeEvent::AudioRouteChanged { route: var_route };
}
@@ -2291,10 +2280,9 @@ impl SseDecode for crate::api::BridgeVadBackend {
let mut inner = <i32>::sse_decode(deserializer);
return match inner {
0 => crate::api::BridgeVadBackend::SileroOnnx,
1 => crate::api::BridgeVadBackend::TenVad,
2 => crate::api::BridgeVadBackend::WebrtcVad,
3 => crate::api::BridgeVadBackend::EnergyDebug,
4 => crate::api::BridgeVadBackend::Disabled,
1 => crate::api::BridgeVadBackend::WebrtcVad,
2 => crate::api::BridgeVadBackend::EnergyDebug,
3 => crate::api::BridgeVadBackend::Disabled,
_ => unreachable!("Invalid variant for BridgeVadBackend: {}", inner),
};
}
@@ -2544,13 +2532,12 @@ fn pde_ffi_dispatcher_primary_impl(
39 => wire__crate__api__set_ptt_impl(port, ptr, rust_vec_len, data_len),
40 => wire__crate__api__set_ptt_binding_impl(port, ptr, rust_vec_len, data_len),
41 => wire__crate__api__set_release_tail_ms_impl(port, ptr, rust_vec_len, data_len),
42 => wire__crate__api__set_ten_vad_model_path_impl(port, ptr, rust_vec_len, data_len),
43 => wire__crate__api__set_transmit_mode_impl(port, ptr, rust_vec_len, data_len),
44 => wire__crate__api__set_vad_model_path_impl(port, ptr, rust_vec_len, data_len),
45 => wire__crate__api__snapshot_impl(port, ptr, rust_vec_len, data_len),
46 => wire__crate__api__update_bookmark_impl(port, ptr, rust_vec_len, data_len),
47 => wire__crate__api__voice_join_impl(port, ptr, rust_vec_len, data_len),
48 => wire__crate__api__voice_leave_impl(port, ptr, rust_vec_len, data_len),
42 => wire__crate__api__set_transmit_mode_impl(port, ptr, rust_vec_len, data_len),
43 => wire__crate__api__set_vad_model_path_impl(port, ptr, rust_vec_len, data_len),
44 => wire__crate__api__snapshot_impl(port, ptr, rust_vec_len, data_len),
45 => wire__crate__api__update_bookmark_impl(port, ptr, rust_vec_len, data_len),
46 => wire__crate__api__voice_join_impl(port, ptr, rust_vec_len, data_len),
47 => wire__crate__api__voice_leave_impl(port, ptr, rust_vec_len, data_len),
_ => unreachable!(),
}
}
@@ -2609,8 +2596,11 @@ impl flutter_rust_bridge::IntoIntoDart<crate::api::BridgeAudioBackend>
impl flutter_rust_bridge::IntoDart for crate::api::BridgeAudioDevice {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.id.into_into_dart().into_dart(),
self.name.into_into_dart().into_dart(),
self.details.into_into_dart().into_dart(),
self.is_default.into_into_dart().into_dart(),
self.is_selected.into_into_dart().into_dart(),
]
.into_dart()
}
@@ -2697,6 +2687,11 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeAudioProcessingStats {
self.output_underruns.into_into_dart().into_dart(),
self.callback_xruns.into_into_dart().into_dart(),
self.clipped_samples.into_into_dart().into_dart(),
self.zero_frames.into_into_dart().into_dart(),
self.capture_frames.into_into_dart().into_dart(),
self.callbacks_10ms.into_into_dart().into_dart(),
self.callbacks_20ms.into_into_dart().into_dart(),
self.callbacks_other.into_into_dart().into_dart(),
self.sonora_enabled.into_into_dart().into_dart(),
self.platform_voice_processing_enabled
.into_into_dart()
@@ -2973,8 +2968,11 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
target.into_into_dart().into_dart(),
]
.into_dart(),
crate::api::BridgeEvent::ServerActivity { message } => {
[12.into_dart(), message.into_into_dart().into_dart()].into_dart()
}
crate::api::BridgeEvent::AudioRouteChanged { route } => {
[12.into_dart(), route.into_into_dart().into_dart()].into_dart()
[13.into_dart(), route.into_into_dart().into_dart()].into_dart()
}
_ => {
unimplemented!("");
@@ -3170,10 +3168,9 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeVadBackend {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
match self {
Self::SileroOnnx => 0.into_dart(),
Self::TenVad => 1.into_dart(),
Self::WebrtcVad => 2.into_dart(),
Self::EnergyDebug => 3.into_dart(),
Self::Disabled => 4.into_dart(),
Self::WebrtcVad => 1.into_dart(),
Self::EnergyDebug => 2.into_dart(),
Self::Disabled => 3.into_dart(),
_ => unreachable!(),
}
}
@@ -3313,8 +3310,11 @@ impl SseEncode for crate::api::BridgeAudioBackend {
impl SseEncode for crate::api::BridgeAudioDevice {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<String>::sse_encode(self.id, serializer);
<String>::sse_encode(self.name, serializer);
<String>::sse_encode(self.details, serializer);
<bool>::sse_encode(self.is_default, serializer);
<bool>::sse_encode(self.is_selected, serializer);
}
}
@@ -3368,6 +3368,11 @@ impl SseEncode for crate::api::BridgeAudioProcessingStats {
<u64>::sse_encode(self.output_underruns, serializer);
<u64>::sse_encode(self.callback_xruns, serializer);
<u64>::sse_encode(self.clipped_samples, serializer);
<u64>::sse_encode(self.zero_frames, serializer);
<u64>::sse_encode(self.capture_frames, serializer);
<u64>::sse_encode(self.callbacks_10ms, serializer);
<u64>::sse_encode(self.callbacks_20ms, serializer);
<u64>::sse_encode(self.callbacks_other, serializer);
<bool>::sse_encode(self.sonora_enabled, serializer);
<bool>::sse_encode(self.platform_voice_processing_enabled, serializer);
}
@@ -3595,8 +3600,12 @@ impl SseEncode for crate::api::BridgeEvent {
<String>::sse_encode(message, serializer);
<crate::api::BridgeMessageTarget>::sse_encode(target, serializer);
}
crate::api::BridgeEvent::AudioRouteChanged { route } => {
crate::api::BridgeEvent::ServerActivity { message } => {
<i32>::sse_encode(12, serializer);
<String>::sse_encode(message, serializer);
}
crate::api::BridgeEvent::AudioRouteChanged { route } => {
<i32>::sse_encode(13, serializer);
<crate::api::BridgeAudioRoute>::sse_encode(route, serializer);
}
_ => {
@@ -3734,10 +3743,9 @@ impl SseEncode for crate::api::BridgeVadBackend {
<i32>::sse_encode(
match self {
crate::api::BridgeVadBackend::SileroOnnx => 0,
crate::api::BridgeVadBackend::TenVad => 1,
crate::api::BridgeVadBackend::WebrtcVad => 2,
crate::api::BridgeVadBackend::EnergyDebug => 3,
crate::api::BridgeVadBackend::Disabled => 4,
crate::api::BridgeVadBackend::WebrtcVad => 1,
crate::api::BridgeVadBackend::EnergyDebug => 2,
crate::api::BridgeVadBackend::Disabled => 3,
_ => {
unimplemented!("");
}