1
+ #pragma once
2
+ #include " AudioTools/AudioCodecs/AudioCodecsBase.h"
3
+ #include " AudioTools/AudioCodecs/AudioEncoded.h"
4
+
5
+ namespace audio_tools {
6
+
7
+ /* *
8
+ * @brief CodecChain - allows to chain multiple decoders and encoders together
9
+ * @ingroup codecs
10
+ * @ingroup decoder
11
+ * @ingroup encoder
12
+ * @author Phil Schatzmann
13
+ * @copyright GPLv3
14
+ */
15
+ class CodecChain : public AudioDecoder , AudioEncoder {
16
+ public:
17
+ CodecChain () = default ;
18
+ CodecChain (AudioDecoder &decoder) { addDecoder (decoder); }
19
+ CodecChain (AudioEncoder &encoder) { addEncoder (encoder); }
20
+
21
+ // / Adds a decoder to the chain
22
+ void addDecoder (AudioDecoder &decoder) {
23
+ EncodedAudioStream stream;
24
+ stream.setDecoder (&decoder);
25
+ streams.push_back (stream);
26
+ if (streams.size () > 1 ) {
27
+ streams[streams.size () - 2 ].setOutput (streams[streams.size () - 1 ]);
28
+ }
29
+ }
30
+
31
+ // / Adds an encoder to the chain
32
+ void addEncoder (AudioEncoder &encoder) {
33
+ EncodedAudioStream stream;
34
+ stream.setEncoder (&encoder);
35
+ streams.push_back (stream);
36
+ if (streams.size () > 1 ) {
37
+ streams[streams.size () - 2 ].setOutput (streams[streams.size () - 1 ]);
38
+ }
39
+ }
40
+
41
+ void setOutput (Print &out_stream) override {
42
+ p_print = &out_stream;
43
+ if (streams.size () > 0 ) streams[streams.size () - 1 ].setOutput (out_stream);
44
+ }
45
+
46
+ void setOutput (AudioStream &out_stream) override {
47
+ p_print = &out_stream;
48
+ if (streams.size () > 0 ) streams[streams.size () - 1 ].setOutput (out_stream);
49
+ }
50
+
51
+ void setOutput (AudioOutput &out_stream) override {
52
+ p_print = &out_stream;
53
+ if (streams.size () > 0 ) streams[streams.size () - 1 ].setOutput (out_stream);
54
+ }
55
+
56
+ void setAudioInfo (AudioInfo from) override {
57
+ AudioDecoder::setAudioInfo (from);
58
+ for (auto &stream : streams) {
59
+ stream.setAudioInfo (from);
60
+ }
61
+ }
62
+
63
+ size_t write (const uint8_t *data, size_t len) override {
64
+ if (streams.size () == 0 ) return 0 ;
65
+ return streams[0 ].write (data, len);
66
+ }
67
+
68
+ operator bool () { return is_active; }
69
+
70
+ bool begin () {
71
+ is_active = true ;
72
+ for (auto &stream : streams) {
73
+ stream.begin ();
74
+ }
75
+ return true ;
76
+ }
77
+
78
+ void end () override {
79
+ is_active = false ;
80
+ for (auto &stream : streams) {
81
+ stream.end ();
82
+ }
83
+ };
84
+
85
+ // / Returns nullptr
86
+ const char *mime () { return nullptr ; }
87
+
88
+ protected:
89
+ Vector<EncodedAudioStream> streams;
90
+ bool is_active = false ;
91
+ };
92
+
93
+ } // namespace audio_tools
0 commit comments