Skip to content

Commit 7f671c6

Browse files
committed
uninstall_driver_on_end
1 parent 5635d07 commit 7f671c6

File tree

1 file changed

+91
-63
lines changed

1 file changed

+91
-63
lines changed

src/AudioAnalog/AnalogAudioESP32.h

Lines changed: 91 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class AnalogConfig : public AudioBaseInfo {
4444
int mode_internal;
4545
int port_no = I2S_NUM_0; // Analog input and output only supports 0!
4646
bool use_apll = false;
47+
bool uninstall_driver_on_end = true;
4748

4849
AnalogConfig() {
4950
sample_rate = 44100;
@@ -185,81 +186,97 @@ class AnalogAudioStream : public AudioStreamX {
185186
}
186187
}
187188

189+
/// Reopen with last config
190+
bool begin() override {
191+
return begin(adc_config);
192+
}
193+
188194
/// starts the DAC
189195
bool begin(AnalogConfig cfg) {
190196
LOGI(LOG_METHOD);
191197
cfg.logInfo();
192-
port_no = (i2s_port_t) cfg.port_no;
193-
194-
adc_config = cfg;
195-
i2s_config_t i2s_config = {
196-
.mode = (i2s_mode_t)cfg.mode_internal,
197-
.sample_rate = cfg.sample_rate,
198-
.bits_per_sample = (i2s_bits_per_sample_t)cfg.bits_per_sample,
199-
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
200-
.communication_format = I2S_COMM_FORMAT_I2S_MSB,
201-
.intr_alloc_flags = 0,
202-
.dma_buf_count = cfg.dma_buf_count,
203-
.dma_buf_len = cfg.dma_buf_len,
204-
.use_apll = cfg.use_apll,
205-
.tx_desc_auto_clear = false
206-
// // .fixed_mclk = 0
207-
};
208-
209-
210-
// setup config
211-
if (i2s_driver_install(port_no, &i2s_config, 0, nullptr)!=ESP_OK){
212-
LOGE( "%s - %s", __func__, "i2s_driver_install");
213-
return false;
214-
}
215-
216-
// clear i2s buffer
217-
if (i2s_zero_dma_buffer(port_no)!=ESP_OK) {
218-
LOGE( "%s - %s", __func__, "i2s_zero_dma_buffer");
219-
return false;
220-
}
221198

222-
switch (cfg.mode) {
223-
case RX_MODE:
224-
LOGI("RX_MODE");
199+
if (!is_driver_installed){
200+
port_no = (i2s_port_t) cfg.port_no;
201+
202+
adc_config = cfg;
203+
i2s_config_t i2s_config = {
204+
.mode = (i2s_mode_t)cfg.mode_internal,
205+
.sample_rate = cfg.sample_rate,
206+
.bits_per_sample = (i2s_bits_per_sample_t)cfg.bits_per_sample,
207+
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
208+
.communication_format = I2S_COMM_FORMAT_I2S_MSB,
209+
.intr_alloc_flags = 0,
210+
.dma_buf_count = cfg.dma_buf_count,
211+
.dma_buf_len = cfg.dma_buf_len,
212+
.use_apll = cfg.use_apll,
213+
.tx_desc_auto_clear = false
214+
// // .fixed_mclk = 0
215+
};
216+
217+
218+
// setup config
219+
if (i2s_driver_install(port_no, &i2s_config, 0, nullptr)!=ESP_OK){
220+
LOGE( "%s - %s", __func__, "i2s_driver_install");
221+
return false;
222+
}
225223

226-
if (i2s_set_adc_mode(cfg.adc_unit[0], cfg.adc_channel[0])!=ESP_OK) {
227-
LOGE( "%s - %s", __func__, "i2s_driver_install");
228-
return false;
229-
}
224+
// record driver as installed
225+
is_driver_installed = true;
230226

231-
if (cfg.channels>1){
232-
if (i2s_set_adc_mode(cfg.adc_unit[1], cfg.adc_channel[1])!=ESP_OK) {
227+
// clear i2s buffer
228+
if (i2s_zero_dma_buffer(port_no)!=ESP_OK) {
229+
LOGE( "%s - %s", __func__, "i2s_zero_dma_buffer");
230+
return false;
231+
}
232+
233+
switch (cfg.mode) {
234+
case RX_MODE:
235+
LOGI("RX_MODE");
236+
237+
if (i2s_set_adc_mode(cfg.adc_unit[0], cfg.adc_channel[0])!=ESP_OK) {
233238
LOGE( "%s - %s", __func__, "i2s_driver_install");
234239
return false;
235240
}
236-
}
237241

238-
// enable the ADC
239-
if (i2s_adc_enable(port_no)!=ESP_OK) {
240-
LOGE( "%s - %s", __func__, "i2s_adc_enable");
241-
return false;
242-
}
243-
244-
// if (adc1_config_channel_atten(ADC1_CHANNEL_6,ADC_ATTEN_DB_11)!=ESP_OK){
245-
// LOGE( "%s - %s", __func__, "adc1_config_channel_atten");
246-
// }
247-
// if (adc1_config_channel_atten(ADC1_CHANNEL_7,ADC_ATTEN_DB_11)!=ESP_OK){
248-
// LOGE( "%s - %s", __func__, "adc1_config_channel_atten");
249-
// }
250-
break;
242+
if (cfg.channels>1){
243+
if (i2s_set_adc_mode(cfg.adc_unit[1], cfg.adc_channel[1])!=ESP_OK) {
244+
LOGE( "%s - %s", __func__, "i2s_driver_install");
245+
return false;
246+
}
247+
}
251248

252-
case TX_MODE:
253-
LOGI("TX_MODE");
254-
if(i2s_set_pin(port_no, nullptr)!=ESP_OK) LOGE("i2s_set_pin");
255-
if (i2s_set_dac_mode( I2S_DAC_CHANNEL_BOTH_EN )!= ESP_OK) LOGE("i2s_set_dac_mode");
256-
break;
249+
// enable the ADC
250+
if (i2s_adc_enable(port_no)!=ESP_OK) {
251+
LOGE( "%s - %s", __func__, "i2s_adc_enable");
252+
return false;
253+
}
257254

258-
default:
259-
LOGE( "Unsupported MODE: %d", cfg.mode);
260-
return false;
261-
break;
255+
// if (adc1_config_channel_atten(ADC1_CHANNEL_6,ADC_ATTEN_DB_11)!=ESP_OK){
256+
// LOGE( "%s - %s", __func__, "adc1_config_channel_atten");
257+
// }
258+
// if (adc1_config_channel_atten(ADC1_CHANNEL_7,ADC_ATTEN_DB_11)!=ESP_OK){
259+
// LOGE( "%s - %s", __func__, "adc1_config_channel_atten");
260+
// }
261+
break;
262+
263+
case TX_MODE:
264+
LOGI("TX_MODE");
265+
if (i2s_set_pin(port_no, nullptr) != ESP_OK) LOGE("i2s_set_pin");
266+
if (i2s_set_dac_mode( I2S_DAC_CHANNEL_BOTH_EN) != ESP_OK) LOGE("i2s_set_dac_mode");
267+
break;
262268

269+
default:
270+
LOGE( "Unsupported MODE: %d", cfg.mode);
271+
return false;
272+
break;
273+
274+
}
275+
} else {
276+
i2s_start(port_no);
277+
if (adc_config.mode == RX_MODE){
278+
i2s_adc_enable(port_no);
279+
}
263280
}
264281
active = true;
265282
return true;
@@ -268,8 +285,18 @@ class AnalogAudioStream : public AudioStreamX {
268285
/// stops the I2C and unistalls the driver
269286
void end() override {
270287
LOGI(__func__);
271-
i2s_adc_disable(port_no);
272-
i2s_driver_uninstall(port_no);
288+
i2s_zero_dma_buffer(port_no);
289+
290+
// close ADC
291+
if (adc_config.mode == RX_MODE){
292+
i2s_adc_disable(port_no);
293+
}
294+
if (adc_config.uninstall_driver_on_end){
295+
i2s_driver_uninstall(port_no);
296+
is_driver_installed = false;
297+
} else {
298+
i2s_stop(port_no);
299+
}
273300
active = false;
274301
}
275302

@@ -327,6 +354,7 @@ class AnalogAudioStream : public AudioStreamX {
327354
AnalogConfig adc_config;
328355
i2s_port_t port_no;
329356
bool active = false;
357+
bool is_driver_installed = false;
330358
size_t result=0;
331359

332360

0 commit comments

Comments
 (0)