@@ -110,9 +110,9 @@ struct OpusEncoderSettings : public OpusSettings {
110
110
* Each Opus frame must be provided with one write() call. Therefore, Opus
111
111
* is usually encapsulated in a container format (e.g., Ogg) that splits
112
112
* the stream into frames.
113
- *
113
+ *
114
114
* Depends on https://github.com/pschatzmann/arduino-libopus.git
115
- *
115
+ *
116
116
* @author Phil Schatzmann
117
117
* @ingroup codecs
118
118
* @ingroup decoder
@@ -123,7 +123,7 @@ class OpusAudioDecoder : public AudioDecoder {
123
123
/* *
124
124
* @brief Construct a new OpusDecoder object
125
125
*/
126
- OpusAudioDecoder () = default ;
126
+ OpusAudioDecoder (bool releaseOnEnd = false ) : release_on_end(releaseOnEnd) {}
127
127
128
128
/* *
129
129
* @brief Construct a new OpusDecoder object
@@ -160,10 +160,8 @@ class OpusAudioDecoder : public AudioDecoder {
160
160
}
161
161
outbuf.resize (cfg.max_buffer_size );
162
162
assert (outbuf.data () != nullptr );
163
-
164
- // int err;
165
- // dec = opus_decoder_create(cfg.sample_rate, cfg.channels, &err);
166
-
163
+
164
+ // allocate decoder
167
165
size_t size = opus_decoder_get_size (cfg.channels );
168
166
decbuf.resize (size);
169
167
assert (decbuf.data () != nullptr );
@@ -182,8 +180,10 @@ class OpusAudioDecoder : public AudioDecoder {
182
180
void end () override {
183
181
TRACED ();
184
182
dec = nullptr ;
185
- outbuf.resize (0 );
186
- decbuf.resize (0 );
183
+ if (release_on_end) {
184
+ outbuf.resize (0 );
185
+ decbuf.resize (0 );
186
+ }
187
187
active = false ;
188
188
}
189
189
@@ -225,6 +225,10 @@ class OpusAudioDecoder : public AudioDecoder {
225
225
226
226
operator bool () override { return active; }
227
227
228
+ // / Defines if the resources should be released when the stream is closed
229
+ // / (default: false)
230
+ void setReleaseOnEnd (bool flag) { release_on_end = flag; }
231
+
228
232
protected:
229
233
Print *p_print = nullptr ;
230
234
OpusDecoder *dec = nullptr ;
@@ -233,6 +237,7 @@ class OpusAudioDecoder : public AudioDecoder {
233
237
Vector<uint8_t > outbuf{0 };
234
238
Vector<uint8_t > decbuf{0 };
235
239
const uint32_t valid_rates[5 ] = {8000 , 12000 , 16000 , 24000 , 48000 };
240
+ bool release_on_end = false ;
236
241
237
242
bool isValidRate (int rate) {
238
243
for (auto &valid : valid_rates) {
0 commit comments