arduino-audio-tools
Loading...
Searching...
No Matches
AudioEncoded.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioCodecsBase.h"
4#include "AudioToolsConfig.h"
10
11namespace audio_tools {
12
22 public:
24
29
34
37 setOutput(outputStream);
38 active = false;
39 }
40
43 setOutput(outputStream);
44 active = false;
45 }
46
49 setOutput(outputStream);
50 active = false;
51 }
52
55 setOutput(outputStream);
56 active = false;
57 }
58
61 setOutput(outputStream);
62 active = false;
63 }
64
67 setOutput(outputStream);
68 active = false;
69 }
70
71 virtual ~EncodedAudioOutput() { end(); }
72
78
81 return cfg;
82 }
83
84 virtual void setAudioInfo(AudioInfo newInfo) override {
85 TRACED();
86 if (this->cfg != newInfo && newInfo) {
87 this->cfg = newInfo;
90 }
91 }
92
94 AudioInfo audioInfo() override {
95 // return info from decoder if avilable
98 if (info) return info;
99 }
101 }
102
104 void setOutput(Print *outputStream) {
105 ptr_out = outputStream;
106 if (decoder_ptr != undefined) {
108 }
109 if (encoder_ptr != undefined) {
111 }
112 }
113
114 void setOutput(AudioStream* out) {
115 setOutput((Print*)out);
116 to_notify = out;
117 }
118
120 setOutput((Print*)out);
121 to_notify = out;
122 }
123
124 void setOutput(Print &outputStream) override { setOutput(&outputStream); }
125 void setOutput(AudioOutput &outputStream) { setOutput(&outputStream); }
126 void setOutput(AudioStream &outputStream) { setOutput(&outputStream); }
127
129 if (encoder == nullptr) {
131 }
134 if (ptr_out != nullptr) {
136 }
137 }
138
140
142 if (decoder == nullptr) {
144 }
147 if (ptr_out != nullptr) {
149 }
150 }
151
153
155 bool begin() override {
156 TRACED();
157 if (!active) {
158 TRACED();
159 // Setup notification
160 if (to_notify != nullptr) {
162 }
163 // Get notifications from decoder
166 active = true;
167 if (!decoder_ptr->begin(cfg)) active = false;
168 if (!encoder_ptr->begin(cfg)) active = false;
169 } else {
170 LOGW("no decoder or encoder defined");
171 }
172 }
173 return active;
174 }
175
177 virtual bool begin(AudioInfo newInfo) override {
178 setAudioInfo(newInfo);
179 return begin();
180 }
181
183 void end() override {
184 if (active) {
185 TRACEI();
186 decoder_ptr->end();
187 encoder_ptr->end();
188 active = false;
189 }
190 }
191
193 virtual size_t write(const uint8_t *data, size_t len) override {
194 if (len == 0) {
195 // LOGI("write: %d", 0);
196 return 0;
197 }
198 LOGD("EncodedAudioOutput::write: %d", (int)len);
199
200 if (writer_ptr == nullptr || data == nullptr) {
201 LOGE("NPE");
202 return 0;
203 }
204
206 return 0;
207 }
208
209 size_t result = writer_ptr->write(data, len);
210 LOGD("EncodedAudioOutput::write: %d -> %d", (int)len, (int)result);
211 return result;
212 }
213
214 int availableForWrite() override {
216 return min(ptr_out->availableForWrite(), frame_size);
217 }
218
220 operator bool() override { return active; }
221
224
227
230
232 void setFrameSize(int size) { frame_size = size; }
233
237 ptr_out = src.ptr_out;
238 active = src.active;
241 cfg = src.cfg;
242 is_active = src.is_active;
243 return *this;
244 }
245
246
247 protected:
248 // AudioInfo info;
253 Print *ptr_out = nullptr;
255 bool active = false;
258};
259
263
272 public:
274
279
282 setStream(*ioStream);
283 }
284
287 setOutput(*outputStream);
288 }
289
292 setOutput(*outputStream);
293 }
294
297 setOutput(*outputStream);
298 }
299
301
303
304 virtual ~EncodedAudioStream() { end(); }
305
307
309
311
313
316
319
320 void setStream(Stream *stream) { setStream(*stream); }
321
322 void setStream(AudioStream *stream) { setStream(*stream); }
323
324 void setOutput(AudioOutput *stream) { setOutput(*stream); }
325
326 void setOutput(Print *stream) { setOutput(*stream); }
327
328 void setStream(AudioStream &stream) override {
330 enc_out.setOutput(&stream);
331 }
332
333 void setStream(Stream &stream) override {
335 enc_out.setOutput(&stream);
336 }
337
338 void setOutput(AudioOutput &stream) override {
340 enc_out.setOutput(&stream);
341 }
342
343 void setOutput(Print &out) override {
345 enc_out.setOutput(&out);
346 }
347
349 AudioInfo ai;
350 return ai;
351 }
352
355 return begin();
356 }
357
358 bool begin() override {
359 // is_output_notify = false;
360 setupReader();
363 return enc_out.begin(audioInfo());
364 }
365
366 void end() override {
367 enc_out.end();
368 reader.end();
369 }
370
371 int availableForWrite() override { return enc_out.availableForWrite(); }
372
373 size_t write(const uint8_t *data, size_t len) override {
374 // addNotifyOnFirstWrite();
375 return enc_out.write(data, len);
376 }
377
378 size_t readBytes(uint8_t *data, size_t len) override {
379 return reader.readBytes(data, len);
380 }
381
385
387 float getByteFactor() override { return byte_factor; }
388 void setByteFactor(float factor) { byte_factor = factor; }
389
391 void setFrameSize(int size) { enc_out.setFrameSize(size); }
392
394 enc_out = src.enc_out;
396 p_stream = src.p_stream;
397 p_print = src.p_print;
398 info = src.info;
399 return *this;
400 };
401
402 AudioInfo audioInfo() override {
403 return enc_out.audioInfo();;
404 }
405
406 void setAudioInfo(AudioInfo newInfo) override {
408 enc_out.setAudioInfo(newInfo);
409 }
410
411 protected:
413 float byte_factor = 2.0f;
414};
415
424 public:
425 void setWriter(AudioWriter *writer) { p_writer = writer; }
426 size_t write(const uint8_t *data, size_t len) {
427 return p_writer->write(data, len);
428 };
429
430 protected:
432};
433
442 public:
443 virtual bool begin() = 0;
444 virtual void end() = 0;
446 if (this->info != info && info.channels != 0 && info.sample_rate != 0) {
447 this->info = info;
448 if (p_writer1 != nullptr) p_writer1->setAudioInfo(info);
449 if (p_writer2 != nullptr) p_writer2->setAudioInfo(info);
450 }
451 }
452 virtual size_t write(uint8_t *data, size_t size) = 0;
453
454 protected:
459 bool active = false;
460};
461
463 public:
464 void setupOutput(AudioWriter *writer1, AudioWriter *writer2, Print &print) {
465 p_print = &print;
466 p_writer1 = writer1;
467 p_writer2 = writer2;
469 }
470
471 void setupOutput(AudioWriter *writer1, Print &print) {
472 p_print = &print;
473 p_writer1 = writer1;
474 }
475
476 virtual bool begin() {
477 if (!active) {
478 active = true;
479 if (p_writer2 != nullptr) {
482 p_writer1->begin();
483 p_writer2->begin();
484 } else {
486 p_writer1->begin();
487 }
488 }
489 return true;
490 }
491 virtual void end() {
492 if (active) {
493 if (p_writer1 != nullptr) p_writer1->end();
494 if (p_writer2 != nullptr) p_writer2->end();
495 }
496 active = false;
497 }
498 virtual size_t write(uint8_t *data, size_t size) {
499 TRACED();
500 return p_writer1->write(data, size);
501 }
502
503 protected:
504 Print *p_print = nullptr;
506};
507
508} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:18
virtual bool begin(AudioInfo info) override
Definition AudioCodecsBase.h:54
void setAudioInfo(AudioInfo from) override
for most decoders this is not needed
Definition AudioCodecsBase.h:28
void end() override
Definition AudioCodecsBase.h:59
virtual void setOutput(AudioStream &out_stream)
Defines where the decoded result is written to.
Definition AudioCodecsBase.h:36
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioCodecsBase.h:25
Encoding of PCM data.
Definition AudioCodecsBase.h:97
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition AudioCodecsBase.h:106
virtual void setOutput(Print &out_stream) override
Default output assignment (encoders may override to store Print reference)
Definition AudioCodecsBase.h:109
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:153
Supports changes to the sampling rate, bits and channels.
Definition AudioTypes.h:135
virtual void setAudioInfo(AudioInfo info)=0
Defines the input AudioInfo.
Base class for Output Adpapters.
Definition AudioIO.h:228
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
AudioInfo cfg
Definition AudioOutput.h:88
bool is_active
Definition AudioOutput.h:90
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioOutput.h:62
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:123
AudioInfo info
Definition BaseStream.h:174
E.g. used by Encoders and Decoders.
Definition AudioTypes.h:209
virtual void setAudioInfo(AudioInfo from)=0
Defines the input AudioInfo.
virtual size_t write(const uint8_t *data, size_t len)=0
virtual void setOutput(Print &out_stream)=0
virtual void end()=0
virtual bool begin()=0
Adapter class which lets an AudioWriter behave like a Print.
Definition AudioEncoded.h:423
AudioWriter * p_writer
Definition AudioEncoded.h:431
void setWriter(AudioWriter *writer)
Definition AudioEncoded.h:425
size_t write(const uint8_t *data, size_t len)
Definition AudioEncoded.h:426
virtual bool begin()
Definition BaseStream.h:43
Dummy no implmentation Codec. This is used so that we can initialize some pointers to decoders and en...
Definition AudioCodecsBase.h:137
static CodecNOP * instance()
Definition AudioCodecsBase.h:139
ContainerTarget: forwards requests to both the output and the encoder/decoder and sets up the output ...
Definition AudioEncoded.h:441
bool active
Definition AudioEncoded.h:459
AudioWriter * p_writer2
Definition AudioEncoded.h:457
AudioWriter * p_writer1
Definition AudioEncoded.h:456
virtual size_t write(uint8_t *data, size_t size)=0
AudioInfo info
Definition AudioEncoded.h:455
virtual void setAudioInfo(AudioInfo info)
Definition AudioEncoded.h:445
AudioWriterToAudioOutput print2
Definition AudioEncoded.h:458
Definition AudioEncoded.h:462
virtual size_t write(uint8_t *data, size_t size)
Definition AudioEncoded.h:498
void setupOutput(AudioWriter *writer1, AudioWriter *writer2, Print &print)
Definition AudioEncoded.h:464
virtual bool begin()
Definition AudioEncoded.h:476
void setupOutput(AudioWriter *writer1, Print &print)
Definition AudioEncoded.h:471
Print * p_print
Definition AudioEncoded.h:504
virtual void end()
Definition AudioEncoded.h:491
AudioWriterToAudioOutput print2
Definition AudioEncoded.h:505
A more natural Print class to process encoded data (aac, wav, mp3...). Just define the output and the...
Definition AudioEncoded.h:21
virtual size_t write(const uint8_t *data, size_t len) override
encoder decode the data
Definition AudioEncoded.h:193
EncodedAudioOutput(AudioStream *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:35
bool active
Definition AudioEncoded.h:255
EncodedAudioOutput(Print *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:47
void addNotifyAudioChange(AudioInfoSupport &bi) override
Define object which need to be notified if the basinfo is changing.
Definition AudioEncoded.h:74
CodecNOP * undefined
Definition AudioEncoded.h:249
virtual ~EncodedAudioOutput()
Definition AudioEncoded.h:71
AudioDecoder * getDecoder()
Definition AudioEncoded.h:152
EncodedAudioOutput & operator=(EncodedAudioOutput const &src)
Definition AudioEncoded.h:234
EncodedAudioOutput(AudioOutput *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:59
EncodedAudioOutput()
Definition AudioEncoded.h:23
AudioEncoder * encoder_ptr
Definition AudioEncoded.h:251
AudioEncoder * getEncoder()
Definition AudioEncoded.h:139
void setEncoder(AudioEncoder *encoder)
Definition AudioEncoded.h:128
AudioWriter * writer_ptr
Definition AudioEncoded.h:252
EncodedAudioOutput(AudioDecoder *decoder)
Definition AudioEncoded.h:25
void end() override
Ends the processing.
Definition AudioEncoded.h:183
EncodedAudioOutput(Print *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:53
Print * ptr_out
Definition AudioEncoded.h:253
AudioDecoder * decoder_ptr
Definition AudioEncoded.h:250
AudioInfo defaultConfig()
Definition AudioEncoded.h:79
void setOutput(AudioOutput &outputStream)
Definition AudioEncoded.h:125
int availableForWrite() override
Definition AudioEncoded.h:214
void setFrameSize(int size)
defines the size of the decoded frame in bytes
Definition AudioEncoded.h:232
bool check_available_for_write
Definition AudioEncoded.h:256
AudioInfoSupport * to_notify
Definition AudioEncoded.h:254
virtual bool begin(AudioInfo newInfo) override
Starts the processing - sets the status to active.
Definition AudioEncoded.h:177
AudioDecoder & decoder()
Provides the initialized decoder.
Definition AudioEncoded.h:223
void setOutput(Print &outputStream) override
Defines/Changes the output target.
Definition AudioEncoded.h:124
AudioEncoder & encoder()
Provides the initialized encoder.
Definition AudioEncoded.h:226
bool begin() override
Starts the processing - sets the status to active.
Definition AudioEncoded.h:155
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioEncoded.h:84
void setDecoder(AudioDecoder *decoder)
Definition AudioEncoded.h:141
EncodedAudioOutput(AudioEncoder *encoder)
Definition AudioEncoded.h:30
void setOutput(AudioStream *out)
Definition AudioEncoded.h:114
EncodedAudioOutput(AudioStream *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:65
int frame_size
Definition AudioEncoded.h:257
EncodedAudioOutput(AudioOutput *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:41
bool isCheckAvailableForWrite()
Is Available for Write check activated ?
Definition AudioEncoded.h:229
AudioInfo audioInfo() override
Provide audio info from decoder if relevant.
Definition AudioEncoded.h:94
void setOutput(Print *outputStream)
Defines the output.
Definition AudioEncoded.h:104
void setOutput(AudioOutput *out)
Definition AudioEncoded.h:119
void setOutput(AudioStream &outputStream)
Definition AudioEncoded.h:126
A more natural Stream class to process encoded data (aac, wav, mp3...) which also supports the decodi...
Definition AudioEncoded.h:271
virtual ~EncodedAudioStream()
Definition AudioEncoded.h:304
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioEncoded.h:343
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioEncoded.h:333
EncodedAudioStream(Print *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:290
void addNotifyAudioChange(AudioInfoSupport &bi) override
Adds target to be notified about audio changes.
Definition AudioEncoded.h:382
void setByteFactor(float factor)
Definition AudioEncoded.h:388
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioEncoded.h:406
AudioDecoder * getDecoder()
Definition AudioEncoded.h:312
EncodedAudioStream & operator=(EncodedAudioStream const &src)
Definition AudioEncoded.h:393
AudioEncoder * getEncoder()
Definition AudioEncoded.h:310
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioEncoded.h:378
void setEncoder(AudioEncoder *encoder)
Definition AudioEncoded.h:306
EncodedAudioStream(Stream *ioStream, AudioDecoder *decoder)
Definition AudioEncoded.h:280
float byte_factor
Definition AudioEncoded.h:413
EncodedAudioStream(AudioOutput *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:285
void end() override
Definition AudioEncoded.h:366
size_t write(const uint8_t *data, size_t len) override
Definition AudioEncoded.h:373
EncodedAudioStream(AudioEncoder *encoder)
Definition AudioEncoded.h:302
EncodedAudioOutput enc_out
Definition AudioEncoded.h:412
AudioInfo defaultConfig()
Definition AudioEncoded.h:348
float getByteFactor() override
approx compression factor: e.g. mp3 is around 4
Definition AudioEncoded.h:387
void setOutput(Print *stream)
Definition AudioEncoded.h:326
int availableForWrite() override
Definition AudioEncoded.h:371
void setStream(AudioStream &stream) override
Definition AudioEncoded.h:328
void setFrameSize(int size)
defines the size of the decoded frame in bytes
Definition AudioEncoded.h:391
AudioDecoder & decoder()
Provides the initialized decoder.
Definition AudioEncoded.h:315
void setOutput(AudioOutput &stream) override
Definition AudioEncoded.h:338
EncodedAudioStream(AudioStream *ioStream, AudioDecoder *decoder)
Definition AudioEncoded.h:275
EncodedAudioStream(AudioDecoder *decoder)
Definition AudioEncoded.h:300
void setStream(AudioStream *stream)
Definition AudioEncoded.h:322
AudioEncoder & encoder()
Provides the initialized encoder.
Definition AudioEncoded.h:318
bool begin() override
Definition AudioEncoded.h:358
void setDecoder(AudioDecoder *decoder)
Definition AudioEncoded.h:308
EncodedAudioStream(Print *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:295
void setOutput(AudioOutput *stream)
Definition AudioEncoded.h:324
void setStream(Stream *stream)
Definition AudioEncoded.h:320
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioEncoded.h:402
bool begin(AudioInfo info)
Definition AudioEncoded.h:353
Abstract class: Objects can be put into a pipleline.
Definition AudioOutput.h:100
Definition NoArduino.h:62
virtual int availableForWrite()
Definition NoArduino.h:134
Base class for chained converting streams.
Definition AudioIO.h:151
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:153
TransformationReader< ReformatBaseStream > reader
Definition AudioIO.h:213
virtual void setOutput(AudioOutput &print)
Definition AudioIO.h:167
Stream * p_stream
Definition AudioIO.h:214
Print * p_print
Definition AudioIO.h:215
void setupReader()
Definition AudioIO.h:217
Definition NoArduino.h:142
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:55
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:57
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:59