5#if defined(ARDUINO_ARCH_TANGNANO20K)
8#define I2SConfig TangNanoI2SConfig
9#include <I2STangNano.h>
12#define IS_I2S_IMPLEMENTED
26class I2SDriverTangNano :
public I2SDriverBase {
27 friend class I2SStream;
31 I2SConfigStd defaultConfig(RxTxMode mode) {
37 bool setAudioInfo(AudioInfo info) {
return info.equals(cfg); }
40 bool begin(RxTxMode mode = TX_MODE) {
return begin(defaultConfig(mode)); }
43 bool begin(I2SConfigStd cfg) {
50 LOGE(
"Only master mode is supported");
53 if (cfg.i2s_format != I2S_STD_FORMAT &&
54 cfg.i2s_format != I2S_PHILIPS_FORMAT) {
55 LOGE(
"Only the I2S (Philips) format is supported");
58 if (cfg.channels < 1 || cfg.channels > 2) {
59 LOGE(
"Unsupported channels: %d", cfg.channels);
63 TangNanoI2SConfig tang_cfg;
64 tang_cfg.sampleRate = cfg.sample_rate;
65 tang_cfg.channels = cfg.channels;
66 switch (cfg.rx_tx_mode) {
68 tang_cfg.mode = I2S_MODE_OUTPUT;
71 tang_cfg.mode = I2S_MODE_INPUT;
74 tang_cfg.mode = I2S_MODE_DUPLEX;
77 switch (cfg.bits_per_sample) {
79 tang_cfg.bits = I2S_BITS_8;
82 tang_cfg.bits = I2S_BITS_16;
86 tang_cfg.bits = I2S_BITS_24;
89 tang_cfg.bits = I2S_BITS_32;
93 tang_cfg.bits = I2S_BITS_32;
96 LOGE(
"Unsupported bits_per_sample: %d", cfg.bits_per_sample);
99 if (cfg.buffer_size > 0 && cfg.buffer_count > 0) {
101 int frame_size = cfg.channels * bytesPerSample();
102 int frames = cfg.buffer_size * cfg.buffer_count / frame_size;
103 if (frames > 0xFFFF) frames = 0xFFFF;
104 tang_cfg.ringSamples = frames;
107 ::I2S.begin(tang_cfg);
119 I2SConfigStd config() {
return cfg; }
122 size_t writeBytes(
const void *src,
size_t size_bytes) {
123 return ::I2S.write((
const uint8_t *)src, size_bytes);
126 size_t readBytes(
void *dest,
size_t size_bytes) {
127 return ::I2S.readBytes((uint8_t *)dest, size_bytes);
131 int availableForWrite() {
132 return ::I2S.availableForWrite() * cfg.channels * bytesPerSample();
135 int available() { return ::I2S.available(); }
137 void flush() { ::I2S.flush(); }
141 bool is_active =
false;
144 int bytesPerSample() {
145 return cfg.bits_per_sample == 24 ?
sizeof(
int24_t)
146 : cfg.bits_per_sample / 8;
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGE(...)
Definition AudioLoggerIDF.h:30
@ 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