@@ -257,6 +257,24 @@ class EncodedAudioPrint : public AudioStream {
257
257
active = false ;
258
258
}
259
259
260
+ EncodedAudioPrint (AudioPrint *outputStream, AudioEncoder *encoder) {
261
+ TRACED ();
262
+ ptr_out = outputStream;
263
+ encoder_ptr = encoder;
264
+ encoder_ptr->setOutputStream (*outputStream);
265
+ writer_ptr = encoder_ptr;
266
+ active = false ;
267
+ }
268
+
269
+ EncodedAudioPrint (AudioStream *outputStream, AudioEncoder *encoder) {
270
+ TRACED ();
271
+ ptr_out = outputStream;
272
+ encoder_ptr = encoder;
273
+ encoder_ptr->setOutputStream (*outputStream);
274
+ writer_ptr = encoder_ptr;
275
+ active = false ;
276
+ }
277
+
260
278
/* *
261
279
* @brief Construct a new Encoded Audio Stream object - the Output and
262
280
* Encoder/Decoder needs to be defined with the corresponding setter methods.
@@ -282,9 +300,12 @@ class EncodedAudioPrint : public AudioStream {
282
300
283
301
virtual void setAudioInfo (AudioInfo info) override {
284
302
TRACED ();
285
- AudioStream::setAudioInfo (info);
286
- decoder_ptr->setAudioInfo (info);
287
- encoder_ptr->setAudioInfo (info);
303
+ if (this ->info != info) {
304
+ this ->info = info;
305
+ AudioStream::setAudioInfo (info);
306
+ decoder_ptr->setAudioInfo (info);
307
+ encoder_ptr->setAudioInfo (info);
308
+ }
288
309
}
289
310
290
311
// / Defines the output
@@ -294,6 +315,9 @@ class EncodedAudioPrint : public AudioStream {
294
315
void setStream (Print *outputStream) { setOutput (outputStream); }
295
316
296
317
void setEncoder (AudioEncoder *encoder) {
318
+ if (encoder == nullptr ) {
319
+ encoder = CodecNOP::instance ();
320
+ }
297
321
encoder_ptr = encoder;
298
322
writer_ptr = encoder;
299
323
if (ptr_out != nullptr ) {
@@ -302,6 +326,9 @@ class EncodedAudioPrint : public AudioStream {
302
326
}
303
327
304
328
void setDecoder (AudioDecoder *decoder) {
329
+ if (decoder == nullptr ) {
330
+ decoder = CodecNOP::instance ();
331
+ }
305
332
decoder_ptr = decoder;
306
333
writer_ptr = decoder;
307
334
if (ptr_out != nullptr ) {
@@ -312,13 +339,16 @@ class EncodedAudioPrint : public AudioStream {
312
339
// / Starts the processing - sets the status to active
313
340
bool begin () override {
314
341
TRACED ();
315
- const CodecNOP *nop = CodecNOP::instance ();
316
- if (decoder_ptr != nop || encoder_ptr != nop) {
317
- decoder_ptr->begin ();
318
- encoder_ptr->begin ();
319
- active = true ;
320
- } else {
321
- LOGW (" no decoder or encoder defined" );
342
+
343
+ if (!active) {
344
+ const CodecNOP *nop = CodecNOP::instance ();
345
+ if (decoder_ptr != nop || encoder_ptr != nop) {
346
+ active = true ;
347
+ decoder_ptr->begin ();
348
+ encoder_ptr->begin ();
349
+ } else {
350
+ LOGW (" no decoder or encoder defined" );
351
+ }
322
352
}
323
353
return active;
324
354
}
@@ -376,6 +406,7 @@ class EncodedAudioPrint : public AudioStream {
376
406
AudioEncoder &encoder () { return *encoder_ptr; }
377
407
378
408
protected:
409
+ AudioInfo info;
379
410
AudioDecoder *decoder_ptr = CodecNOP::instance(); // decoder
380
411
AudioEncoder *encoder_ptr = CodecNOP::instance(); // decoder
381
412
AudioWriter *writer_ptr = nullptr ;
@@ -561,129 +592,95 @@ class EncodedAudioStream : public EncodedAudioPrint {
561
592
};
562
593
563
594
/* *
564
- * @brief ContainerTarget: forwards requests to both the output and the
565
- * encoder/decoder
595
+ * @brief Facade class which lets an AudioWriter behave like a Print
596
+ * @author Phil Schatzmann
597
+ * @copyright GPLv3
566
598
*
567
599
*/
568
- class ContainerTarget {
569
- public:
570
- virtual bool begin ();
571
- virtual void end ();
572
- virtual void setAudioInfo (AudioInfo info);
573
- virtual size_t write (uint8_t *data, size_t size);
574
- };
575
600
576
- class ContainerTargetPrint : public ContainerTarget {
601
+ class AudioWriterToPrint : public AudioPrint {
577
602
public:
578
- ContainerTargetPrint (Print &print, AudioWriter *writer) {
579
- p_print = &print;
580
- p_writer = writer;
581
- }
582
- virtual bool begin () {
583
- if (p_writer) {
584
- p_writer->begin ();
585
- p_writer->setOutputStream (*p_print);
586
- }
587
- return true ;
588
- }
589
- virtual void end () {
590
- if (p_writer) p_writer->end ();
591
- }
592
- virtual void setAudioInfo (AudioInfo info) {
593
- if (p_writer) p_writer->setAudioInfo (info);
594
- }
595
- virtual size_t write (uint8_t *data, size_t size) {
596
- TRACED ();
597
- return p_writer ? p_writer->write (data, size) : p_print->write (data, size);
598
- }
603
+ void setWriter (AudioWriter *writer) { p_writer = writer; }
604
+ size_t write (const uint8_t *in_ptr, size_t in_size) {
605
+ return p_writer->write (in_ptr, in_size);
606
+ };
599
607
600
608
protected:
601
- Print *p_print = nullptr ;
602
609
AudioWriter *p_writer = nullptr ;
603
610
};
604
611
605
- class ContainerTargetAudioPrint : public ContainerTarget {
612
+ /* *
613
+ * @brief ContainerTarget: forwards requests to both the output and the
614
+ * encoder/decoder and sets up the output chain for Containers. We also
615
+ * manage the proper sequence of the output classes
616
+ * @author Phil Schatzmann
617
+ * @copyright GPLv3
618
+ */
619
+ class ContainerTarget {
606
620
public:
607
- ContainerTargetAudioPrint (AudioPrint &print, AudioWriter *writer) {
608
- p_print = &print;
609
- p_writer = writer;
610
- }
611
- virtual bool begin () {
612
- if (p_writer) {
613
- p_writer->begin ();
614
- p_writer->setOutputStream (*p_print);
615
- }
616
- return p_print->begin ();
617
- }
618
- virtual void end () {
619
- if (p_writer) p_writer->end ();
620
- p_print->end ();
621
- }
621
+ virtual bool begin () = 0;
622
+ virtual void end () = 0;
622
623
virtual void setAudioInfo (AudioInfo info) {
623
- if (p_writer) p_writer-> setAudioInfo ( info);
624
-
625
- if (p_print-> audioInfo () != info) {
626
- p_print ->setAudioInfo (info);
624
+ if (this -> info != info) {
625
+ this -> info = info;
626
+ if (p_writer1 != nullptr ) p_writer1-> setAudioInfo (info);
627
+ if (p_writer2 != nullptr ) p_writer2 ->setAudioInfo (info);
627
628
}
628
629
}
629
- virtual size_t write (uint8_t *data, size_t size) {
630
- TRACED ();
631
- return p_writer ? p_writer->write (data, size) : p_print->write (data, size);
632
- }
630
+ virtual size_t write (uint8_t *data, size_t size) = 0;
633
631
634
632
protected:
635
- AudioPrint *p_print;
636
- AudioWriter *p_writer = nullptr ;
633
+ AudioInfo info;
634
+ AudioWriter *p_writer1 = nullptr ;
635
+ AudioWriter *p_writer2 = nullptr ;
636
+ AudioWriterToPrint print2;
637
+ bool active = false ;
637
638
};
638
639
639
- class ContainerTargetAudioStream : public ContainerTarget {
640
+ class ContainerTargetPrint : public ContainerTarget {
640
641
public:
641
- ContainerTargetAudioStream (AudioStream &print , AudioWriter *writer ) {
642
+ void setupOutput (AudioWriter *writer1 , AudioWriter *writer2, Print &print ) {
642
643
p_print = &print;
643
- p_writer = writer;
644
- }
645
- virtual bool begin () {
646
- if (p_writer) {
647
- p_writer->begin ();
648
- p_writer->setOutputStream (*p_print);
649
- }
650
- return p_print->begin ();
651
- }
652
- virtual void end () { p_print->end (); }
653
- virtual void setAudioInfo (AudioInfo info) {
654
- if (p_writer) p_writer->setAudioInfo (info);
655
- if (p_print->audioInfo () != info) {
656
- p_print->setAudioInfo (info);
657
- }
658
- }
659
- virtual size_t write (uint8_t *data, size_t size) {
660
- TRACED ();
661
- return p_writer ? p_writer->write (data, size) : p_print->write (data, size);
644
+ p_writer1 = writer1;
645
+ p_writer2 = writer2;
646
+ print2.setWriter (p_writer2);
662
647
}
663
648
664
- protected:
665
- AudioStream *p_print;
666
- AudioWriter *p_writer = nullptr ;
667
- };
668
-
669
- class ContainerTargetAudioWriter : public ContainerTarget {
670
- public:
671
- ContainerTargetAudioWriter (AudioWriter *writer) {
672
- p_writer = writer;
649
+ void setupOutput (AudioWriter *writer1, Print &print) {
650
+ p_print = &print;
651
+ p_writer1 = writer1;
673
652
}
653
+
674
654
virtual bool begin () {
675
- p_writer->begin ();
655
+ if (!active) {
656
+ active = true ;
657
+ if (p_writer2 != nullptr ) {
658
+ p_writer1->setOutputStream (print2);
659
+ p_writer2->setOutputStream (*p_print);
660
+ p_writer1->begin ();
661
+ p_writer2->begin ();
662
+ } else {
663
+ p_writer1->setOutputStream (*p_print);
664
+ p_writer1->begin ();
665
+ }
666
+ }
676
667
return true ;
677
668
}
678
- virtual void end () { p_writer->end (); }
679
- virtual void setAudioInfo (AudioInfo info) { p_writer->setAudioInfo (info); }
669
+ virtual void end () {
670
+ if (active) {
671
+ if (p_writer1 != nullptr ) p_writer1->end ();
672
+ if (p_writer2 != nullptr ) p_writer2->end ();
673
+ }
674
+ active = false ;
675
+ }
680
676
virtual size_t write (uint8_t *data, size_t size) {
681
677
TRACED ();
682
- return p_writer ->write (data, size);
678
+ return p_writer1 ->write (data, size);
683
679
}
684
680
685
681
protected:
686
- AudioWriter *p_writer;
682
+ Print *p_print = nullptr ;
683
+ AudioWriterToPrint print2;
687
684
};
688
685
689
686
} // namespace audio_tools
0 commit comments