diff --git a/main/audio/codecs/box_audio_codec.cc b/main/audio/codecs/box_audio_codec.cc index acf8f2a8..e8f941b6 100644 --- a/main/audio/codecs/box_audio_codec.cc +++ b/main/audio/codecs/box_audio_codec.cc @@ -184,6 +184,7 @@ void BoxAudioCodec::SetOutputVolume(int volume) { } void BoxAudioCodec::EnableInput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == input_enabled_) { return; } @@ -207,6 +208,7 @@ void BoxAudioCodec::EnableInput(bool enable) { } void BoxAudioCodec::EnableOutput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == output_enabled_) { return; } @@ -228,6 +230,7 @@ void BoxAudioCodec::EnableOutput(bool enable) { } int BoxAudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); if (input_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t))); } @@ -235,6 +238,7 @@ int BoxAudioCodec::Read(int16_t* dest, int samples) { } int BoxAudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); if (output_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t))); } diff --git a/main/audio/codecs/box_audio_codec.h b/main/audio/codecs/box_audio_codec.h index 43cd090b..cb7d3898 100644 --- a/main/audio/codecs/box_audio_codec.h +++ b/main/audio/codecs/box_audio_codec.h @@ -5,6 +5,8 @@ #include #include +#include + class BoxAudioCodec : public AudioCodec { private: @@ -17,6 +19,7 @@ private: esp_codec_dev_handle_t output_dev_ = nullptr; esp_codec_dev_handle_t input_dev_ = nullptr; + std::mutex data_if_mutex_; void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); diff --git a/main/audio/codecs/es8311_audio_codec.cc b/main/audio/codecs/es8311_audio_codec.cc index ddc1c08e..0da66d1e 100644 --- a/main/audio/codecs/es8311_audio_codec.cc +++ b/main/audio/codecs/es8311_audio_codec.cc @@ -155,6 +155,7 @@ void Es8311AudioCodec::SetOutputVolume(int volume) { } void Es8311AudioCodec::EnableInput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == input_enabled_) { return; } @@ -163,6 +164,7 @@ void Es8311AudioCodec::EnableInput(bool enable) { } void Es8311AudioCodec::EnableOutput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == output_enabled_) { return; } @@ -171,6 +173,7 @@ void Es8311AudioCodec::EnableOutput(bool enable) { } int Es8311AudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); if (input_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(dev_, (void*)dest, samples * sizeof(int16_t))); } @@ -178,6 +181,7 @@ int Es8311AudioCodec::Read(int16_t* dest, int samples) { } int Es8311AudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); if (output_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(dev_, (void*)data, samples * sizeof(int16_t))); } diff --git a/main/audio/codecs/es8311_audio_codec.h b/main/audio/codecs/es8311_audio_codec.h index 1e63d60c..dd0e6398 100644 --- a/main/audio/codecs/es8311_audio_codec.h +++ b/main/audio/codecs/es8311_audio_codec.h @@ -7,6 +7,8 @@ #include #include #include +#include + class Es8311AudioCodec : public AudioCodec { private: @@ -18,6 +20,7 @@ private: esp_codec_dev_handle_t dev_ = nullptr; gpio_num_t pa_pin_ = GPIO_NUM_NC; bool pa_inverted_ = false; + std::mutex data_if_mutex_; void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); void UpdateDeviceState(); diff --git a/main/audio/codecs/es8374_audio_codec.cc b/main/audio/codecs/es8374_audio_codec.cc index ff23eeea..2cf33dc5 100644 --- a/main/audio/codecs/es8374_audio_codec.cc +++ b/main/audio/codecs/es8374_audio_codec.cc @@ -133,6 +133,7 @@ void Es8374AudioCodec::SetOutputVolume(int volume) { } void Es8374AudioCodec::EnableInput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == input_enabled_) { return; } @@ -153,6 +154,7 @@ void Es8374AudioCodec::EnableInput(bool enable) { } void Es8374AudioCodec::EnableOutput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == output_enabled_) { return; } @@ -180,6 +182,7 @@ void Es8374AudioCodec::EnableOutput(bool enable) { } int Es8374AudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); if (input_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t))); } @@ -187,6 +190,7 @@ int Es8374AudioCodec::Read(int16_t* dest, int samples) { } int Es8374AudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); if (output_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t))); } diff --git a/main/audio/codecs/es8374_audio_codec.h b/main/audio/codecs/es8374_audio_codec.h index f10915d4..7533c222 100644 --- a/main/audio/codecs/es8374_audio_codec.h +++ b/main/audio/codecs/es8374_audio_codec.h @@ -7,6 +7,8 @@ #include #include #include +#include + class Es8374AudioCodec : public AudioCodec { private: @@ -18,6 +20,7 @@ private: esp_codec_dev_handle_t output_dev_ = nullptr; esp_codec_dev_handle_t input_dev_ = nullptr; gpio_num_t pa_pin_ = GPIO_NUM_NC; + std::mutex data_if_mutex_; void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); diff --git a/main/audio/codecs/es8388_audio_codec.cc b/main/audio/codecs/es8388_audio_codec.cc index 21dc7c6f..bb3fb760 100644 --- a/main/audio/codecs/es8388_audio_codec.cc +++ b/main/audio/codecs/es8388_audio_codec.cc @@ -137,6 +137,7 @@ void Es8388AudioCodec::SetOutputVolume(int volume) { } void Es8388AudioCodec::EnableInput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == input_enabled_) { return; } @@ -157,6 +158,7 @@ void Es8388AudioCodec::EnableInput(bool enable) { } void Es8388AudioCodec::EnableOutput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == output_enabled_) { return; } @@ -191,6 +193,7 @@ void Es8388AudioCodec::EnableOutput(bool enable) { } int Es8388AudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); if (input_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t))); } @@ -198,6 +201,7 @@ int Es8388AudioCodec::Read(int16_t* dest, int samples) { } int Es8388AudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); if (output_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t))); } diff --git a/main/audio/codecs/es8388_audio_codec.h b/main/audio/codecs/es8388_audio_codec.h index 96a06290..d81f49d1 100644 --- a/main/audio/codecs/es8388_audio_codec.h +++ b/main/audio/codecs/es8388_audio_codec.h @@ -6,6 +6,8 @@ #include #include #include +#include + class Es8388AudioCodec : public AudioCodec { private: @@ -17,6 +19,7 @@ private: esp_codec_dev_handle_t output_dev_ = nullptr; esp_codec_dev_handle_t input_dev_ = nullptr; gpio_num_t pa_pin_ = GPIO_NUM_NC; + std::mutex data_if_mutex_; void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); diff --git a/main/audio/codecs/es8389_audio_codec.cc b/main/audio/codecs/es8389_audio_codec.cc index 9e30627c..49693331 100644 --- a/main/audio/codecs/es8389_audio_codec.cc +++ b/main/audio/codecs/es8389_audio_codec.cc @@ -140,6 +140,7 @@ void Es8389AudioCodec::SetOutputVolume(int volume) { } void Es8389AudioCodec::EnableInput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == input_enabled_) { return; } @@ -160,6 +161,7 @@ void Es8389AudioCodec::EnableInput(bool enable) { } void Es8389AudioCodec::EnableOutput(bool enable) { + std::lock_guard lock(data_if_mutex_); if (enable == output_enabled_) { return; } @@ -187,6 +189,7 @@ void Es8389AudioCodec::EnableOutput(bool enable) { } int Es8389AudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); if (input_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t))); } @@ -194,6 +197,7 @@ int Es8389AudioCodec::Read(int16_t* dest, int samples) { } int Es8389AudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); if (output_enabled_) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t))); } diff --git a/main/audio/codecs/es8389_audio_codec.h b/main/audio/codecs/es8389_audio_codec.h index de213a3d..b55b4273 100644 --- a/main/audio/codecs/es8389_audio_codec.h +++ b/main/audio/codecs/es8389_audio_codec.h @@ -7,6 +7,7 @@ #include #include #include +#include class Es8389AudioCodec : public AudioCodec { private: @@ -18,6 +19,7 @@ private: esp_codec_dev_handle_t output_dev_ = nullptr; esp_codec_dev_handle_t input_dev_ = nullptr; gpio_num_t pa_pin_ = GPIO_NUM_NC; + std::mutex data_if_mutex_; void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); diff --git a/main/audio/codecs/no_audio_codec.cc b/main/audio/codecs/no_audio_codec.cc index eea3309a..f5c6c9c6 100644 --- a/main/audio/codecs/no_audio_codec.cc +++ b/main/audio/codecs/no_audio_codec.cc @@ -279,6 +279,7 @@ NoAudioCodecSimplexPdm::NoAudioCodecSimplexPdm(int input_sample_rate, int output } int NoAudioCodec::Write(const int16_t* data, int samples) { + std::lock_guard lock(data_if_mutex_); std::vector buffer(samples); // output_volume_: 0-100 @@ -301,6 +302,7 @@ int NoAudioCodec::Write(const int16_t* data, int samples) { } int NoAudioCodec::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); size_t bytes_read; std::vector bit32_buffer(samples); @@ -318,6 +320,7 @@ int NoAudioCodec::Read(int16_t* dest, int samples) { } int NoAudioCodecSimplexPdm::Read(int16_t* dest, int samples) { + std::lock_guard lock(data_if_mutex_); size_t bytes_read; // PDM 解调后的数据位宽为 16 位,直接读取到目标缓冲区 diff --git a/main/audio/codecs/no_audio_codec.h b/main/audio/codecs/no_audio_codec.h index cea633be..c1eedc6d 100644 --- a/main/audio/codecs/no_audio_codec.h +++ b/main/audio/codecs/no_audio_codec.h @@ -5,9 +5,12 @@ #include #include +#include class NoAudioCodec : public AudioCodec { -private: +protected: + std::mutex data_if_mutex_; + virtual int Write(const int16_t* data, int samples) override; virtual int Read(int16_t* dest, int samples) override;