9#define IS_I2S_IMPLEMENTED
26 friend class I2SStream;
36 bool setAudioInfo(AudioInfo) {
return false;}
41 return begin(defaultConfig(mode));
45 bool begin(I2SConfigStd cfg) {
50 LOGI(
"buffer_size: %d", cfg.buffer_size);
51 LOGI(
"buffer_count: %d", cfg.buffer_count);
53 if (cfg.channels > 2 || cfg.channels <= 0) {
54 LOGE(
"Channels not supported: %d", cfg.channels);
61 this->active = result;
75 if (!active)
return 0;
76 if (
use_dma && p_rx_buffer ==
nullptr)
return 0;
77 return cfg.buffer_size;
81 int availableForWrite() {
82 if (!active)
return 0;
84 return cfg.buffer_size;
88 I2SConfigStd config() {
return cfg; }
91 size_t writeBytes(
const void *
src,
size_t size_bytes) {
95 result = i2s.write((
uint8_t *)
src, size_bytes);
111 size_t readBytes(
void *
dest,
size_t size_bytes) {
116 if (cfg.channels == 2) {
117 return p_rx_buffer->readArray((
uint8_t *)
dest, size_bytes);
129 if (self->p_dma_out !=
nullptr)
130 written = self->p_dma_out->write(buffer,
byteCount);
132 written = self->p_rx_buffer->writeArray(buffer,
byteCount);
136 LOGW(
"Buffer overflow: written %d of %d", written,
byteCount);
144 static size_t count = 0;
146 if (self->p_dma_in !=
nullptr) {
148 if (self->isWriteTimedOut()) {
153 read = self->p_dma_in->readBytes(buffer,
byteCount);
157 if (self->stm32_write_active) {
158 read = self->p_tx_buffer->readArray(buffer,
byteCount);
166 LOGW(
"Buffer underflow at %lu: %d for %d", count, read,
byteCount);
191 stm32_i2s::Stm32I2sClass i2s;
197 BaseBuffer<uint8_t> *p_rx_buffer =
nullptr;
207 int open = size_bytes;
221 LOGI(
"Buffer is full->starting i2s output");
244 switch (cfg.rx_tx_mode) {
246 result = i2s.begin(
i2s_stm32,
false,
true);
249 result = i2s.begin(
i2s_stm32,
true,
false);
253 result = i2s.begin(
i2s_stm32,
true,
true);
260 switch (cfg.rx_tx_mode) {
262 if (
use_dma && p_rx_buffer ==
nullptr)
276 if (p_rx_buffer ==
nullptr)
281 result = i2s.beginReadWriteDMA(
286 LOGE(
"Unsupported mode");
293 switch (bits_per_sample) {
305 if (p_rx_buffer !=
nullptr) {
307 p_rx_buffer =
nullptr;
316 i2s_stm32.sample_rate = getSampleRate(cfg);
323 i2s_stm32.hardware_config.buffer_size = cfg.buffer_size;
329 if (cfg.pin_bck == -1 || cfg.pin_ws == -1 || cfg.pin_data == -1) {
330 LOGW(
"pins ignored: used from stm32-i2s");
332 LOGI(
"setting up pins for stm32-i2s");
333 i2s_stm32.hardware_config.pins[0].function = stm32_i2s::mclk;
334 i2s_stm32.hardware_config.pins[0].pin = digitalPinToPinName(cfg.pin_mck);
335 i2s_stm32.hardware_config.pins[0].altFunction = cfg.pin_alt_function;
337 i2s_stm32.hardware_config.pins[1].function = stm32_i2s::bck;
338 i2s_stm32.hardware_config.pins[1].pin = digitalPinToPinName(cfg.pin_bck);
339 i2s_stm32.hardware_config.pins[1].altFunction = cfg.pin_alt_function;
341 i2s_stm32.hardware_config.pins[2].function = stm32_i2s::ws;
342 i2s_stm32.hardware_config.pins[2].pin = digitalPinToPinName(cfg.pin_ws);
343 i2s_stm32.hardware_config.pins[2].altFunction = cfg.pin_alt_function;
345 switch (cfg.rx_tx_mode) {
347 i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
348 i2s_stm32.hardware_config.pins[3].pin = digitalPinToPinName(cfg.pin_data);
349 i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
352 i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
353 i2s_stm32.hardware_config.pins[4].pin = digitalPinToPinName(cfg.pin_data);
354 i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
357 i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
358 i2s_stm32.hardware_config.pins[3].pin = digitalPinToPinName(cfg.pin_data);
359 i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
361 i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
362 i2s_stm32.hardware_config.pins[4].pin = digitalPinToPinName(cfg.pin_data);
363 i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
372 switch (cfg.rx_tx_mode) {
378 LOGE(
"RXTX_MODE not supported");
382 switch (cfg.rx_tx_mode) {
388 LOGE(
"RXTX_MODE not supported");
396 switch (cfg.i2s_format) {
410 uint32_t getSampleRate(I2SConfigStd &cfg) {
411 switch (cfg.sample_rate) {
421 return cfg.sample_rate;
423 LOGE(
"Unsupported sample rate: %u", cfg.sample_rate);
424 return cfg.sample_rate;
430 if (cfg.channels == 2) {
434 int samples = size_bytes / 2;
438 for (
int j = 0;
j < samples;
j++) {
450 LOGD(
"writeBytesExt: %u", result)
456 return new NBuffer<uint8_t>(cfg.buffer_size, cfg.buffer_count);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
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
constexpr const _Ep * end(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:63
constexpr const _Ep * begin(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:55