mirror of
https://github.com/78/xiaozhi-esp32.git
synced 2026-02-11 06:33:48 +00:00
Enhance audio service: Add mutex for input resampler and reset logic to prevent buffer overflow during mode switching (#1653)
This commit is contained in:
@@ -194,6 +194,7 @@ bool AudioService::ReadAudioData(std::vector<int16_t>& data, int sample_rate, in
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (input_resampler_ != nullptr) {
|
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 in_sample_num = data.size() / codec_->input_channels();
|
||||||
uint32_t output_samples = 0;
|
uint32_t output_samples = 0;
|
||||||
esp_ae_rate_cvt_get_max_out_sample_num(input_resampler_, in_sample_num, &output_samples);
|
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;
|
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();
|
wake_word_->Start();
|
||||||
xEventGroupSetBits(event_group_, AS_EVENT_WAKE_WORD_RUNNING);
|
xEventGroupSetBits(event_group_, AS_EVENT_WAKE_WORD_RUNNING);
|
||||||
} else {
|
} else {
|
||||||
@@ -586,6 +595,14 @@ void AudioService::EnableVoiceProcessing(bool enable) {
|
|||||||
/* We should make sure no audio is playing */
|
/* We should make sure no audio is playing */
|
||||||
ResetDecoder();
|
ResetDecoder();
|
||||||
audio_input_need_warmup_ = true;
|
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();
|
audio_processor_->Start();
|
||||||
xEventGroupSetBits(event_group_, AS_EVENT_AUDIO_PROCESSOR_RUNNING);
|
xEventGroupSetBits(event_group_, AS_EVENT_AUDIO_PROCESSOR_RUNNING);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ private:
|
|||||||
void* opus_encoder_ = nullptr;
|
void* opus_encoder_ = nullptr;
|
||||||
void* opus_decoder_ = nullptr;
|
void* opus_decoder_ = nullptr;
|
||||||
std::mutex decoder_mutex_;
|
std::mutex decoder_mutex_;
|
||||||
|
std::mutex input_resampler_mutex_;
|
||||||
esp_ae_rate_cvt_handle_t input_resampler_ = nullptr;
|
esp_ae_rate_cvt_handle_t input_resampler_ = nullptr;
|
||||||
esp_ae_rate_cvt_handle_t output_resampler_ = nullptr;
|
esp_ae_rate_cvt_handle_t output_resampler_ = nullptr;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user