Enhance audio service: Add mutex for input resampler and reset logic to prevent buffer overflow during mode switching (#1653)

This commit is contained in:
Xiaoxia
2026-01-14 02:17:41 +08:00
committed by GitHub
parent b48506171b
commit 2ff3796289
2 changed files with 18 additions and 0 deletions

View File

@@ -194,6 +194,7 @@ bool AudioService::ReadAudioData(std::vector<int16_t>& data, int sample_rate, in
return false;
}
if (input_resampler_ != nullptr) {
std::lock_guard<std::mutex> lock(input_resampler_mutex_);
uint32_t in_sample_num = data.size() / codec_->input_channels();
uint32_t output_samples = 0;
esp_ae_rate_cvt_get_max_out_sample_num(input_resampler_, in_sample_num, &output_samples);
@@ -567,6 +568,14 @@ void AudioService::EnableWakeWordDetection(bool enable) {
}
wake_word_initialized_ = true;
}
// Reset input resampler to clear cached data from previous mode (e.g. AudioProcessor)
// This prevents buffer overflow when switching between different feed sizes
{
std::lock_guard<std::mutex> lock(input_resampler_mutex_);
if (input_resampler_ != nullptr) {
esp_ae_rate_cvt_reset(input_resampler_);
}
}
wake_word_->Start();
xEventGroupSetBits(event_group_, AS_EVENT_WAKE_WORD_RUNNING);
} else {
@@ -586,6 +595,14 @@ void AudioService::EnableVoiceProcessing(bool enable) {
/* We should make sure no audio is playing */
ResetDecoder();
audio_input_need_warmup_ = true;
// Reset input resampler to clear cached data from previous mode (e.g. WakeWord)
// This prevents buffer overflow when switching between different feed sizes
{
std::lock_guard<std::mutex> lock(input_resampler_mutex_);
if (input_resampler_ != nullptr) {
esp_ae_rate_cvt_reset(input_resampler_);
}
}
audio_processor_->Start();
xEventGroupSetBits(event_group_, AS_EVENT_AUDIO_PROCESSOR_RUNNING);
} else {

View File

@@ -142,6 +142,7 @@ private:
void* opus_encoder_ = nullptr;
void* opus_decoder_ = nullptr;
std::mutex decoder_mutex_;
std::mutex input_resampler_mutex_;
esp_ae_rate_cvt_handle_t input_resampler_ = nullptr;
esp_ae_rate_cvt_handle_t output_resampler_ = nullptr;