@@ -238,7 +238,7 @@ class StreamingDecoderAdapter : public StreamingDecoder {
238
238
* @return true if data was processed successfully, false otherwise
239
239
*/
240
240
virtual bool copy () override {
241
- int read = readBytes (& buffer[ 0 ] , buffer.size ());
241
+ int read = readBytes (buffer. data () , buffer.size ());
242
242
int written = 0 ;
243
243
if (read > 0 ) written = p_decoder->write (&buffer[0 ], read);
244
244
return written > 0 ;
@@ -312,6 +312,19 @@ class MultiStreamingDecoder : public StreamingDecoder {
312
312
*/
313
313
MultiStreamingDecoder () = default ;
314
314
315
+ /* *
316
+ * @brief Destructor
317
+ *
318
+ * Cleans up any internally created StreamingDecoderAdapter instances.
319
+ */
320
+ ~MultiStreamingDecoder () {
321
+ // Clean up any adapters we created
322
+ for (auto * adapter : adapters) {
323
+ delete adapter;
324
+ }
325
+ adapters.clear ();
326
+ }
327
+
315
328
/* *
316
329
* @brief Starts the processing
317
330
*
@@ -396,6 +409,7 @@ class MultiStreamingDecoder : public StreamingDecoder {
396
409
}
397
410
}
398
411
412
+
399
413
/* *
400
414
* @brief Adds a decoder with explicit MIME type
401
415
*
@@ -414,6 +428,33 @@ class MultiStreamingDecoder : public StreamingDecoder {
414
428
}
415
429
}
416
430
431
+ /* *
432
+ * @brief Adds an AudioDecoder with explicit MIME type
433
+ *
434
+ * Wraps an AudioDecoder in a StreamingDecoderAdapter and registers it with
435
+ * the specified MIME type. This allows using traditional AudioDecoder instances
436
+ * with the MultiStreamingDecoder's automatic format detection.
437
+ *
438
+ * @param decoder The AudioDecoder to wrap and register
439
+ * @param mime The MIME type string to associate with this decoder
440
+ * @param bufferSize Buffer size for the adapter (default: DEFAULT_BUFFER_SIZE)
441
+ *
442
+ * @note The created StreamingDecoderAdapter is stored internally and will be
443
+ * automatically managed by the MultiStreamingDecoder.
444
+ */
445
+ void addDecoder (AudioDecoder& decoder, const char * mime, int bufferSize = DEFAULT_BUFFER_SIZE) {
446
+ if (mime != nullptr ) {
447
+ // Create a StreamingDecoderAdapter to wrap the AudioDecoder
448
+ auto adapter = new StreamingDecoderAdapter (decoder, mime, bufferSize);
449
+ adapters.push_back (adapter); // Store for cleanup
450
+
451
+ DecoderInfo info{mime, adapter};
452
+ decoders.push_back (info);
453
+ } else {
454
+ LOGE (" MIME type is nullptr - cannot add AudioDecoder" );
455
+ }
456
+ }
457
+
417
458
/* *
418
459
* @brief Checks if the class is active
419
460
*
@@ -691,6 +732,7 @@ class MultiStreamingDecoder : public StreamingDecoder {
691
732
} actual_decoder; // /< Currently active decoder information
692
733
693
734
Vector<DecoderInfo> decoders{0 }; // /< Collection of registered decoders
735
+ Vector<StreamingDecoderAdapter*> adapters{0 }; // /< Collection of internally created adapters
694
736
MimeDetector mime_detector; // /< MIME type detection engine
695
737
BufferedPrefixStream buffered_stream; // /< Buffered stream for data preservation
696
738
Vector<uint8_t > detection_buffer{0 }; // /< Buffer for format detection data
0 commit comments