arduino-audio-tools
AudioCodecsBase.h
1 #pragma once
2 
3 #include "AudioConfig.h"
4 #include "AudioLogger.h"
5 #include "AudioTools/CoreAudio/AudioTypes.h"
6 #include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
7 
8 namespace audio_tools {
9 
16 class AudioDecoder : public AudioWriter, public AudioInfoSource {
17  public:
18  AudioDecoder() = default;
19  virtual ~AudioDecoder() = default;
20  AudioDecoder(AudioDecoder const &) = delete;
21  AudioDecoder &operator=(AudioDecoder const &) = delete;
22 
23  virtual AudioInfo audioInfo() { return info; };
24 
26  virtual void setAudioInfo(AudioInfo from) override {
27  TRACED();
28  if (info != from) {
29  notifyAudioChange(from);
30  }
31  info = from;
32  }
34  virtual void setOutput(AudioStream &out_stream) {
35  Print *p_print = &out_stream;
36  setOutput(*p_print);
37  addNotifyAudioChange(out_stream);
38  }
39 
41  virtual void setOutput(AudioOutput &out_stream) {
42  Print *p_print = &out_stream;
43  setOutput(*p_print);
44  addNotifyAudioChange(out_stream);
45  }
46 
48  virtual void setOutput(Print &out_stream) override { p_print = &out_stream; }
49 
51  virtual bool isResultPCM() {
52  return true;
53  }
54  virtual bool begin(AudioInfo info) override {
55  setAudioInfo(info);
56  return begin();
57  }
58  bool begin() override { return true; }
59  void end() override {}
60 
62  int id;
63 
64  protected:
65  Print *p_print = nullptr;
66  AudioInfo info;
67 };
68 
77  bool isResultPCM() override { return true; }
78 };
79 
86 class AudioEncoder : public AudioWriter {
87  public:
88  AudioEncoder() = default;
89  virtual ~AudioEncoder() = default;
90  AudioEncoder(AudioEncoder const &) = delete;
91  AudioEncoder &operator=(AudioEncoder const &) = delete;
93  virtual const char *mime() = 0;
95  void setAudioInfo(AudioInfo from) override { info = from; }
96  AudioInfo audioInfo() { return info; }
97 
98  protected:
99  AudioInfo info;
100 };
101 
103  public:
104  virtual void setBlockSize(int blockSize) = 0;
105 };
106 
108  public:
109  virtual int blockSize() = 0;
110 };
111 
120 class CodecNOP : public AudioDecoder, public AudioEncoder {
121  public:
122  static CodecNOP *instance() {
123  static CodecNOP self;
124  return &self;
125  }
126 
127  virtual bool begin() { return true; }
128  virtual void end() {}
129  virtual void setOutput(Print &out_stream) {}
131  virtual void setAudioInfo(AudioInfo info) {}
132 
133  virtual AudioInfo audioInfo() {
134  AudioInfo info;
135  return info;
136  }
137  virtual operator bool() { return false; }
138  virtual int readStream(Stream &in) { return 0; };
139 
140  // just output silence
141  virtual size_t write(const uint8_t *data, size_t len) {
142  memset((void *)data, 0, len);
143  return len;
144  }
145 
146  virtual const char *mime() { return nullptr; }
147 };
148 
157  public:
159  virtual bool begin() = 0;
160 
162  virtual void end() = 0;
163 
165  virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
166 
168  virtual void setOutput(AudioStream &out_stream) {
169  Print *p_print = &out_stream;
170  setOutput(*p_print);
171  addNotifyAudioChange(out_stream);
172  }
173 
175  virtual void setOutput(AudioOutput &out_stream) {
176  Print *p_print = &out_stream;
177  setOutput(*p_print);
178  addNotifyAudioChange(out_stream);
179  }
180 
184  void setInput(Stream &inStream) { this->p_input = &inStream; }
185 
187  virtual AudioInfo audioInfo() = 0;
188 
190  virtual operator bool() = 0;
191 
193  virtual bool copy() = 0;
194 
195  protected:
196  virtual size_t readBytes(uint8_t *data, size_t len) = 0;
197  Print *p_print = nullptr;
198  Stream *p_input = nullptr;
199 };
200 
208  public:
210  int copySize = DEFAULT_BUFFER_SIZE) {
211  p_decoder = &decoder;
212  if (copySize > 0) resize(copySize);
213  }
215  bool begin() override { return p_input != nullptr && p_decoder->begin(); }
216 
218  void end() override { p_decoder->end(); }
219 
221  void setOutput(Print &out_stream) override {
222  p_decoder->setOutput(out_stream);
223  }
224 
226  AudioInfo audioInfo() override { return p_decoder->audioInfo(); }
227 
229  virtual operator bool() { return *p_decoder; }
230 
232  virtual bool copy() {
233  int read = readBytes(&buffer[0], buffer.size());
234  int written = 0;
235  if (read > 0) written = p_decoder->write(&buffer[0], read);
236  return written > 0;
237  }
238 
240  void resize(int bufferSize) { buffer.resize(bufferSize); }
241 
242  protected:
243  AudioDecoder *p_decoder = nullptr;
244  Vector<uint8_t> buffer{0};
245 
246  size_t readBytes(uint8_t *data, size_t len) override {
247  if (p_input == nullptr) return 0;
248  return p_input->readBytes(data, len);
249  }
250 };
251 
252 
253 }
Definition: AudioCodecsBase.h:102
Docoding of encoded audio into PCM data.
Definition: AudioCodecsBase.h:16
virtual bool isResultPCM()
Returns true to indicate that the decoding result is PCM data.
Definition: AudioCodecsBase.h:51
int id
custom id to be used by application
Definition: AudioCodecsBase.h:62
virtual void setOutput(AudioStream &out_stream)
Defines where the decoded result is written to.
Definition: AudioCodecsBase.h:34
virtual void setOutput(Print &out_stream) override
Defines where the decoded result is written to.
Definition: AudioCodecsBase.h:48
virtual void setAudioInfo(AudioInfo from) override
for most decoders this is not needed
Definition: AudioCodecsBase.h:26
virtual void setOutput(AudioOutput &out_stream)
Defines where the decoded result is written to.
Definition: AudioCodecsBase.h:41
virtual AudioInfo audioInfo()
provides the actual input AudioInfo
Definition: AudioCodecsBase.h:23
Definition: AudioCodecsBase.h:107
Encoding of PCM data.
Definition: AudioCodecsBase.h:86
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition: AudioCodecsBase.h:95
AudioInfo audioInfo()
provides the actual input AudioInfo
Definition: AudioCodecsBase.h:96
virtual const char * mime()=0
Provides the mime type of the encoded result.
Supports the subscription to audio change notifications.
Definition: AudioTypes.h:157
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition: AudioTypes.h:160
Supports changes to the sampling rate, bits and channels.
Definition: AudioTypes.h:137
Abstract Audio Ouptut class.
Definition: AudioOutput.h:22
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition: BaseStream.h:109
E.g. used by Encoders and Decoders.
Definition: AudioTypes.h:222
Dummy no implmentation Codec. This is used so that we can initialize some pointers to decoders and en...
Definition: AudioCodecsBase.h:120
virtual void setOutput(Print &out_stream)
Defines where the decoded result is written to.
Definition: AudioCodecsBase.h:129
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition: AudioCodecsBase.h:130
virtual void setAudioInfo(AudioInfo info)
for most decoders this is not needed
Definition: AudioCodecsBase.h:131
virtual AudioInfo audioInfo()
provides the actual input AudioInfo
Definition: AudioCodecsBase.h:133
virtual const char * mime()
Provides the mime type of the encoded result.
Definition: AudioCodecsBase.h:146
Parent class for all container formats.
Definition: AudioCodecsBase.h:76
Definition: NoArduino.h:58
Definition: NoArduino.h:125
Converts any AudioDecoder to a StreamingDecoder.
Definition: AudioCodecsBase.h:207
void setOutput(Print &out_stream) override
Defines the output Stream.
Definition: AudioCodecsBase.h:221
virtual bool copy()
Process a single read operation - to be called in the loop.
Definition: AudioCodecsBase.h:232
void end() override
Releases the reserved memory.
Definition: AudioCodecsBase.h:218
void resize(int bufferSize)
Adjust the buffer size: the existing content of the buffer is lost!
Definition: AudioCodecsBase.h:240
bool begin() override
Starts the processing.
Definition: AudioCodecsBase.h:215
AudioInfo audioInfo() override
Provides the last available MP3FrameInfo.
Definition: AudioCodecsBase.h:226
A Streaming Decoder where we provide both the input and output as streams.
Definition: AudioCodecsBase.h:156
virtual bool copy()=0
Process a single read operation - to be called in the loop.
virtual void setOutput(Print &out_stream)
Defines the output Stream.
Definition: AudioCodecsBase.h:165
void setInput(Stream &inStream)
Definition: AudioCodecsBase.h:184
virtual void setOutput(AudioStream &out_stream)
Defines the output streams and register to be notified.
Definition: AudioCodecsBase.h:168
virtual void end()=0
Releases the reserved memory.
virtual void setOutput(AudioOutput &out_stream)
Defines the output streams and register to be notified.
Definition: AudioCodecsBase.h:175
virtual AudioInfo audioInfo()=0
Provides the last available MP3FrameInfo.
virtual bool begin()=0
Starts the processing.
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AudioConfig.h:819
Basic Audio information which drives e.g. I2S.
Definition: AudioTypes.h:50