4#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
5#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
6#include "AudioTools/CoreAudio/AudioMetaData/MimeDetector.h"
7#include "AudioTools/CoreAudio/AudioHttp/AbstractURLStream.h"
30 mime_detector.begin();
37 if (actual_decoder.decoder !=
nullptr && actual_decoder.is_open) {
38 actual_decoder.decoder->end();
40 actual_decoder.is_open =
false;
41 actual_decoder.decoder =
nullptr;
42 actual_decoder.mime =
nullptr;
50 decoders.push_back(info);
56 bool (*check)(uint8_t* data,
size_t len)) {
62 p_print = &out_stream;
63 for (
int j = 0; j < decoders.size(); j++) {
64 decoders[j].decoder->setOutput(out_stream);
76 if (
StrView(mime).equals(actual_decoder.mime)) {
84 for (
int j = 0; j < decoders.size(); j++) {
87 LOGI(
"New decoder found for %s (%s)", info.mime, mime);
88 actual_decoder = info;
90 if (p_print !=
nullptr &&
91 actual_decoder.decoder->getOutput() ==
nullptr) {
92 actual_decoder.decoder->
setOutput(*p_print);
94 actual_decoder.decoder->begin();
102 size_t write(
const uint8_t* data,
size_t len)
override {
104 const char* mime =
nullptr;
105 if (p_url_stream !=
nullptr) {
108 if (mime) LOGI(
"mime from http request: %s", mime);
110 if (mime ==
nullptr) {
112 mime_detector.
write((uint8_t*)data, len);
113 mime = mime_detector.
mime();
114 if (mime) LOGI(
"mime from mime_detector: %s", mime);
116 if (mime !=
nullptr) {
119 LOGE(
"The decoder could not be found for %s", mime);
120 actual_decoder.decoder = &nop;
121 actual_decoder.is_open =
true;
127 if (actual_decoder.decoder ==
nullptr)
return 0;
129 return actual_decoder.decoder->write(data, len);
132 virtual operator bool()
override {
133 if (actual_decoder.decoder == &nop)
return false;
134 return is_first || actual_decoder.is_open;
139 const char* mime =
nullptr;
141 bool is_open =
false;
145 this->decoder = decoder;
152 bool is_first =
true;