4#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
5#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
6#include "AudioTools/CoreAudio/AudioMetaData/MimeDetector.h"
29 mime_detector.begin();
36 if (actual_decoder.decoder !=
nullptr && actual_decoder.is_open) {
37 actual_decoder.decoder->end();
39 actual_decoder.is_open =
false;
40 actual_decoder.decoder =
nullptr;
41 actual_decoder.mime =
nullptr;
49 decoders.push_back(info);
55 bool (*check)(uint8_t* data,
size_t len)) {
61 p_print = &out_stream;
62 for (
int j = 0; j < decoders.size(); j++) {
63 decoders[j].decoder->setOutput(out_stream);
75 if (
StrView(mime).equals(actual_decoder.mime)) {
83 for (
int j = 0; j < decoders.size(); j++) {
86 LOGI(
"New decoder found for %s (%s)", info.mime, mime);
87 actual_decoder = info;
89 if (p_print !=
nullptr &&
90 actual_decoder.decoder->getOutput() ==
nullptr) {
91 actual_decoder.decoder->
setOutput(*p_print);
93 actual_decoder.decoder->begin();
101 size_t write(
const uint8_t* data,
size_t len)
override {
103 const char* mime =
nullptr;
104 if (p_url_stream !=
nullptr) {
107 if (mime) LOGI(
"mime from http request: %s", mime);
109 if (mime ==
nullptr) {
111 mime_detector.
write((uint8_t*)data, len);
112 mime = mime_detector.
mime();
113 if (mime) LOGI(
"mime from mime_detector: %s", mime);
115 if (mime !=
nullptr) {
118 LOGE(
"The decoder could not be found for %s", mime);
119 actual_decoder.decoder = &nop;
120 actual_decoder.is_open =
true;
126 if (actual_decoder.decoder ==
nullptr)
return 0;
128 return actual_decoder.decoder->write(data, len);
131 virtual operator bool() {
132 if (actual_decoder.decoder == &nop)
return false;
133 return is_first || actual_decoder.is_open;
138 const char* mime =
nullptr;
140 bool is_open =
false;
144 this->decoder = decoder;
151 bool is_first =
true;