fix(multimodal): stabilize downstream audio playback
- add configurable prebuffer and adaptive rebuffer for packet jitter - mute stalled output, auto-clear I2S DMA, and abort inactive playback after 3 seconds - discard stale-generation packets and add optional downstream diagnostics
This commit is contained in:
@@ -131,6 +131,26 @@
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_IDLE_MUTE_MS 250
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_ACTIVE_STALL_MUTE_MS
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_ACTIVE_STALL_MUTE_MS 3000
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_PREBUFFER_MS
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_PREBUFFER_MS 160
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_REBUFFER_GAP_MS
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_REBUFFER_GAP_MS 120
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_MAX_REBUFFER_MS
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_MAX_REBUFFER_MS 640
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_DIAGNOSTICS_ENABLE
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_DIAGNOSTICS_ENABLE 0
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_TASK_STACK
|
||||
#define CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_PLAYBACK_TASK_STACK 12288
|
||||
#endif
|
||||
@@ -304,6 +324,8 @@ typedef struct {
|
||||
bool downstream_output_primed;
|
||||
bool downstream_response_active;
|
||||
bool downstream_response_end_received;
|
||||
TickType_t downstream_last_audio_tick;
|
||||
TickType_t downstream_last_response_activity_tick;
|
||||
esp_timer_handle_t downstream_idle_mute_timer;
|
||||
QueueHandle_t downstream_playback_queue;
|
||||
bool downstream_playback_queue_with_caps;
|
||||
@@ -347,6 +369,29 @@ static uint32_t s_downstream_overflow_count;
|
||||
static TickType_t s_downstream_overflow_last_log_tick;
|
||||
static uint32_t s_downstream_queued_packet_total;
|
||||
static uint32_t s_downstream_played_packet_total;
|
||||
#if CONFIG_MULTIMODAL_AUDIO_DOWNSTREAM_DIAGNOSTICS_ENABLE
|
||||
typedef struct {
|
||||
TickType_t response_begin_tick;
|
||||
TickType_t arrival_last_tick;
|
||||
TickType_t first_arrival_tick;
|
||||
TickType_t first_playback_tick;
|
||||
TickType_t last_playback_tick;
|
||||
TickType_t queue_empty_since_tick;
|
||||
uint32_t arrival_gap_min_ms;
|
||||
uint32_t arrival_gap_max_ms;
|
||||
uint64_t arrival_gap_total_ms;
|
||||
uint32_t arrival_gap_samples;
|
||||
UBaseType_t queue_depth_min;
|
||||
UBaseType_t queue_depth_max;
|
||||
uint32_t queue_empty_events;
|
||||
uint32_t queue_empty_max_ms;
|
||||
uint32_t enqueue_failures;
|
||||
uint32_t playback_failures;
|
||||
bool summary_logged;
|
||||
} downstream_diagnostics_t;
|
||||
|
||||
static downstream_diagnostics_t s_downstream_diagnostics;
|
||||
#endif
|
||||
static SemaphoreHandle_t s_downstream_playback_queue_mutex;
|
||||
static bool s_downstream_playback_queue_mutex_initializing;
|
||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||
@@ -360,6 +405,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
size_t len;
|
||||
uint32_t playback_generation;
|
||||
uint8_t *data;
|
||||
} downstream_packet_t;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user