199 size_t write(
const uint8_t *src,
size_t size_bytes)
override {
204 int16_t *data16 = (int16_t *)src;
205 uint8_t *data8 = (uint8_t *)src;
206 int samples = size_bytes / 2;
209 for (
int j = 0; j < samples; j++) {
210 data8[j] = (32768u + data16[j]) >> 8;
213 if (dac_continuous_write(self->dac_handle, data8, samples, &result, self->cfg.timeout) != ESP_OK) {
242 size_t readBytes(uint8_t *dest,
size_t size_bytes) {
245 size_t total_bytes = 0;
246 size_t bytes_provided = 0;
247 int min_samples_in_fifo_per_channel = 0;
248 int max_samples_in_fifo_per_channel = 0;
252 int samples_provided_per_channel = 0;
253 int data_milliVolts = 0;
255 int samples_requested = size_bytes /
sizeof(int16_t);
256 int samples_requested_per_channel = samples_requested/self->cfg.
channels;
258 adc_digi_output_data_t* result_data = (adc_digi_output_data_t*)malloc(samples_requested *
sizeof(adc_digi_output_data_t));
259 if (result_data == NULL) {
260 LOGE(
"Failed to allocate memory for result_data");
263 memset(result_data, 0, samples_requested *
sizeof(adc_digi_output_data_t));
267 uint16_t *result16 = (uint16_t *)dest;
268 uint16_t *
end = (uint16_t *)(dest + size_bytes);
272 if (adc_continuous_read(self->adc_handle, (uint8_t *)result_data, (uint32_t)(samples_requested *
sizeof(adc_digi_output_data_t)), &bytes_read, (uint32_t)self->cfg.timeout) == ESP_OK) {
273 samples_read = bytes_read /
sizeof(adc_digi_output_data_t);
274 LOGD(
"adc_continuous_read -> %u bytes / %d samples of %d bytes requested", (
unsigned)bytes_read, samples_read, (
int)(samples_requested *
sizeof(adc_digi_output_data_t)));
277 for (
int i = 0; i < samples_read; i++) {
278 adc_digi_output_data_t *p = &result_data[i];
279 ADC_CHANNEL_TYPE chan_num = AUDIO_ADC_GET_CHANNEL(p);
280 ADC_DATA_TYPE data = AUDIO_ADC_GET_DATA(p);
284 for (
int j = 0; j < self->cfg.
channels; ++j) {
285 if (self->cfg.adc_channels[j] == chan_num) {
292 if (self->fifo_buffers[idx]->push(data)) {
293 LOGD(
"Sample %d, FIFO %d, ch %u, d %u", i, idx, (
unsigned)chan_num, (
unsigned)data);
295 LOGE(
"Sample %d, FIFO buffer is full, ch %u, d %u", i, (
unsigned)chan_num, (
unsigned)data);
298 LOGE(
"Sample %d, ch %u not found in configuration, d: %u", i, (
unsigned)chan_num, (
unsigned)data);
299 for (
int k = 0; k < self->cfg.
channels; ++k) {
300 LOGE(
"Available config ch: %u", self->cfg.adc_channels[k]);
307 min_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
308 for (
int i = 1; i < self->cfg.
channels; i++) {
309 fifo_size = self->fifo_buffers[i]->size();
310 if (fifo_size < min_samples_in_fifo_per_channel) {
311 min_samples_in_fifo_per_channel = fifo_size;
316 while (samples_requested_per_channel > min_samples_in_fifo_per_channel) {
320 if (adc_continuous_read(self->adc_handle, (uint8_t *)result_data, (uint32_t)(2*self->cfg.
channels *
sizeof(adc_digi_output_data_t)), &bytes_read, (uint32_t)self->cfg.timeout) != ESP_OK) {
321 LOGE(
"Top off, adc_continuous_read unsuccessful");
326 samples_read = bytes_read /
sizeof(adc_digi_output_data_t);
327 LOGD(
"Top Off: Requested %d samples per Channel, Min samples in FIFO: %d, Read additional %d bytes / %d samples", samples_requested_per_channel, min_samples_in_fifo_per_channel, (
unsigned)bytes_read, samples_read);
329 for (
int i = 0; i < samples_read; i++) {
330 adc_digi_output_data_t *p = &result_data[i];
331 ADC_CHANNEL_TYPE chan_num = AUDIO_ADC_GET_CHANNEL(p);
332 ADC_DATA_TYPE data = AUDIO_ADC_GET_DATA(p);
336 for (
int j = 0; j < self->cfg.
channels; ++j) {
337 if (self->cfg.adc_channels[j] == chan_num) {
344 if (self->fifo_buffers[idx]->push(data)) {
345 LOGD(
"Top Off Sample %d, FIFO %d, ch %u, d %u", i, idx, (
unsigned)chan_num, (
unsigned)data);
347 LOGE(
"Top Off Sample %d, FIFO buffer is full, ch %u, d %u", i, (
unsigned)chan_num, (
unsigned)data);
350 LOGE(
"Top Off Sample %d, ch %u not found in configuration, d %u", i, (
unsigned)chan_num, (
unsigned)data);
351 for (
int k = 0; k < self->cfg.
channels; ++k) {
352 LOGE(
"Available config ch: %u", self->cfg.adc_channels[k]);
358 min_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
359 max_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
360 for (
int i = 1; i < self->cfg.
channels; i++) {
361 fifo_size = self->fifo_buffers[i]->size();
362 if (fifo_size < min_samples_in_fifo_per_channel) {
363 min_samples_in_fifo_per_channel = fifo_size;
365 if (fifo_size > max_samples_in_fifo_per_channel) {
366 max_samples_in_fifo_per_channel = fifo_size;
369 LOGD(
"Min # of samples in FIFO: %d, Max # of samples in FIFO: %d", min_samples_in_fifo_per_channel, max_samples_in_fifo_per_channel);
373 if (samples_requested_per_channel <= min_samples_in_fifo_per_channel) {
374 LOGD(
"Going to copying %d samples of %d samples/channel to output buffer", samples_requested, samples_requested_per_channel);
375 samples_provided_per_channel = samples_requested_per_channel;
378 LOGE(
"Only %d samples per channel available for output buffer", min_samples_in_fifo_per_channel);
379 samples_provided_per_channel = min_samples_in_fifo_per_channel;
382 for (
int i = 0; i < samples_provided_per_channel; i++) {
383 for (
int j = 0; j < self->cfg.
channels; j++) {
385 self->fifo_buffers[j]->pop(data);
386 if (result16 <
end) {
387 if (self->cfg.adc_calibration_active) {
389 auto err = adc_cali_raw_to_voltage(self->adc_cali_handle, (
int)data, &data_milliVolts);
391 *result16 =
static_cast<int16_t
>(data_milliVolts);
393 LOGE(
"adc_cali_raw_to_voltage error: %d", err);
401 LOGE(
"Buffer write overflow, skipping data");
406 bytes_provided = samples_provided_per_channel * self->cfg.
channels *
sizeof(int16_t);
409 if (self->cfg.is_auto_center_read) {
410 self->auto_center.convert(dest, bytes_provided);
414 LOGE(
"adc_continuous_read unsuccessful");
418 return bytes_provided;
752 if (!cfg.adc_calibration_active)
759 esp_err_t err = ESP_OK;
761 if (adc_cali_handle == NULL) {
762 #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
764 adc_cali_curve_fitting_config_t cali_config;
765 cali_config.unit_id = cfg.adc_unit;
766 cali_config.atten = (adc_atten_t)cfg.adc_attenuation;
767 cali_config.bitwidth = (adc_bitwidth_t)cfg.adc_bit_width;
768 err = adc_cali_create_scheme_curve_fitting(&cali_config, &adc_cali_handle);
769 #elif !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)
771 adc_cali_line_fitting_config_t cali_config;
772 cali_config.unit_id = cfg.adc_unit;
773 cali_config.atten = (adc_atten_t)cfg.adc_attenuation;
774 cali_config.bitwidth = (adc_bitwidth_t)cfg.adc_bit_width;
775 err = adc_cali_create_scheme_line_fitting(&cali_config, &adc_cali_handle);
778 LOGE(
"creating calibration handle failed for ADC%d with atten %d and bitwidth %d",
779 cfg.adc_unit, cfg.adc_attenuation, cfg.adc_bit_width);
782 LOGI(
"enabled calibration for ADC%d with atten %d and bitwidth %d",
783 cfg.adc_unit, cfg.adc_attenuation, cfg.adc_bit_width);