arduino-audio-tools
AnalogConfigESP32V1.h
1 #pragma once
2 
3 #include "AudioConfig.h"
4 #if defined(USE_ANALOG) && defined(ESP32) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0 , 0) || defined(DOXYGEN)
5 
6 #include "esp_adc/adc_continuous.h"
7 #include "esp_adc/adc_cali_scheme.h"
8 #ifdef ARDUINO
9 # include "esp32-hal-periman.h"
10 #endif
11 
12 #if CONFIG_IDF_TARGET_ESP32
13 # define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
14 # define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE1
15 # define ADC_CHANNELS {ADC_CHANNEL_6, ADC_CHANNEL_7}
16 # define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type1.channel)
17 # define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type1.data)
18 # define HAS_ESP32_DAC
19 #elif CONFIG_IDF_TARGET_ESP32S2
20 # define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
21 # define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
22 # define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
23 # define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
24 # define ADC_CHANNELS {ADC_CHANNEL_2, ADC_CHANNEL_3}
25 # define HAS_ESP32_DAC
26 #elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
27 # define ADC_CONV_MODE ADC_CONV_ALTER_UNIT //ESP32C3 only supports alter mode
28 # define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
29 # define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
30 # define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
31 # define ADC_CHANNELS {ADC_CHANNEL_2, ADC_CHANNEL_3}
32 #elif CONFIG_IDF_TARGET_ESP32S3
33 # define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
34 # define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
35 # define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
36 # define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
37 # define ADC_CHANNELS {ADC_CHANNEL_2, ADC_CHANNEL_3} // or channel 4 & 5
38 #endif
39 
40 // #define GET_ADC_UNIT_FROM_CHANNEL(x) ((x >> 3) & 0x1)
41 # define ADC_UNIT ADC_UNIT_1 // continuous ADC API only supports ADC1
42 
43 #ifdef HAS_ESP32_DAC
44 # include "driver/dac_continuous.h"
45 #endif
46 
47 namespace audio_tools {
48 
58  // allow ADC to access the protected methods
59  friend class AnalogDriverESP32;
60  public:
61  int buffer_count = ANALOG_BUFFER_COUNT;
62  int buffer_size = ANALOG_BUFFER_SIZE;
63  RxTxMode rx_tx_mode;
64  TickType_t timeout = portMAX_DELAY;
65 
66 #ifdef HAS_ESP32_DAC
67  bool is_blocking_write = true;
68  bool use_apll = false;
70  dac_channel_mask_t dac_mono_channel = DAC_CHANNEL_MASK_CH0;
71 #endif
72 
73  // ADC config parameters
74  bool adc_calibration_active = false;
75  bool is_auto_center_read = false;
76  adc_digi_convert_mode_t adc_conversion_mode = ADC_CONV_MODE;
77  adc_digi_output_format_t adc_output_type = ADC_OUTPUT_TYPE;
78  uint8_t adc_attenuation = ADC_ATTEN_DB_12; // full voltage range of 3.9V
79  uint8_t adc_bit_width = SOC_ADC_DIGI_MAX_BITWIDTH;
81  adc_channel_t adc_channels[2] = ADC_CHANNELS;
82 
84  AnalogConfigESP32V1(RxTxMode rxtxMode=TX_MODE) {
85  sample_rate = 44100;
86  channels = 2;
87  bits_per_sample = 16;
88  rx_tx_mode = rxtxMode;
89  if (rx_tx_mode == RX_MODE) {
90  // make sure that the proposed sample rate is valid
91  if (sample_rate*channels>SOC_ADC_SAMPLE_FREQ_THRES_HIGH){
92  sample_rate = SOC_ADC_SAMPLE_FREQ_THRES_HIGH / channels;
93  }
94  LOGI("I2S_MODE_ADC_BUILT_IN");
95  } else {
96  LOGI("I2S_MODE_DAC_BUILT_IN");
97  }
98  }
99 
102 
103  void logInfo() {
104  AudioInfo::logInfo();
105  if (rx_tx_mode == TX_MODE){
106  LOGI("analog left output pin: %d", 25);
107  LOGI("analog right output pin: %d", 26);
108  }
109  }
110 };
111 
112 using AnalogConfig = AnalogConfigESP32V1;
113 
114 
115 } // ns
116 #endif
ESP32 specific configuration for i2s input via adc using the adc_continuous API.
Definition: AnalogConfigESP32V1.h:57
adc_channel_t adc_channels[2]
ESP32: ADC_CHANNEL_6, ADC_CHANNEL_7; others ADC_CHANNEL_2, ADC_CHANNEL_3.
Definition: AnalogConfigESP32V1.h:81
AnalogConfigESP32V1(RxTxMode rxtxMode=TX_MODE)
Default constructor.
Definition: AnalogConfigESP32V1.h:84
AnalogConfigESP32V1(const AnalogConfigESP32V1 &cfg)=default
Copy constructor.
Please use AnalogAudioStream: A very fast ADC and DAC using the ESP32 I2S interface.
Definition: AnalogAudioESP32.h:35
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition: AudioTypes.h:26
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10
Basic Audio information which drives e.g. I2S.
Definition: AudioTypes.h:50
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition: AudioTypes.h:53
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition: AudioTypes.h:55
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition: AudioTypes.h:57