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
81
84 return cfg;
85 }
86
87 virtual void setAudioInfo(AudioInfo newInfo) override {
88 TRACED();
89 if (this->cfg != newInfo && newInfo) {
90 this->cfg = newInfo;
93 }
94 }
95
97 AudioInfo audioInfo() override {
98 // return info from decoder if avilable
101 if (info) return info;
102 }
104 }
105
107 void setOutput(Print *outputStream) {
108 ptr_out = outputStream;
109 if (decoder_ptr != undefined) {
111 }
112 if (encoder_ptr != undefined) {
114 }
115 }
116
117 void setOutput(AudioStream* out) {
118 setOutput((Print*)out);
119 to_notify = out;
120 }
121
123 setOutput((Print*)out);
124 to_notify = out;
125 }
126
127 void setOutput(Print &outputStream) override { setOutput(&outputStream); }
128 void setOutput(AudioOutput &outputStream) { setOutput(&outputStream); }
129 void setOutput(AudioStream &outputStream) { setOutput(&outputStream); }
130
132 if (encoder == nullptr) {
134 }
137 if (ptr_out != nullptr) {
139 }
140 }
141
143
145 if (decoder == nullptr) {
147 }
150 if (ptr_out != nullptr) {
152 }
153 for (auto n : notify_vector) {
154 if (n != nullptr) decoder_ptr->addNotifyAudioChange(*n);
155 }
156 }
157
159
161 bool begin() override {
162 TRACED();
163 if (!active) {
164 TRACED();
165 // Setup notification
166 if (to_notify != nullptr) {
168 }
169 // Get notifications from decoder
172 active = true;
173 if (!decoder_ptr->begin(cfg)) active = false;
174 if (!encoder_ptr->begin(cfg)) active = false;
175 } else {
176 LOGW("no decoder or encoder defined");
177 }
178 }
179 return active;
180 }
181
183 virtual bool begin(AudioInfo newInfo) override {
184 setAudioInfo(newInfo);
185 return begin();
186 }
187
189 void end() override {
190 if (active) {
191 TRACEI();
192 decoder_ptr->end();
193 encoder_ptr->end();
194 active = false;
195 }
196 }
197
199 virtual size_t write(const uint8_t *data, size_t len) override {
200 if (len == 0) {
201 // LOGI("write: %d", 0);
202 return 0;
203 }
204 LOGD("EncodedAudioOutput::write: %d", (int)len);
205
206 if (writer_ptr == nullptr || data == nullptr) {
207 LOGE("NPE");
208 return 0;
209 }
210
212 return 0;
213 }
214
215 size_t result = writer_ptr->write(data, len);
216 LOGD("EncodedAudioOutput::write: %d -> %d", (int)len, (int)result);
217 return result;
218 }
219
220 int availableForWrite() override {
222 return min(ptr_out->availableForWrite(), frame_size);
223 }
224
226 operator bool() override { return active; }
227
230
233
236
239
241 void setFrameSize(int size) { frame_size = size; }
242
246 ptr_out = src.ptr_out;
247 active = src.active;
250 cfg = src.cfg;
251 is_active = src.is_active;
252 return *this;
253 }
254
255 bool isEncoder() { return encoder_ptr != undefined; }
256 bool isDecoder() { return decoder_ptr != undefined; }
257
258 protected:
259 // AudioInfo info;
264 Print *ptr_out = nullptr;
266 bool active = false;
269};
270
274
283 public:
285
290
293 setStream(*ioStream);
294 }
295
298 setOutput(*outputStream);
299 }
300
303 setOutput(*outputStream);
304 }
305
308 setOutput(*outputStream);
309 }
310
312
314
315 virtual ~EncodedAudioStream() { end(); }
316
318
320
322
324
327
330
331 void setStream(Stream *stream) { setStream(*stream); }
332
333 void setStream(AudioStream *stream) { setStream(*stream); }
334
335 void setOutput(AudioOutput *stream) { setOutput(*stream); }
336
337 void setOutput(Print *stream) { setOutput(*stream); }
338
339 void setStream(AudioStream &stream) override {
341 enc_out.setOutput(&stream);
342 }
343
344 void setStream(Stream &stream) override {
346 enc_out.setOutput(&stream);
347 }
348
349 void setOutput(AudioOutput &stream) override {
351 enc_out.setOutput(&stream);
352 }
353
354 void setOutput(Print &out) override {
356 enc_out.setOutput(&out);
357 }
358
360 AudioInfo ai;
361 return ai;
362 }
363
366 return begin();
367 }
368
369 bool begin() override {
370 // is_output_notify = false;
371 setupReader();
374 return enc_out.begin(audioInfo());
375 }
376
377 void end() override {
378 // In read-side mode (decoder reading from stream, output wired to same stream),
379 // redirect decoder output to sink BEFORE flushing, so buffered data
380 // doesn't write back to the input source stream
381 Print* original_output = nullptr;
382 if (getStream() != nullptr && getPrint() == getStream() && reader.getTotalBytesRead() > 0) {
383 original_output = getPrint();
385 }
386
387 // Now end the encoder/decoder and reader
388 enc_out.end();
389 reader.end();
390
391 // Restore the original output
392 if (original_output != nullptr) {
393 enc_out.setOutput(original_output);
394 }
395 }
396
400 void flush() override {
401 if (enc_out.isEncoder()) {
402 enc_out.encoder().end();
404 }
405 if (enc_out.isDecoder()) {
406 enc_out.decoder().end();
408 }
409 }
410
411 int availableForWrite() override { return enc_out.availableForWrite(); }
412
413 size_t write(const uint8_t *data, size_t len) override {
414 // addNotifyOnFirshtWrite();
415 return enc_out.write(data, len);
416 }
417
418 size_t readBytes(uint8_t *data, size_t len) override {
419 return reader.readBytes(data, len);
420 }
421
425
427 float getByteFactor() override { return byte_factor; }
428
430 void setByteFactor(float factor) { byte_factor = factor; }
431
433 void setFrameSize(int size) { enc_out.setFrameSize(size); }
434
436 enc_out = src.enc_out;
438 p_stream = src.p_stream;
439 p_print = src.p_print;
440 info = src.info;
441 return *this;
442 };
443
444 AudioInfo audioInfo() override {
445 return enc_out.audioInfo();;
446 }
447
448 void setAudioInfo(AudioInfo newInfo) override {
450 enc_out.setAudioInfo(newInfo);
451 }
452
453 protected:
455 float byte_factor = 3.0f;
457};
458
467 public:
468 void setWriter(AudioWriter *writer) { p_writer = writer; }
469 size_t write(const uint8_t *data, size_t len) {
470 return p_writer->write(data, len);
471 };
472
473 protected:
475};
476
485 public:
486 virtual bool begin() = 0;
487 virtual void end() = 0;
489 if (this->info != info && info.channels != 0 && info.sample_rate != 0) {
490 this->info = info;
491 if (p_writer1 != nullptr) p_writer1->setAudioInfo(info);
492 if (p_writer2 != nullptr) p_writer2->setAudioInfo(info);
493 }
494 }
495 virtual size_t write(uint8_t *data, size_t size) = 0;
496
497 protected:
502 bool active = false;
503};
504
506 public:
507 void setupOutput(AudioWriter *writer1, AudioWriter *writer2, Print &print) {
508 p_print = &print;
509 p_writer1 = writer1;
510 p_writer2 = writer2;
512 }
513
514 void setupOutput(AudioWriter *writer1, Print &print) {
515 p_print = &print;
516 p_writer1 = writer1;
517 }
518
519 virtual bool begin() {
520 if (!active) {
521 active = true;
522 if (p_writer2 != nullptr) {
525 p_writer1->begin();
526 p_writer2->begin();
527 } else {
529 p_writer1->begin();
530 }
531 }
532 return true;
533 }
534 virtual void end() {
535 if (active) {
536 if (p_writer1 != nullptr) p_writer1->end();
537 if (p_writer2 != nullptr) p_writer2->end();
538 }
539 active = false;
540 }
541 virtual size_t write(uint8_t *data, size_t size) {
542 TRACED();
543 return p_writer1->write(data, size);
544 }
545
546 protected:
547 Print *p_print = nullptr;
549};
550
551} // 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
Vector< AudioInfoSupport * > notify_vector
Definition AudioTypes.h:175
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:317
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:466
AudioWriter * p_writer
Definition AudioEncoded.h:474
void setWriter(AudioWriter *writer)
Definition AudioEncoded.h:468
size_t write(const uint8_t *data, size_t len)
Definition AudioEncoded.h:469
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:484
bool active
Definition AudioEncoded.h:502
AudioWriter * p_writer2
Definition AudioEncoded.h:500
AudioWriter * p_writer1
Definition AudioEncoded.h:499
virtual size_t write(uint8_t *data, size_t size)=0
AudioInfo info
Definition AudioEncoded.h:498
virtual void setAudioInfo(AudioInfo info)
Definition AudioEncoded.h:488
AudioWriterToAudioOutput print2
Definition AudioEncoded.h:501
Definition AudioEncoded.h:505
virtual size_t write(uint8_t *data, size_t size)
Definition AudioEncoded.h:541
void setupOutput(AudioWriter *writer1, AudioWriter *writer2, Print &print)
Definition AudioEncoded.h:507
virtual bool begin()
Definition AudioEncoded.h:519
void setupOutput(AudioWriter *writer1, Print &print)
Definition AudioEncoded.h:514
Print * p_print
Definition AudioEncoded.h:547
virtual void end()
Definition AudioEncoded.h:534
AudioWriterToAudioOutput print2
Definition AudioEncoded.h:548
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:199
EncodedAudioOutput(AudioStream *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:35
bool active
Definition AudioEncoded.h:266
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:260
virtual ~EncodedAudioOutput()
Definition AudioEncoded.h:71
AudioDecoder * getDecoder()
Definition AudioEncoded.h:158
EncodedAudioOutput & operator=(EncodedAudioOutput const &src)
Definition AudioEncoded.h:243
EncodedAudioOutput(AudioOutput *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:59
EncodedAudioOutput()
Definition AudioEncoded.h:23
AudioEncoder * encoder_ptr
Definition AudioEncoded.h:262
AudioEncoder * getEncoder()
Definition AudioEncoded.h:142
void setCheckAvailableForWrite(bool check)
Activate/Deactivate the Available for Write check: if activated, the write.
Definition AudioEncoded.h:238
void setEncoder(AudioEncoder *encoder)
Definition AudioEncoded.h:131
AudioWriter * writer_ptr
Definition AudioEncoded.h:263
EncodedAudioOutput(AudioDecoder *decoder)
Definition AudioEncoded.h:25
void end() override
Ends the processing.
Definition AudioEncoded.h:189
bool isEncoder()
Definition AudioEncoded.h:255
EncodedAudioOutput(Print *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:53
bool isDecoder()
Definition AudioEncoded.h:256
Print * ptr_out
Definition AudioEncoded.h:264
AudioDecoder * decoder_ptr
Definition AudioEncoded.h:261
AudioInfo defaultConfig()
Definition AudioEncoded.h:82
void setOutput(AudioOutput &outputStream)
Definition AudioEncoded.h:128
int availableForWrite() override
Definition AudioEncoded.h:220
void setFrameSize(int size)
defines the size of the decoded frame in bytes
Definition AudioEncoded.h:241
bool check_available_for_write
Definition AudioEncoded.h:267
AudioInfoSupport * to_notify
Definition AudioEncoded.h:265
virtual bool begin(AudioInfo newInfo) override
Starts the processing - sets the status to active.
Definition AudioEncoded.h:183
AudioDecoder & decoder()
Provides the initialized decoder.
Definition AudioEncoded.h:229
void setOutput(Print &outputStream) override
Defines/Changes the output target.
Definition AudioEncoded.h:127
AudioEncoder & encoder()
Provides the initialized encoder.
Definition AudioEncoded.h:232
bool begin() override
Starts the processing - sets the status to active.
Definition AudioEncoded.h:161
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioEncoded.h:87
void setDecoder(AudioDecoder *decoder)
Definition AudioEncoded.h:144
EncodedAudioOutput(AudioEncoder *encoder)
Definition AudioEncoded.h:30
void setOutput(AudioStream *out)
Definition AudioEncoded.h:117
EncodedAudioOutput(AudioStream *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:65
int frame_size
Definition AudioEncoded.h:268
EncodedAudioOutput(AudioOutput *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:41
bool isCheckAvailableForWrite()
Is Available for Write check activated ?
Definition AudioEncoded.h:235
AudioInfo audioInfo() override
Provide audio info from decoder if relevant.
Definition AudioEncoded.h:97
void setOutput(Print *outputStream)
Defines the output.
Definition AudioEncoded.h:107
void setOutput(AudioOutput *out)
Definition AudioEncoded.h:122
void setOutput(AudioStream &outputStream)
Definition AudioEncoded.h:129
A more natural Stream class to process encoded data (aac, wav, mp3...) which also supports the decodi...
Definition AudioEncoded.h:282
virtual ~EncodedAudioStream()
Definition AudioEncoded.h:315
void flush() override
Definition AudioEncoded.h:400
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioEncoded.h:354
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioEncoded.h:344
EncodedAudioStream(Print *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:301
void addNotifyAudioChange(AudioInfoSupport &bi) override
Adds target to be notified about audio changes.
Definition AudioEncoded.h:422
void setByteFactor(float factor)
Define the compression factor: e.g. mp3 is around 4.
Definition AudioEncoded.h:430
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioEncoded.h:448
AudioDecoder * getDecoder()
Definition AudioEncoded.h:323
EncodedAudioStream & operator=(EncodedAudioStream const &src)
Definition AudioEncoded.h:435
AudioEncoder * getEncoder()
Definition AudioEncoded.h:321
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioEncoded.h:418
void setEncoder(AudioEncoder *encoder)
Definition AudioEncoded.h:317
EncodedAudioStream(Stream *ioStream, AudioDecoder *decoder)
Definition AudioEncoded.h:291
float byte_factor
Definition AudioEncoded.h:455
EncodedAudioStream(AudioOutput *outputStream, AudioDecoder *decoder)
Definition AudioEncoded.h:296
void end() override
Definition AudioEncoded.h:377
size_t write(const uint8_t *data, size_t len) override
Definition AudioEncoded.h:413
EncodedAudioStream(AudioEncoder *encoder)
Definition AudioEncoded.h:313
EncodedAudioOutput enc_out
Definition AudioEncoded.h:454
AudioInfo defaultConfig()
Definition AudioEncoded.h:359
float getByteFactor() override
approx compression factor: e.g. mp3 is around 4
Definition AudioEncoded.h:427
void setOutput(Print *stream)
Definition AudioEncoded.h:337
int availableForWrite() override
Definition AudioEncoded.h:411
void setStream(AudioStream &stream) override
Definition AudioEncoded.h:339
void setFrameSize(int size)
defines the size of the decoded frame in bytes
Definition AudioEncoded.h:433
AudioDecoder & decoder()
Provides the initialized decoder.
Definition AudioEncoded.h:326
NullStream null_stream
Definition AudioEncoded.h:456
void setOutput(AudioOutput &stream) override
Definition AudioEncoded.h:349
EncodedAudioStream(AudioStream *ioStream, AudioDecoder *decoder)
Definition AudioEncoded.h:286
EncodedAudioStream(AudioDecoder *decoder)
Definition AudioEncoded.h:311
void setStream(AudioStream *stream)
Definition AudioEncoded.h:333
AudioEncoder & encoder()
Provides the initialized encoder.
Definition AudioEncoded.h:329
bool begin() override
Definition AudioEncoded.h:369
void setDecoder(AudioDecoder *decoder)
Definition AudioEncoded.h:319
EncodedAudioStream(Print *outputStream, AudioEncoder *encoder)
Definition AudioEncoded.h:306
void setOutput(AudioOutput *stream)
Definition AudioEncoded.h:335
void setStream(Stream *stream)
Definition AudioEncoded.h:331
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioEncoded.h:444
bool begin(AudioInfo info)
Definition AudioEncoded.h:364
Abstract class: Objects can be put into a pipleline.
Definition AudioOutput.h:100
The Arduino Stream which provides silence and simulates a null device when used as audio target or au...
Definition BaseStream.h:343
Definition NoArduino.h:62
virtual int availableForWrite()
Definition NoArduino.h:134
Base class for chained converting streams.
Definition AudioIO.h:226
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:228
TransformationReader< ReformatBaseStream > reader
Definition AudioIO.h:302
virtual Stream * getStream()
Definition AudioIO.h:255
virtual void setOutput(AudioOutput &print)
Definition AudioIO.h:242
Stream * p_stream
Definition AudioIO.h:303
virtual Print * getPrint()
Definition AudioIO.h:253
Print * p_print
Definition AudioIO.h:304
void setupReader()
Definition AudioIO.h:306
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