4#if defined(ESP32) && USE_LEGACY_I2S || defined(DOXYGEN)
10#include "driver/i2s.h"
11#include "esp_system.h"
13#ifndef I2S_MCLK_MULTIPLE_DEFAULT
14# define I2S_MCLK_MULTIPLE_DEFAULT ((i2s_mclk_multiple_t)0)
17#define IS_I2S_IMPLEMENTED
73 cfg, I2S_PIN_NO_CHANGE,
78 LOGE(
"Did not expect go get here");
104 LOGD(
"i2s_zero_dma_buffer");
122 LOGD(
"i2s_write %d -> %d bytes", size_bytes, result);
139 uint8_t temp[size_bytes * 2];
140 if (i2s_read(
i2s_num, temp, size_bytes * 2, &result,
148 result = reducer16.
convert((uint8_t *)dest, temp, result);
152 result = reducer24.
convert((uint8_t *)dest, temp, result);
156 result = reducer32.
convert((uint8_t *)dest, temp, result);
204 i2s_config_t i2s_config_new = {
210 .intr_alloc_flags = 0,
215#
if ESP_IDF_VERSION_MAJOR >= 4
218 .bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT,
226 LOGD(
"%s",
"I2S restarting");
230 LOGD(
"i2s_driver_install");
232 LOGE(
"%s - %s", __func__,
"i2s_driver_install");
237 i2s_pin_config_t pin_config = {
238#if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 4, 0)
243 .data_out_num = txPin,
244 .data_in_num = rxPin};
247 if (i2s_set_pin(
i2s_num, &pin_config) != ESP_OK) {
248 LOGE(
"%s - %s", __func__,
"i2s_set_pin");
251 LOGD(
"Using built in DAC");
257 LOGD(
"i2s_zero_dma_buffer");
261 LOGD(
"%s - %s", __func__,
"started");
270 const void *src,
size_t size_bytes) {
273 switch (bits_per_sample) {
275 for (j = 0; j < size_bytes; j++) {
277 int8_t *data = (int8_t *)src;
280 size_t result_call = 0;
281 if (i2s_write(
i2s_num, frame,
sizeof(int8_t) * 2, &result_call,
285 result += result_call;
291 for (j = 0; j < size_bytes / 2; j++) {
293 int16_t *data = (int16_t *)src;
296 size_t result_call = 0;
297 if (i2s_write(
i2s_num, frame,
sizeof(int16_t) * 2, &result_call,
301 result += result_call;
307 for (j = 0; j < size_bytes / 4; j++) {
312 size_t result_call = 0;
317 result += result_call;
323 for (j = 0; j < size_bytes / 4; j++) {
325 int32_t *data = (int32_t *)src;
328 size_t result_call = 0;
329 if (i2s_write(
i2s_num, frame,
sizeof(int32_t) * 2, &result_call,
333 result += result_call;
341#pragma GCC diagnostic push
342#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
350 return (i2s_comm_format_t)I2S_COMM_FORMAT_STAND_I2S;
353 return (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S |
354 I2S_COMM_FORMAT_I2S_MSB);
357 return (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S |
358 I2S_COMM_FORMAT_I2S_LSB);
360 return (i2s_comm_format_t)I2S_COMM_FORMAT_STAND_PCM_SHORT;
363 LOGE(
"unsupported mode");
364 return (i2s_comm_format_t)I2S_COMM_FORMAT_STAND_I2S;
367#pragma GCC diagnostic pop
370 int i2s_format =
cfg.
is_master ? I2S_MODE_MASTER : I2S_MODE_SLAVE;
374 i2s_rx_tx = I2S_MODE_TX;
377 i2s_rx_tx = I2S_MODE_RX;
380 i2s_rx_tx = I2S_MODE_RX | I2S_MODE_TX;
385 return (i2s_format | i2s_rx_tx);
390 i2s_mode_t mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX);
401#if defined(USE_ANALOG)
403 : I2S_MODE_ADC_BUILT_IN);
405 LOGE(
"mode not supported");
410 LOGW(
"signal_type undefined");
411 mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define TRACEE()
Definition AudioLoggerIDF.h:34
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define portMAX_DELAY
Definition BufferBlocking.h:14
#define pdMS_TO_TICKS(ms)
Definition BufferBlocking.h:17
uint32_t TickType_t
Definition BufferBlocking.h:11
#define I2S_MCLK_MULTIPLE_DEFAULT
Definition I2SDriverESP32.h:14
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
@ RXTX_MODE
Definition AudioTypes.h:26
@ TX_MODE
Definition AudioTypes.h:26
@ RX_MODE
Definition AudioTypes.h:26