@@ -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
6757Es8311AudioCodec::~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+
7996void 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
135152void 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
140157void 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
160165void 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
187173int 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
194180int 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}
0 commit comments