Skip to content

Commit 553c816

Browse files
committed
MultiDecoder: support StreamingDecoder
1 parent 8a6ccde commit 553c816

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/AudioTools/AudioCodecs/AudioCodecs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
#include "AudioTools/AudioCodecs/CodecL8.h"
2525
#include "AudioTools/AudioCodecs/CodecFloat.h"
2626
#include "AudioTools/AudioCodecs/CodecBase64.h"
27-
#include "AudioTools/AudioCodecs/MultiDecoder.h"
2827
#include "AudioTools/AudioCodecs/CodecMTS.h"
2928
#include "AudioTools/AudioCodecs/CodecADTS.h"
3029
#include "AudioTools/AudioCodecs/CodecNetworkFormat.h"
3130
#include "AudioTools/AudioCodecs/CodecFactory.h"
3231
#include "AudioTools/AudioCodecs/StreamingDecoder.h"
32+
#include "AudioTools/AudioCodecs/MultiDecoder.h"

src/AudioTools/AudioCodecs/MultiDecoder.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
66
#include "AudioTools/CoreAudio/AudioHttp/AbstractURLStream.h"
77
#include "AudioTools/CoreAudio/AudioMetaData/MimeDetector.h"
8+
#include "AudioTools/AudioCodecs/StreamingDecoder.h"
89

910
namespace audio_tools {
1011

@@ -56,6 +57,19 @@ class MultiDecoder : public AudioDecoder {
5657
*/
5758
MultiDecoder(MimeSource& mimeSource) { setMimeSource(mimeSource); }
5859

60+
/**
61+
* @brief Destructor
62+
*
63+
* Cleans up any internally created DecoderAdapter instances.
64+
*/
65+
~MultiDecoder() {
66+
// Clean up any adapters we created
67+
for (auto* adapter : adapters) {
68+
delete adapter;
69+
}
70+
adapters.clear();
71+
}
72+
5973
/**
6074
* @brief Starts the processing and enables automatic MIME type determination
6175
*
@@ -292,6 +306,33 @@ class MultiDecoder : public AudioDecoder {
292306
*/
293307
MimeDetector& mimeDetector() { return mime_detector; }
294308

309+
/**
310+
* @brief Adds a StreamingDecoder that will be selected by its MIME type
311+
*
312+
* Registers a StreamingDecoder that will be automatically selected when
313+
* the corresponding MIME type is detected in the input data. The
314+
* StreamingDecoder is wrapped in a DecoderAdapter to provide compatibility
315+
* with the write-based AudioDecoder interface used by MultiDecoder.
316+
*
317+
* @param decoder The StreamingDecoder to register
318+
* @param mime The MIME type string to associate with this decoder
319+
* @param bufferSize Buffer size for the adapter (default: 1024 bytes)
320+
*/
321+
void addDecoder(StreamingDecoder& decoder, const char* mime,
322+
int bufferSize = 1024) {
323+
if (mime != nullptr) {
324+
// Create a DecoderAdapter to wrap the StreamingDecoder
325+
decoder.addNotifyAudioChange(*this);
326+
auto adapter = new DecoderAdapter(decoder, bufferSize);
327+
adapters.push_back(adapter); // Store for cleanup
328+
329+
// Add the adapter as a regular AudioDecoder
330+
addDecoder(*adapter, mime);
331+
} else {
332+
LOGE("MIME type is nullptr - cannot add StreamingDecoder");
333+
}
334+
}
335+
295336
protected:
296337
/**
297338
* @brief Information about a registered decoder
@@ -319,6 +360,7 @@ class MultiDecoder : public AudioDecoder {
319360
} actual_decoder; ///< Currently active decoder information
320361

321362
Vector<DecoderInfo> decoders{0}; ///< Collection of registered decoders
363+
Vector<DecoderAdapter*> adapters{0}; ///< Collection of internally created adapters
322364
MimeDetector mime_detector; ///< MIME type detection engine
323365
CodecNOP nop; ///< No-operation codec for unsupported formats
324366
MimeSource* p_mime_source = nullptr; ///< Optional external MIME source

0 commit comments

Comments
 (0)