arduino-audio-tools
I2SStream.h
1 
2 
3 #pragma once
4 #include "AudioConfig.h"
5 
6 #if defined(USE_I2S)
7 
8 #include "AudioI2S/I2SConfig.h"
9 #include "AudioI2S/I2SESP32.h"
10 #include "AudioI2S/I2SESP32V1.h"
11 #include "AudioI2S/I2SESP8266.h"
12 #include "AudioI2S/I2SNanoSenseBLE.h"
13 #include "AudioI2S/I2SRP2040-MBED.h"
14 #include "AudioI2S/I2SRP2040.h"
15 #include "AudioI2S/I2SSAMD.h"
16 #include "AudioI2S/I2SSTM32.h"
17 #include "AudioTools/AudioStreams.h"
18 #include "AudioTools/AudioTypes.h"
19 
20 namespace audio_tools {
21 
31 class I2SStream : public AudioStream {
32  public:
33  I2SStream() = default;
34 
35 #ifdef ARDUINO
36  I2SStream(int mute_pin) {
37  TRACED();
38  this->mute_pin = mute_pin;
39  if (mute_pin > 0) {
40  pinMode(mute_pin, OUTPUT);
41  mute(true);
42  }
43  }
44 #endif
45 
47  I2SConfig defaultConfig(RxTxMode mode = TX_MODE) {
48  return i2s.defaultConfig(mode);
49  }
50 
51  bool begin() {
52  TRACED();
53  I2SConfig cfg = i2s.config();
54  cfg.copyFrom(audioInfo());
55  if (cfg.rx_tx_mode == UNDEFINED_MODE){
56  cfg.rx_tx_mode = RXTX_MODE;
57  }
58  is_active = i2s.begin(cfg);
59  mute(false);
60  return is_active;
61  }
62 
64  bool begin(I2SConfig cfg) {
65  TRACED();
67  is_active = i2s.begin(cfg);
68  // unmute
69  mute(false);
70  return is_active;
71  }
72 
74  void end() {
75  TRACED();
76  mute(true);
77  i2s.end();
78  is_active = false;
79  }
80 
82  virtual void setAudioInfo(AudioInfo info) {
83  TRACEI();
84  assert(info.sample_rate != 0);
85  assert(info.channels != 0);
86  assert(info.bits_per_sample != 0);
88  if (is_active) {
89  if (!i2s.setAudioInfo(info)) {
90  I2SConfig current_cfg = i2s.config();
91  if (!info.equals(current_cfg)) {
92  LOGI("restarting i2s");
93  info.logInfo("I2SStream");
94  i2s.end();
95  current_cfg.copyFrom(info);
96  i2s.begin(current_cfg);
97  } else {
98  LOGI("no change");
99  }
100  }
101  }
102  }
103 
105  virtual size_t write(const uint8_t *buffer, size_t size) {
106  LOGD("I2SStream::write: %d", size);
107  return i2s.writeBytes(buffer, size);
108  }
109 
111  virtual size_t readBytes(uint8_t *data, size_t length) override {
112  return i2s.readBytes(data, length);
113  }
114 
116  virtual int available() override { return i2s.available(); }
117 
119  virtual int availableForWrite() override { return i2s.availableForWrite(); }
120 
121  void flush() override {}
122 
124  I2SDriver *driver() { return &i2s; }
125 
126  protected:
127  I2SDriver i2s;
128  int mute_pin;
129  bool is_active = false;
130 
132  void mute(bool is_mute) {
133 #ifdef ARDUINO
134  if (mute_pin > 0) {
135  digitalWrite(mute_pin, is_mute ? SOFT_MUTE_VALUE : !SOFT_MUTE_VALUE);
136  }
137 #endif
138  }
139 };
140 
141 } // namespace audio_tools
142 
143 #endif
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition: AudioStreams.h:24
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition: AudioStreams.h:32
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition: AudioStreams.h:55
Configuration for ESP32 legacy i2s.
Definition: I2SConfigESP32.h:23
RxTxMode rx_tx_mode
public settings
Definition: I2SConfigESP32.h:59
Basic I2S API - for the ESP32. If we receive 1 channel, we expand the result to 2 channels.
Definition: I2SESP32.h:25
int available()
we assume the data is already available in the buffer
Definition: I2SESP32.h:79
bool setAudioInfo(AudioInfo info)
Potentially updates the sample rate (if supported)
Definition: I2SESP32.h:37
int availableForWrite()
We limit the write size to the buffer size.
Definition: I2SESP32.h:82
I2SConfigESP32 config()
provides the actual configuration
Definition: I2SESP32.h:92
void end()
stops the I2C and unistalls the driver
Definition: I2SESP32.h:85
bool begin(RxTxMode mode)
starts the DAC with the default config
Definition: I2SESP32.h:53
I2SConfigESP32 defaultConfig(RxTxMode mode)
Provides the default configuration.
Definition: I2SESP32.h:31
size_t writeBytes(const void *src, size_t size_bytes)
writes the data to the I2S interface
Definition: I2SESP32.h:95
We support the Stream interface for the I2S access. In addition we allow a separate mute pin which mi...
Definition: I2SStream.h:31
virtual size_t readBytes(uint8_t *data, size_t length) override
Reads the audio data.
Definition: I2SStream.h:111
virtual size_t write(const uint8_t *buffer, size_t size)
Writes the audio data to I2S.
Definition: I2SStream.h:105
void mute(bool is_mute)
set mute pin on or off
Definition: I2SStream.h:132
I2SDriver * driver()
Provides access to the driver.
Definition: I2SStream.h:124
virtual int availableForWrite() override
Provides the available audio data.
Definition: I2SStream.h:119
I2SConfig defaultConfig(RxTxMode mode=TX_MODE)
Provides the default configuration.
Definition: I2SStream.h:47
virtual void setAudioInfo(AudioInfo info)
updates the sample rate dynamically
Definition: I2SStream.h:82
void end()
Stops the I2S interface.
Definition: I2SStream.h:74
bool begin(I2SConfig cfg)
Starts the I2S interface.
Definition: I2SStream.h:64
virtual int available() override
Provides the available audio data.
Definition: I2SStream.h:116
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition: AudioTypes.h:26
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10
Basic Audio information which drives e.g. I2S.
Definition: AudioTypes.h:50
void copyFrom(AudioInfo info)
Same as set.
Definition: AudioTypes.h:105
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition: AudioTypes.h:53
bool equals(AudioInfo alt)
Returns true if alt values are the same like the current values.
Definition: AudioTypes.h:83
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition: AudioTypes.h:55
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition: AudioTypes.h:57