diff --git a/main/audio/processors/no_audio_processor.cc b/main/audio/processors/no_audio_processor.cc index bac5bad6..90f997a9 100644 --- a/main/audio/processors/no_audio_processor.cc +++ b/main/audio/processors/no_audio_processor.cc @@ -6,6 +6,7 @@ void NoAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) { codec_ = codec; frame_samples_ = frame_duration_ms * 16000 / 1000; + output_buffer_.reserve(frame_samples_); } void NoAudioProcessor::Feed(std::vector&& data) { @@ -13,15 +14,25 @@ void NoAudioProcessor::Feed(std::vector&& data) { return; } + // Convert stereo to mono if needed if (codec_->input_channels() == 2) { - // If input channels is 2, we need to fetch the left channel data - auto mono_data = std::vector(data.size() / 2); - for (size_t i = 0, j = 0; i < mono_data.size(); ++i, j += 2) { - mono_data[i] = data[j]; + for (size_t i = 0, j = 0; i < data.size() / 2; ++i, j += 2) { + output_buffer_.push_back(data[j]); } - output_callback_(std::move(mono_data)); } else { - output_callback_(std::move(data)); + output_buffer_.insert(output_buffer_.end(), data.begin(), data.end()); + } + + // Output complete frames when buffer has enough data + while (output_buffer_.size() >= (size_t)frame_samples_) { + if (output_buffer_.size() == (size_t)frame_samples_) { + output_callback_(std::move(output_buffer_)); + output_buffer_.clear(); + output_buffer_.reserve(frame_samples_); + } else { + output_callback_(std::vector(output_buffer_.begin(), output_buffer_.begin() + frame_samples_)); + output_buffer_.erase(output_buffer_.begin(), output_buffer_.begin() + frame_samples_); + } } } @@ -31,6 +42,7 @@ void NoAudioProcessor::Start() { void NoAudioProcessor::Stop() { is_running_ = false; + output_buffer_.clear(); } bool NoAudioProcessor::IsRunning() { diff --git a/main/audio/processors/no_audio_processor.h b/main/audio/processors/no_audio_processor.h index 13e4897d..70ef1d16 100644 --- a/main/audio/processors/no_audio_processor.h +++ b/main/audio/processors/no_audio_processor.h @@ -26,6 +26,7 @@ public: private: AudioCodec* codec_ = nullptr; int frame_samples_ = 0; + std::vector output_buffer_; std::function&& data)> output_callback_; std::function vad_state_change_callback_; std::atomic is_running_ = false; diff --git a/main/boards/movecall-moji2-esp32c5/config.json b/main/boards/movecall-moji2-esp32c5/config.json index afa8a69d..9cebd10d 100644 --- a/main/boards/movecall-moji2-esp32c5/config.json +++ b/main/boards/movecall-moji2-esp32c5/config.json @@ -6,7 +6,6 @@ "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y", "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/16m.csv\"", - "CONFIG_PM_ENABLE=y", "CONFIG_FREERTOS_USE_TICKLESS_IDLE=y", "CONFIG_SPIRAM_MODE_QUAD=y", "CONFIG_SPIRAM_SPEED_80M=y", diff --git a/main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc b/main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc index 9f09ae35..93152ee8 100644 --- a/main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc +++ b/main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc @@ -227,16 +227,19 @@ private: void InitializeBatteryMonitor() { adc_battery_monitor_ = new AdcBatteryMonitor(ADC_UNIT_1, ADC_CHANNEL_3, 5100000, 5100000, GPIO_NUM_NC); adc_battery_monitor_->OnChargingStatusChanged([this](bool is_charging) { - if (is_charging) { - power_save_timer_->SetEnabled(false); - } else { - power_save_timer_->SetEnabled(true); + if (power_save_timer_ != nullptr){ + if (is_charging) { + power_save_timer_->SetEnabled(false); + } else { + power_save_timer_->SetEnabled(true); + } } + }); } void InitializePowerSaveTimer() { - power_save_timer_ = new PowerSaveTimer(240, 300); + power_save_timer_ = new PowerSaveTimer(240, -1, -1); power_save_timer_->OnEnterSleepMode([this]() { GetDisplay()->SetPowerSaveMode(true); }); @@ -348,8 +351,8 @@ private: public: MovecallMoji2ESP32C5() : boot_button_(BOOT_BUTTON_GPIO) { InitializeCodecI2c(); - InitializeBatteryMonitor(); InitializePowerSaveTimer(); + InitializeBatteryMonitor(); InitializeSpi(); InitializeSt77916Display(); InitializeButtons();