3#include "AudioToolsConfig.h"
4#include "AbstractMetaData.h"
5#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
6#include "AudioTools/CoreAudio/AudioHttp/AbstractURLStream.h"
26 enum Status { ProcessData, ProcessMetaData, SetupSize };
38 this->mp3_blocksize = value;
49 int bufferLen = 1024) {
50 dataBuffer =
new uint8_t[bufferLen];
59 LOGI(
"mp3_blocksize: %d", mp3_blocksize);
63 virtual void end()
override { clear(); }
67 virtual size_t write(
const uint8_t* data,
size_t len)
override {
68 if (callback !=
nullptr) {
69 for (
size_t j = 0; j < len; j++) {
67 virtual size_t write(
const uint8_t* data,
size_t len)
override {
…}
77 virtual Status
status() {
return currentStatus; }
80 virtual bool isData() {
return currentStatus == ProcessData; }
83 virtual bool hasMetaData() {
return this->mp3_blocksize > 0; }
86 virtual int metaInt() {
return mp3_blocksize; }
92 currentStatus = ProcessData;
97 if (totalData >= mp3_blocksize) {
100 nextStatus = SetupSize;
105 currentStatus = SetupSize;
109 LOGI(
"metaDataLen: %d", metaDataLen);
110 if (metaDataLen > 0) {
111 if (metaDataLen > 200) {
112 LOGI(
"Unexpected metaDataLen -> processed as data");
113 nextStatus = ProcessData;
115 LOGI(
"Metadata found");
117 nextStatus = ProcessMetaData;
121 nextStatus = ProcessData;
125 case ProcessMetaData:
126 currentStatus = ProcessMetaData;
127 metaData[metaDataPos++] = ch;
128 if (metaDataPos >= metaDataLen) {
130 LOGI(
"Metadata ended")
131 nextStatus = ProcessData;
138 Status nextStatus = ProcessData;
139 Status currentStatus = ProcessData;
140 void (*callback)(
MetaDataType info,
const char* str,
int len) =
nullptr;
143 int mp3_blocksize = 0;
144 int metaDataMaxLen = 0;
149 uint8_t* dataBuffer =
nullptr;
150 void (*dataCallback)(
const uint8_t* str,
int len) =
nullptr;
154 virtual void clear() {
155 nextStatus = ProcessData;
167 inline bool isAscii(uint8_t ch){
return ch < 128;}
172 int m = l < 5 ? l : 10;
173 for (
int j = 0; j < m; j++) {
174 if (!isAscii(result[j]))
return false;
182 metaData.resize(meta_size + 1);
183 metaDataMaxLen = meta_size;
184 memset(metaData.data(), 0, meta_size + 1);
193 if (isAscii(metaData, 12)) {
194 LOGI(
"%s", metaData);
195 StrView meta(metaData, len + 1, len);
196 int start = meta.
indexOf(
"StreamTitle=");
201 if (start >= 0 &&
end > start) {
203 if (callback !=
nullptr) {
204 callback(Title, (
const char*)metaData + start + 1,
end - start);
210 LOGW(
"Unexpected Data: %s", metaData);
217 if (dataBuffer !=
nullptr) {
218 dataBuffer[dataPos++] = ch;
220 if (dataPos >= dataLen) {
221 dataCallback(dataBuffer, dataLen);
244 LOGI(
"icy-metaint: %s", iceMetaintStr);
246 LOGE(
"icy-metaint not defined");
249 int iceMetaint = value.
toInt();
258 if (callback ==
nullptr) {
259 LOGW(
"callback not defined")
261 if (p_url ==
nullptr) {
262 LOGW(
"http not defined")
265 if (callback !=
nullptr && p_url !=
nullptr) {
274 callback(Description, descr.
c_str(), descr.
length());