Skip to content

Commit 89f1036

Browse files
authored
xmini-c3: 休眠时关闭es8311可减少20mA电流 (78#822)
* Correct class member name * xmini-c3: 休眠时关闭es8311可减少20mA电流
1 parent e9f23ea commit 89f1036

File tree

7 files changed

+54
-62
lines changed

7 files changed

+54
-62
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ main/assets/lang_config.h
1313
main/mmap_generate_emoji.h
1414
.DS_Store
1515
.cache
16-
main/mmap_generate_emoji.h
16+
main/mmap_generate_emoji.h
17+
*.pyc
18+
*.bin

main/audio_codecs/es8311_audio_codec.cc

Lines changed: 38 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Es8311AudioCodec::Es8311AudioCodec(void* i2c_master_handle, i2c_port_t i2c_port,
1414
output_sample_rate_ = output_sample_rate;
1515
pa_pin_ = pa_pin;
1616
pa_inverted_ = pa_inverted;
17+
18+
assert(input_sample_rate_ == output_sample_rate_);
1719
CreateDuplexChannels(mclk, bclk, ws, dout, din);
1820

1921
// Do initialize of related interface: data_if, ctrl_if and gpio_if
@@ -49,33 +51,48 @@ Es8311AudioCodec::Es8311AudioCodec(void* i2c_master_handle, i2c_port_t i2c_port,
4951
codec_if_ = es8311_codec_new(&es8311_cfg);
5052
assert(codec_if_ != NULL);
5153

52-
esp_codec_dev_cfg_t dev_cfg = {
53-
.dev_type = ESP_CODEC_DEV_TYPE_OUT,
54-
.codec_if = codec_if_,
55-
.data_if = data_if_,
56-
};
57-
output_dev_ = esp_codec_dev_new(&dev_cfg);
58-
assert(output_dev_ != NULL);
59-
dev_cfg.dev_type = ESP_CODEC_DEV_TYPE_IN;
60-
input_dev_ = esp_codec_dev_new(&dev_cfg);
61-
assert(input_dev_ != NULL);
62-
esp_codec_set_disable_when_closed(output_dev_, false);
63-
esp_codec_set_disable_when_closed(input_dev_, false);
6454
ESP_LOGI(TAG, "Es8311AudioCodec initialized");
6555
}
6656

6757
Es8311AudioCodec::~Es8311AudioCodec() {
68-
ESP_ERROR_CHECK(esp_codec_dev_close(output_dev_));
69-
esp_codec_dev_delete(output_dev_);
70-
ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_));
71-
esp_codec_dev_delete(input_dev_);
58+
esp_codec_dev_delete(dev_);
7259

7360
audio_codec_delete_codec_if(codec_if_);
7461
audio_codec_delete_ctrl_if(ctrl_if_);
7562
audio_codec_delete_gpio_if(gpio_if_);
7663
audio_codec_delete_data_if(data_if_);
7764
}
7865

66+
void Es8311AudioCodec::UpdateDeviceState() {
67+
if ((input_enabled_ || output_enabled_) && dev_ == nullptr) {
68+
esp_codec_dev_cfg_t dev_cfg = {
69+
.dev_type = ESP_CODEC_DEV_TYPE_IN_OUT,
70+
.codec_if = codec_if_,
71+
.data_if = data_if_,
72+
};
73+
dev_ = esp_codec_dev_new(&dev_cfg);
74+
assert(dev_ != NULL);
75+
76+
esp_codec_dev_sample_info_t fs = {
77+
.bits_per_sample = 16,
78+
.channel = 1,
79+
.channel_mask = 0,
80+
.sample_rate = (uint32_t)input_sample_rate_,
81+
.mclk_multiple = 0,
82+
};
83+
ESP_ERROR_CHECK(esp_codec_dev_open(dev_, &fs));
84+
ESP_ERROR_CHECK(esp_codec_dev_set_in_gain(dev_, AUDIO_CODEC_DEFAULT_MIC_GAIN));
85+
ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(dev_, output_volume_));
86+
} else if (!input_enabled_ && !output_enabled_ && dev_ != nullptr) {
87+
esp_codec_dev_close(dev_);
88+
dev_ = nullptr;
89+
}
90+
if (pa_pin_ != GPIO_NUM_NC) {
91+
int level = output_enabled_ ? 1 : 0;
92+
gpio_set_level(pa_pin_, pa_inverted_ ? !level : level);
93+
}
94+
}
95+
7996
void Es8311AudioCodec::CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din) {
8097
assert(input_sample_rate_ == output_sample_rate_);
8198

@@ -133,67 +150,36 @@ void Es8311AudioCodec::CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gp
133150
}
134151

135152
void Es8311AudioCodec::SetOutputVolume(int volume) {
136-
ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(output_dev_, volume));
153+
ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(dev_, volume));
137154
AudioCodec::SetOutputVolume(volume);
138155
}
139156

140157
void Es8311AudioCodec::EnableInput(bool enable) {
141158
if (enable == input_enabled_) {
142159
return;
143160
}
144-
if (enable) {
145-
esp_codec_dev_sample_info_t fs = {
146-
.bits_per_sample = 16,
147-
.channel = 1,
148-
.channel_mask = 0,
149-
.sample_rate = (uint32_t)input_sample_rate_,
150-
.mclk_multiple = 0,
151-
};
152-
ESP_ERROR_CHECK(esp_codec_dev_open(input_dev_, &fs));
153-
ESP_ERROR_CHECK(esp_codec_dev_set_in_gain(input_dev_, AUDIO_CODEC_DEFAULT_MIC_GAIN));
154-
} else {
155-
ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_));
156-
}
157161
AudioCodec::EnableInput(enable);
162+
UpdateDeviceState();
158163
}
159164

160165
void Es8311AudioCodec::EnableOutput(bool enable) {
161166
if (enable == output_enabled_) {
162167
return;
163168
}
164-
if (enable) {
165-
// Play 16bit 1 channel
166-
esp_codec_dev_sample_info_t fs = {
167-
.bits_per_sample = 16,
168-
.channel = 1,
169-
.channel_mask = 0,
170-
.sample_rate = (uint32_t)output_sample_rate_,
171-
.mclk_multiple = 0,
172-
};
173-
ESP_ERROR_CHECK(esp_codec_dev_open(output_dev_, &fs));
174-
ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(output_dev_, output_volume_));
175-
if (pa_pin_ != GPIO_NUM_NC) {
176-
gpio_set_level(pa_pin_, !pa_inverted_ ? 1 : 0);
177-
}
178-
} else {
179-
ESP_ERROR_CHECK(esp_codec_dev_close(output_dev_));
180-
if (pa_pin_ != GPIO_NUM_NC) {
181-
gpio_set_level(pa_pin_, !pa_inverted_ ? 0 : 1);
182-
}
183-
}
184169
AudioCodec::EnableOutput(enable);
170+
UpdateDeviceState();
185171
}
186172

187173
int Es8311AudioCodec::Read(int16_t* dest, int samples) {
188174
if (input_enabled_) {
189-
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t)));
175+
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(dev_, (void*)dest, samples * sizeof(int16_t)));
190176
}
191177
return samples;
192178
}
193179

194180
int Es8311AudioCodec::Write(const int16_t* data, int samples) {
195181
if (output_enabled_) {
196-
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
182+
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(dev_, (void*)data, samples * sizeof(int16_t)));
197183
}
198184
return samples;
199185
}

main/audio_codecs/es8311_audio_codec.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ class Es8311AudioCodec : public AudioCodec {
1515
const audio_codec_if_t* codec_if_ = nullptr;
1616
const audio_codec_gpio_if_t* gpio_if_ = nullptr;
1717

18-
esp_codec_dev_handle_t output_dev_ = nullptr;
19-
esp_codec_dev_handle_t input_dev_ = nullptr;
18+
esp_codec_dev_handle_t dev_ = nullptr;
2019
gpio_num_t pa_pin_ = GPIO_NUM_NC;
2120
bool pa_inverted_ = false;
2221

2322
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
23+
void UpdateDeviceState();
2424

2525
virtual int Read(int16_t* dest, int samples) override;
2626
virtual int Write(const int16_t* data, int samples) override;

main/background_task.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ void BackgroundTask::Schedule(std::function<void()> callback) {
2727
}
2828
}
2929
active_tasks_++;
30-
main_tasks_.emplace_back([this, cb = std::move(callback)]() {
30+
background_tasks_.emplace_back([this, cb = std::move(callback)]() {
3131
cb();
3232
{
3333
std::lock_guard<std::mutex> lock(mutex_);
3434
active_tasks_--;
35-
if (main_tasks_.empty() && active_tasks_ == 0) {
35+
if (background_tasks_.empty() && active_tasks_ == 0) {
3636
condition_variable_.notify_all();
3737
}
3838
}
@@ -43,17 +43,17 @@ void BackgroundTask::Schedule(std::function<void()> callback) {
4343
void BackgroundTask::WaitForCompletion() {
4444
std::unique_lock<std::mutex> lock(mutex_);
4545
condition_variable_.wait(lock, [this]() {
46-
return main_tasks_.empty() && active_tasks_ == 0;
46+
return background_tasks_.empty() && active_tasks_ == 0;
4747
});
4848
}
4949

5050
void BackgroundTask::BackgroundTaskLoop() {
5151
ESP_LOGI(TAG, "background_task started");
5252
while (true) {
5353
std::unique_lock<std::mutex> lock(mutex_);
54-
condition_variable_.wait(lock, [this]() { return !main_tasks_.empty(); });
54+
condition_variable_.wait(lock, [this]() { return !background_tasks_.empty(); });
5555

56-
std::list<std::function<void()>> tasks = std::move(main_tasks_);
56+
std::list<std::function<void()>> tasks = std::move(background_tasks_);
5757
lock.unlock();
5858

5959
for (auto& task : tasks) {

main/background_task.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class BackgroundTask {
1818

1919
private:
2020
std::mutex mutex_;
21-
std::list<std::function<void()>> main_tasks_;
21+
std::list<std::function<void()>> background_tasks_;
2222
std::condition_variable condition_variable_;
2323
TaskHandle_t background_task_handle_ = nullptr;
2424
std::atomic<size_t> active_tasks_{0};

main/boards/xmini-c3/xmini_c3_board.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ class XminiC3Board : public WifiBoard {
3333
PowerSaveTimer* power_save_timer_ = nullptr;
3434

3535
void InitializePowerSaveTimer() {
36+
#if CONFIG_USE_ESP_WAKE_WORD
3637
power_save_timer_ = new PowerSaveTimer(160, 600);
38+
#else
39+
power_save_timer_ = new PowerSaveTimer(160, 60);
40+
#endif
3741
power_save_timer_->OnEnterSleepMode([this]() {
3842
ESP_LOGI(TAG, "Enabling sleep mode");
3943
auto display = GetDisplay();

main/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies:
1414
78/esp_lcd_nv3023: ~1.0.0
1515
78/esp-wifi-connect: ~2.4.2
1616
78/esp-opus-encoder: ~2.3.3
17-
78/esp-ml307: ~2.1.5
17+
78/esp-ml307: ~2.1.6
1818
78/xiaozhi-fonts: ~1.3.2
1919
espressif/led_strip: ^2.5.5
2020
espressif/esp_codec_dev: ~1.3.2

0 commit comments

Comments
 (0)