arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
AudioCodecsBase.h
1#pragma once
2
3#include "AudioToolsConfig.h"
4#include "AudioLogger.h"
5#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
6#include "AudioTools/CoreAudio/AudioTypes.h"
7#include "AudioTools/CoreAudio/BaseStream.h"
8#include "AudioTools/CoreAudio/AudioOutput.h"
9
10namespace audio_tools {
11
19 public:
20 AudioDecoder() = default;
21 virtual ~AudioDecoder() = default;
22 AudioDecoder(AudioDecoder const &) = delete;
23 AudioDecoder &operator=(AudioDecoder const &) = delete;
24
25 virtual AudioInfo audioInfo() { return info; };
26
28 virtual void setAudioInfo(AudioInfo from) override {
29 TRACED();
30 if (info != from) {
31 notifyAudioChange(from);
32 }
33 info = from;
34 }
36 virtual void setOutput(AudioStream &out_stream) {
37 Print *p_print = &out_stream;
38 setOutput(*p_print);
39 addNotifyAudioChange(out_stream);
40 }
41
43 virtual void setOutput(AudioOutput &out_stream) {
44 Print *p_print = &out_stream;
45 setOutput(*p_print);
46 addNotifyAudioChange(out_stream);
47 }
48
50 virtual void setOutput(Print &out_stream) override { p_print = &out_stream; }
51
53 virtual bool isResultPCM() { return true; }
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 Print* getOutput(){
65 return p_print;
66 }
67
68 protected:
69 Print *p_print = nullptr;
70 AudioInfo info;
71};
72
81 bool isResultPCM() override { return true; }
82};
83
90class AudioEncoder : public AudioWriter {
91 public:
92 AudioEncoder() = default;
93 virtual ~AudioEncoder() = default;
94 AudioEncoder(AudioEncoder const &) = delete;
95 AudioEncoder &operator=(AudioEncoder const &) = delete;
97 virtual const char *mime() = 0;
99 void setAudioInfo(AudioInfo from) override { info = from; }
100 AudioInfo audioInfo() { return info; }
101
102 protected:
103 AudioInfo info;
104};
105
107 public:
108 virtual void setBlockSize(int blockSize) = 0;
109};
110
112 public:
113 virtual int blockSize() = 0;
114};
115
124class CodecNOP : public AudioDecoder, public AudioEncoder {
125 public:
126 static CodecNOP *instance() {
127 static CodecNOP self;
128 return &self;
129 }
130
131 virtual bool begin() { return true; }
132 virtual void end() {}
133 virtual void setOutput(Print &out_stream) {}
135 virtual void setAudioInfo(AudioInfo info) {}
136
138 AudioInfo info;
139 return info;
140 }
141 virtual operator bool() { return false; }
142 virtual int readStream(Stream &in) { return 0; };
143
144 // just output silence
145 virtual size_t write(const uint8_t *data, size_t len) {
146 memset((void *)data, 0, len);
147 return len;
148 }
149
150 virtual const char *mime() { return nullptr; }
151};
152
161 public:
163 virtual bool begin() = 0;
164
166 virtual void end() = 0;
167
169 virtual void setOutput(Print &out_stream) { p_print = &out_stream; }
170
172 virtual void setOutput(AudioStream &out_stream) {
173 Print *p_print = &out_stream;
174 setOutput(*p_print);
175 addNotifyAudioChange(out_stream);
176 }
177
179 virtual void setOutput(AudioOutput &out_stream) {
180 Print *p_print = &out_stream;
181 setOutput(*p_print);
182 addNotifyAudioChange(out_stream);
183 }
184
188 void setInput(Stream &inStream) { this->p_input = &inStream; }
189
191 virtual AudioInfo audioInfo() = 0;
192
194 virtual operator bool() = 0;
195
197 virtual bool copy() = 0;
198
199 protected:
200 virtual size_t readBytes(uint8_t *data, size_t len) = 0;
201 Print *p_print = nullptr;
202 Stream *p_input = nullptr;
203};
204
212 public:
214 int copySize = DEFAULT_BUFFER_SIZE) {
215 p_decoder = &decoder;
216 if (copySize > 0) resize(copySize);
217 }
219 bool begin() override { return p_input != nullptr && p_decoder->begin(); }
220
222 void end() override { p_decoder->end(); }
223
225 void setOutput(Print &out_stream) override {
226 p_decoder->setOutput(out_stream);
227 }
228
230 AudioInfo audioInfo() override { return p_decoder->audioInfo(); }
231
233 virtual operator bool() { return *p_decoder; }
234
236 virtual bool copy() {
237 int read = readBytes(&buffer[0], buffer.size());
238 int written = 0;
239 if (read > 0) written = p_decoder->write(&buffer[0], read);
240 return written > 0;
241 }
242
244 void resize(int bufferSize) { buffer.resize(bufferSize); }
245
246 protected:
247 AudioDecoder *p_decoder = nullptr;
248 Vector<uint8_t> buffer{0};
249
250 size_t readBytes(uint8_t *data, size_t len) override {
251 if (p_input == nullptr) return 0;
252 return p_input->readBytes(data, len);
253 }
254};
255
256} // namespace audio_tools
Definition AudioCodecsBase.h:106
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:18
virtual bool isResultPCM()
Returns true to indicate that the decoding result is PCM data.
Definition AudioCodecsBase.h:53
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:36
virtual void setOutput(Print &out_stream) override
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:50
virtual void setAudioInfo(AudioInfo from) override
for most decoders this is not needed
Definition AudioCodecsBase.h:28
virtual void setOutput(AudioOutput &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:43
virtual AudioInfo audioInfo()
provides the actual input AudioInfo
Definition AudioCodecsBase.h:25
Definition AudioCodecsBase.h:111
Encoding of PCM data.
Definition AudioCodecsBase.h:90
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition AudioCodecsBase.h:99
AudioInfo audioInfo()
provides the actual input AudioInfo
Definition AudioCodecsBase.h:100
virtual const char * mime()=0
Provides the mime type of the encoded result.
Supports the subscription to audio change notifications.
Definition AudioTypes.h:148
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:151
Supports changes to the sampling rate, bits and channels.
Definition AudioTypes.h:133
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:119
E.g. used by Encoders and Decoders.
Definition AudioTypes.h:207
Dummy no implmentation Codec. This is used so that we can initialize some pointers to decoders and en...
Definition AudioCodecsBase.h:124
virtual void setOutput(Print &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:133
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioCodecsBase.h:134
virtual const char * mime()
Provides the mime type of the encoded result.
Definition AudioCodecsBase.h:150
virtual void setAudioInfo(AudioInfo info)
for most decoders this is not needed
Definition AudioCodecsBase.h:135
virtual AudioInfo audioInfo()
provides the actual input AudioInfo
Definition AudioCodecsBase.h:137
Parent class for all container formats.
Definition AudioCodecsBase.h:80
Definition NoArduino.h:62
Definition NoArduino.h:142
Converts any AudioDecoder to a StreamingDecoder.
Definition AudioCodecsBase.h:211
void setOutput(Print &out_stream) override
Defines the output Stream.
Definition AudioCodecsBase.h:225
virtual bool copy()
Process a single read operation - to be called in the loop.
Definition AudioCodecsBase.h:236
void end() override
Releases the reserved memory.
Definition AudioCodecsBase.h:222
void resize(int bufferSize)
Adjust the buffer size: the existing content of the buffer is lost!
Definition AudioCodecsBase.h:244
bool begin() override
Starts the processing.
Definition AudioCodecsBase.h:219
AudioInfo audioInfo() override
Provides the last available MP3FrameInfo.
Definition AudioCodecsBase.h:230
A Streaming Decoder where we provide both the input and output as streams.
Definition AudioCodecsBase.h:160
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:169
void setInput(Stream &inStream)
Definition AudioCodecsBase.h:188
virtual void setOutput(AudioStream &out_stream)
Defines the output streams and register to be notified.
Definition AudioCodecsBase.h:172
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:179
virtual AudioInfo audioInfo()=0
Provides the last available MP3FrameInfo.
virtual bool begin()=0
Starts the processing.
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:53