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);
64 virtual void end()
override { clear(); }
68 virtual size_t write(
const uint8_t* data,
size_t len)
override {
69 if (callback !=
nullptr) {
70 for (
size_t j = 0; j < len; j++) {
78 virtual Status
status() {
return currentStatus; }
81 virtual bool isData() {
return currentStatus == ProcessData; }
84 virtual bool hasMetaData() {
return this->mp3_blocksize > 0; }
87 virtual int metaInt() {
return mp3_blocksize; }
93 currentStatus = ProcessData;
98 if (totalData >= mp3_blocksize) {
101 nextStatus = SetupSize;
106 currentStatus = SetupSize;
110 LOGI(
"metaDataLen: %d", metaDataLen);
111 if (metaDataLen > 0) {
112 if (metaDataLen > 200) {
113 LOGI(
"Unexpected metaDataLen -> processed as data");
114 nextStatus = ProcessData;
116 LOGI(
"Metadata found");
118 nextStatus = ProcessMetaData;
122 nextStatus = ProcessData;
126 case ProcessMetaData:
127 currentStatus = ProcessMetaData;
128 metaData[metaDataPos++] = ch;
129 if (metaDataPos >= metaDataLen) {
131 LOGI(
"Metadata ended")
132 nextStatus = ProcessData;
139 Status nextStatus = ProcessData;
140 Status currentStatus = ProcessData;
141 void (*callback)(
MetaDataType info,
const char* str,
int len) =
nullptr;
144 int mp3_blocksize = 0;
145 int metaDataMaxLen = 0;
150 uint8_t* dataBuffer =
nullptr;
151 void (*dataCallback)(
const uint8_t* str,
int len) =
nullptr;
155 virtual void clear() {
156 nextStatus = ProcessData;
168 inline bool isAscii(uint8_t ch){
return ch < 128;}
173 int m = l < 5 ? l : 10;
174 for (
int j = 0; j < m; j++) {
175 if (!isAscii(result[j]))
return false;
183 metaData.resize(meta_size + 1);
184 metaDataMaxLen = meta_size;
185 memset(metaData.data(), 0, meta_size + 1);
194 if (isAscii(metaData, 12)) {
195 LOGI(
"%s", metaData);
196 StrView meta(metaData, len + 1, len);
197 int start = meta.
indexOf(
"StreamTitle=");
202 if (start >= 0 &&
end > start) {
204 if (callback !=
nullptr) {
205 callback(Title, (
const char*)metaData + start + 1,
end - start);
211 LOGW(
"Unexpected Data: %s", metaData);
218 if (dataBuffer !=
nullptr) {
219 dataBuffer[dataPos++] = ch;
221 if (dataPos >= dataLen) {
222 dataCallback(dataBuffer, dataLen);
245 LOGI(
"icy-metaint: %s", iceMetaintStr);
247 LOGE(
"icy-metaint not defined");
250 int iceMetaint = value.
toInt();
259 if (callback ==
nullptr) {
260 LOGW(
"callback not defined")
262 if (p_url ==
nullptr) {
263 LOGW(
"http not defined")
266 if (callback !=
nullptr && p_url !=
nullptr) {
275 callback(Description, descr.
c_str(), descr.
length());