fix(multimodal): harden playback and client lifecycle handling

- retry the server connection prompt after transient playback failures
- serialize multimodal client and session start-stop operations
- tag downstream responses to ignore stale packets and playback events
- complete bounded teardown and clean callbacks after partial startup
This commit is contained in:
chenjintao
2026-08-14 15:24:29 +08:00
parent c56c65462e
commit 0cfb10252c
12 changed files with 436 additions and 188 deletions
@@ -200,9 +200,10 @@ esp_err_t platform_multimodal_audio_play_downstream_opus(const uint8_t *data, si
return multimodal_audio_handle_downstream_opus(data, len);
}
esp_err_t platform_multimodal_audio_begin_downstream_response(void)
esp_err_t platform_multimodal_audio_begin_downstream_response(
uint32_t *out_playback_generation)
{
return multimodal_audio_begin_downstream_response();
return multimodal_audio_begin_downstream_response(out_playback_generation);
}
esp_err_t platform_multimodal_audio_finish_downstream_response(void)
@@ -230,22 +231,22 @@ static void platform_multimodal_downstream_playback_bridge(
switch (event->type) {
case MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_STARTED:
if (callbacks.on_started != NULL) {
callbacks.on_started(callbacks.user_data);
callbacks.on_started(event->playback_generation, callbacks.user_data);
}
break;
case MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_COMPLETED:
if (callbacks.on_completed != NULL) {
callbacks.on_completed(callbacks.user_data);
callbacks.on_completed(event->playback_generation, callbacks.user_data);
}
break;
case MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_STOPPED:
if (callbacks.on_stopped != NULL) {
callbacks.on_stopped(callbacks.user_data);
callbacks.on_stopped(event->playback_generation, callbacks.user_data);
}
break;
case MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_STALLED:
if (callbacks.on_stalled != NULL) {
callbacks.on_stalled(callbacks.user_data);
callbacks.on_stalled(event->playback_generation, callbacks.user_data);
}
break;
default: