8#define IS_I2S_IMPLEMENTED
25 friend class I2SStream;
35 bool setAudioInfo(AudioInfo) {
return false;}
40 return begin(defaultConfig(mode));
44 bool begin(I2SConfigStd cfg) {
49 LOGI(
"buffer_size: %d", cfg.buffer_size);
50 LOGI(
"buffer_count: %d", cfg.buffer_count);
52 if (cfg.channels > 2 || cfg.channels <= 0) {
53 LOGE(
"Channels not supported: %d", cfg.channels);
60 this->active = result;
74 if (!active)
return 0;
76 return cfg.buffer_size;
80 int availableForWrite() {
81 if (!active)
return 0;
83 return cfg.buffer_size;
87 I2SConfigStd config() {
return cfg; }
90 size_t writeBytes(
const void *
src,
size_t size_bytes) {
94 result = i2s.write((
uint8_t *)
src, size_bytes);
110 size_t readBytes(
void *
dest,
size_t size_bytes) {
115 if (cfg.channels == 2) {
128 if (self->p_dma_out !=
nullptr)
129 written = self->p_dma_out->write(buffer,
byteCount);
131 written = self->p_rx_buffer->writeArray(buffer,
byteCount);
135 LOGW(
"Buffer overflow: written %d of %d", written,
byteCount);
143 static size_t count = 0;
145 if (self->p_dma_in !=
nullptr) {
147 if (self->isWriteTimedOut()) {
152 read = self->p_dma_in->readBytes(buffer,
byteCount);
156 if (self->stm32_write_active) {
157 read = self->p_tx_buffer->readArray(buffer,
byteCount);
165 LOGW(
"Buffer underflow at %lu: %d for %d", count, read,
byteCount);
190 stm32_i2s::Stm32I2sClass i2s;
206 int open = size_bytes;
220 LOGI(
"Buffer is full->starting i2s output");
243 switch (cfg.rx_tx_mode) {
245 result = i2s.begin(
i2s_stm32,
false,
true);
248 result = i2s.begin(
i2s_stm32,
true,
false);
252 result = i2s.begin(
i2s_stm32,
true,
true);
259 switch (cfg.rx_tx_mode) {
280 result = i2s.beginReadWriteDMA(
285 LOGE(
"Unsupported mode");
292 switch (bits_per_sample) {
315 i2s_stm32.sample_rate = getSampleRate(cfg);
322 i2s_stm32.hardware_config.buffer_size = cfg.buffer_size;
328 if (cfg.pin_bck == -1 || cfg.pin_ws == -1 || cfg.pin_data == -1) {
329 LOGW(
"pins ignored: used from stm32-i2s");
331 LOGI(
"setting up pins for stm32-i2s");
332 i2s_stm32.hardware_config.pins[0].function = stm32_i2s::mclk;
334 i2s_stm32.hardware_config.pins[0].altFunction = cfg.pin_alt_function;
336 i2s_stm32.hardware_config.pins[1].function = stm32_i2s::bck;
338 i2s_stm32.hardware_config.pins[1].altFunction = cfg.pin_alt_function;
340 i2s_stm32.hardware_config.pins[2].function = stm32_i2s::ws;
342 i2s_stm32.hardware_config.pins[2].altFunction = cfg.pin_alt_function;
344 switch (cfg.rx_tx_mode) {
346 i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
348 i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
351 i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
353 i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
356 i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
358 i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
360 i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
362 i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
371 switch (cfg.rx_tx_mode) {
377 LOGE(
"RXTX_MODE not supported");
381 switch (cfg.rx_tx_mode) {
387 LOGE(
"RXTX_MODE not supported");
395 switch (cfg.i2s_format) {
409 uint32_t getSampleRate(I2SConfigStd &cfg) {
410 switch (cfg.sample_rate) {
420 return cfg.sample_rate;
422 LOGE(
"Unsupported sample rate: %u", cfg.sample_rate);
423 return cfg.sample_rate;
429 if (cfg.channels == 2) {
433 int samples = size_bytes / 2;
437 for (
int j = 0;
j < samples;
j++) {
449 LOGD(
"writeBytesExt: %u", result)
455 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:30
@ RXTX_MODE
Definition AudioTypes.h:30
@ TX_MODE
Definition AudioTypes.h:30
@ RX_MODE
Definition AudioTypes.h:30
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