diff --git a/main/audio/audio_service.cc b/main/audio/audio_service.cc index 4aad0b6e..408eb839 100644 --- a/main/audio/audio_service.cc +++ b/main/audio/audio_service.cc @@ -194,6 +194,7 @@ bool AudioService::ReadAudioData(std::vector& data, int sample_rate, in return false; } if (input_resampler_ != nullptr) { + std::lock_guard 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 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 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 { diff --git a/main/audio/audio_service.h b/main/audio/audio_service.h index 7e1a5071..a2af18e8 100644 --- a/main/audio/audio_service.h +++ b/main/audio/audio_service.h @@ -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;