diff --git a/main/audio/codecs/box_audio_codec.cc b/main/audio/codecs/box_audio_codec.cc index 8bbe07d3..5210ecbc 100644 --- a/main/audio/codecs/box_audio_codec.cc +++ b/main/audio/codecs/box_audio_codec.cc @@ -7,14 +7,18 @@ #define TAG "BoxAudioCodec" BoxAudioCodec::BoxAudioCodec(void* i2c_master_handle, int input_sample_rate, int output_sample_rate, - gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, - gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference) { - duplex_ = true; // 是否双工 - input_reference_ = input_reference; // 是否使用参考输入,实现回声消除 - input_channels_ = input_reference_ ? 2 : 1; // 输入通道数 + gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, + gpio_num_t din, gpio_num_t pa_pin, uint8_t es8311_addr, + uint8_t es7210_addr, bool input_reference, float input_gain, + int reference_gain_channel, float reference_gain) { + duplex_ = true; // 是否双工 + input_reference_ = input_reference; // 是否使用参考输入,实现回声消除 + input_channels_ = input_reference_ ? 2 : 1; // 输入通道数 input_sample_rate_ = input_sample_rate; output_sample_rate_ = output_sample_rate; - input_gain_ = 30; + input_gain_ = input_gain; + reference_gain_channel_ = reference_gain_channel; + reference_gain_ = reference_gain; CreateDuplexChannels(mclk, bclk, ws, dout, din); @@ -203,7 +207,15 @@ void BoxAudioCodec::EnableInput(bool enable) { fs.channel_mask |= ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1); } ESP_ERROR_CHECK(esp_codec_dev_open(input_dev_, &fs)); - ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain(input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), input_gain_)); + ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain( + input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), input_gain_)); + if (input_reference_ && reference_gain_channel_ >= 0) { + // ES7210 gain masks use physical MIC numbering, which differs + // from the TDM slot order (MIC1, MIC3, MIC2, MIC4). + ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain( + input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(reference_gain_channel_), + reference_gain_)); + } } else { ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_)); } @@ -244,4 +256,4 @@ int BoxAudioCodec::Write(const int16_t* data, int samples) { ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t))); } return samples; -} \ No newline at end of file +} diff --git a/main/audio/codecs/box_audio_codec.h b/main/audio/codecs/box_audio_codec.h index cb7d3898..3f85ed58 100644 --- a/main/audio/codecs/box_audio_codec.h +++ b/main/audio/codecs/box_audio_codec.h @@ -20,16 +20,21 @@ private: esp_codec_dev_handle_t output_dev_ = nullptr; esp_codec_dev_handle_t input_dev_ = nullptr; std::mutex data_if_mutex_; + int reference_gain_channel_ = -1; + float reference_gain_ = 0.0f; - void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din); + void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, + gpio_num_t din); virtual int Read(int16_t* dest, int samples) override; virtual int Write(const int16_t* data, int samples) override; public: BoxAudioCodec(void* i2c_master_handle, int input_sample_rate, int output_sample_rate, - gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, - gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference); + gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, + gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference, + float input_gain = 30.0f, int reference_gain_channel = -1, + float reference_gain = 0.0f); virtual ~BoxAudioCodec(); virtual void SetOutputVolume(int volume) override; diff --git a/main/audio/engines/afe_audio_engine.cc b/main/audio/engines/afe_audio_engine.cc index f933808c..9d1a6ec8 100644 --- a/main/audio/engines/afe_audio_engine.cc +++ b/main/audio/engines/afe_audio_engine.cc @@ -126,14 +126,14 @@ bool AfeAudioEngine::Initialize(AudioCodec* codec, int frame_duration_ms, srmode ? nullptr : esp_srmodel_filter(models_, ESP_VADN_PREFIX, nullptr); afe_config_t* afe_config = afe_config_init( - input_format.c_str(), models_, AFE_TYPE_FD, AFE_MODE_LOW_COST); + input_format.c_str(), models_, AFE_TYPE_VC, AFE_MODE_HIGH_PERF); if (afe_config == nullptr) { ESP_LOGE(TAG, "Failed to create AFE configuration"); return false; } afe_config->aec_init = codec_->input_reference(); - afe_config->aec_mode = AEC_MODE_FD_LOW_COST; + afe_config->aec_mode = AEC_MODE_VOIP_HIGH_PERF; afe_config->aec_nlp_level = AEC_NLP_LEVEL_VERYAGGR; afe_config->ns_init = false; afe_config->vad_init = kUseAfeForVoiceProcessing; diff --git a/main/boards/lichuang-dev/lichuang_dev_board.cc b/main/boards/lichuang-dev/lichuang_dev_board.cc index af77f612..4c3c0a73 100644 --- a/main/boards/lichuang-dev/lichuang_dev_board.cc +++ b/main/boards/lichuang-dev/lichuang_dev_board.cc @@ -39,21 +39,15 @@ private: Pca9557* pca9557_; public: - CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557) - : BoxAudioCodec(i2c_bus, - AUDIO_INPUT_SAMPLE_RATE, - AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, - AUDIO_I2S_GPIO_BCLK, - AUDIO_I2S_GPIO_WS, - AUDIO_I2S_GPIO_DOUT, - AUDIO_I2S_GPIO_DIN, - GPIO_NUM_NC, - AUDIO_CODEC_ES8311_ADDR, - AUDIO_CODEC_ES7210_ADDR, - AUDIO_INPUT_REFERENCE), - pca9557_(pca9557) { - } + CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557) + : BoxAudioCodec(i2c_bus, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, GPIO_NUM_NC, + AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE, + 28.0f, // Physical MIC1 gain + 2, // Physical MIC3 is the playback reference input + 0.0f), + pca9557_(pca9557) {} virtual void EnableOutput(bool enable) override { BoxAudioCodec::EnableOutput(enable);