From 2d772dad68800bc9fd1e2483b568f1743cf066ce Mon Sep 17 00:00:00 2001 From: laride <198868291+laride@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:50:00 +0800 Subject: [PATCH] fix: resolve some audio issues on esp-hi (#1027) * fix: resolve crash when closing codec dev on esp-hi * fix: fix incorrect status display in non-zh-CN languages * fix: reduce noise when not in Speaking state --- main/audio/audio_service.cc | 6 ++++++ main/boards/esp-hi/adc_pdm_audio_codec.cc | 3 +-- main/boards/esp-hi/emoji_display.cc | 5 +++-- main/boards/esp-hi/esp_hi.cc | 11 +++++++++-- main/idf_component.yml | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/main/audio/audio_service.cc b/main/audio/audio_service.cc index 5012d162..c1c7fb80 100644 --- a/main/audio/audio_service.cc +++ b/main/audio/audio_service.cc @@ -540,6 +540,12 @@ void AudioService::SetCallbacks(AudioServiceCallbacks& callbacks) { } void AudioService::PlaySound(const std::string_view& ogg) { + if (!codec_->output_enabled()) { + esp_timer_stop(audio_power_timer_); + esp_timer_start_periodic(audio_power_timer_, AUDIO_POWER_CHECK_INTERVAL_MS * 1000); + codec_->EnableOutput(true); + } + const uint8_t* buf = reinterpret_cast(ogg.data()); size_t size = ogg.size(); size_t offset = 0; diff --git a/main/boards/esp-hi/adc_pdm_audio_codec.cc b/main/boards/esp-hi/adc_pdm_audio_codec.cc index d6c7d840..3487bf94 100644 --- a/main/boards/esp-hi/adc_pdm_audio_codec.cc +++ b/main/boards/esp-hi/adc_pdm_audio_codec.cc @@ -141,8 +141,7 @@ void AdcPdmAudioCodec::EnableInput(bool enable) { }; ESP_ERROR_CHECK(esp_codec_dev_open(input_dev_, &fs)); } else { - // ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_)); - return; + ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_)); } AudioCodec::EnableInput(enable); } diff --git a/main/boards/esp-hi/emoji_display.cc b/main/boards/esp-hi/emoji_display.cc index 8d66c514..3a089873 100644 --- a/main/boards/esp-hi/emoji_display.cc +++ b/main/boards/esp-hi/emoji_display.cc @@ -3,6 +3,7 @@ #include #include "mmap_generate_emoji.h" #include "emoji_display.h" +#include "assets/lang_config.h" #include #include @@ -146,9 +147,9 @@ void EmojiWidget::SetEmotion(const char* emotion) void EmojiWidget::SetStatus(const char* status) { if (player_) { - if (strcmp(status, "聆听中...") == 0) { + if (strcmp(status, Lang::Strings::LISTENING) == 0) { player_->StartPlayer(MMAP_EMOJI_ASKING_AAF, true, 15); - } else if (strcmp(status, "待命") == 0) { + } else if (strcmp(status, Lang::Strings::STANDBY) == 0) { player_->StartPlayer(MMAP_EMOJI_WAKE_AAF, true, 15); } } diff --git a/main/boards/esp-hi/esp_hi.cc b/main/boards/esp-hi/esp_hi.cc index f2a19d7c..ed47b80a 100644 --- a/main/boards/esp-hi/esp_hi.cc +++ b/main/boards/esp-hi/esp_hi.cc @@ -23,6 +23,7 @@ #include "servo_dog_ctrl.h" #include "led_strip.h" #include "driver/rmt_tx.h" +#include "device_state_event.h" #include "sdkconfig.h" @@ -284,13 +285,14 @@ private: ESP_LOGI(TAG, "Create emoji widget, panel: %p, panel_io: %p", panel, panel_io); display_ = new anim::EmojiWidget(panel, panel_io); +#if CONFIG_ESP_CONSOLE_NONE servo_dog_ctrl_config_t config = { .fl_gpio_num = FL_GPIO_NUM, .fr_gpio_num = FR_GPIO_NUM, .bl_gpio_num = BL_GPIO_NUM, .br_gpio_num = BR_GPIO_NUM, }; -#if CONFIG_ESP_CONSOLE_NONE + servo_dog_ctrl_init(&config); #endif } @@ -378,7 +380,7 @@ private: int r = properties["r"].value(); int g = properties["g"].value(); int b = properties["b"].value(); - + led_on_ = true; SetLedColor(r, g, b); return true; @@ -395,6 +397,11 @@ public: InitializeSpi(); InitializeLcdDisplay(); InitializeTools(); + + DeviceStateEventManager::GetInstance().RegisterStateChangeCallback([this](DeviceState previous_state, DeviceState current_state) { + ESP_LOGD(TAG, "Device state changed from %d to %d", previous_state, current_state); + this->GetAudioCodec()->EnableOutput(current_state == kDeviceStateSpeaking); + }); } virtual AudioCodec* GetAudioCodec() override diff --git a/main/idf_component.yml b/main/idf_component.yml index 162b476b..3077e983 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -33,7 +33,7 @@ dependencies: espressif/esp_io_expander_tca95xx_16bit: ^2.0.0 espressif2022/image_player: ==1.1.0~1 espressif2022/esp_emote_gfx: ^1.0.0 - espressif/adc_mic: ^0.2.0 + espressif/adc_mic: ^0.2.1 espressif/esp_mmap_assets: '>=1.2' txp666/otto-emoji-gif-component: ~1.0.2 espressif/adc_battery_estimation: ^0.2.0