4#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
5#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
6#include "AudioTools/CoreAudio/AudioHttp/AbstractURLStream.h"
7#include "AudioTools/CoreAudio/AudioMetaData/MimeDetector.h"
30 mime_detector.begin();
32 if (p_print ==
nullptr) {
33 LOGE(
"No output defined");
41 if (actual_decoder.decoder !=
nullptr && actual_decoder.is_open) {
42 actual_decoder.decoder->end();
44 actual_decoder.is_open =
false;
45 actual_decoder.decoder =
nullptr;
46 actual_decoder.mime =
nullptr;
54 decoders.push_back(info);
60 bool (*check)(uint8_t* data,
size_t len)) {
66 p_print = &out_stream;
77 if (mime ==
nullptr)
return false;
79 if (
StrView(mime).equals(actual_decoder.mime)) {
84 if (actual_decoder.decoder !=
this)
end();
87 selected_mime =
nullptr;
88 for (
int j = 0; j < decoders.size(); j++) {
91 LOGI(
"Using decoder for %s (%s)", info.mime, mime);
92 actual_decoder = info;
94 if (p_print !=
nullptr && actual_decoder.decoder !=
this
95 && actual_decoder.decoder->getOutput() ==
nullptr) {
96 actual_decoder.decoder->
setOutput(*p_print);
98 if (!*actual_decoder.decoder) {
99 actual_decoder.decoder->begin();
100 LOGI(
"Decoder %s started", actual_decoder.mime);
103 selected_mime = mime;
111 const char* selectedMime() {
return selected_mime; }
113 size_t write(
const uint8_t* data,
size_t len)
override {
115 const char* mime =
nullptr;
116 if (p_url_stream !=
nullptr) {
119 if (mime) LOGI(
"mime from http request: %s", mime);
121 if (mime ==
nullptr) {
123 mime_detector.
write((uint8_t*)data, len);
124 mime = mime_detector.
mime();
125 if (mime) LOGI(
"mime from mime_detector: %s", mime);
127 if (mime !=
nullptr) {
130 LOGE(
"The decoder could not be found for %s", mime);
131 actual_decoder.decoder = &nop;
132 actual_decoder.is_open =
true;
138 if (actual_decoder.decoder ==
nullptr)
return 0;
140 return actual_decoder.decoder->write(data, len);
143 virtual operator bool()
override {
144 if (actual_decoder.decoder == &nop)
return false;
145 return is_first || actual_decoder.is_open;
150 if (actual_decoder.decoder ==
nullptr) {
151 LOGE(
"No decoder defined, cannot set codec config");
159 const char* mime =
nullptr;
161 bool is_open =
false;
165 this->decoder = decoder;
172 bool is_first =
true;
173 const char* selected_mime =
nullptr;