3#include "AudioTools/AudioCodecs/HeaderParserAAC.h"
4#include "AudioTools/AudioCodecs/HeaderParserMP3.h"
5#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
26 setCheck(
"audio/vnd.wave", checkWAV);
41 size_t write(uint8_t* data,
size_t len) {
42 actual_mime = default_mime;
41 size_t write(uint8_t* data,
size_t len) {
…}
48 void setCheck(
const char*
mime,
bool (*check)(uint8_t* start,
size_t len)) {
50 for (
int j = 0; j < checks.size(); j++) {
51 Check l_check = checks[j];
52 if (mime_str.equals(l_check.mime)) {
53 l_check.check = check;
58 checks.push_back(check_to_add);
48 void setCheck(
const char*
mime,
bool (*check)(uint8_t* start,
size_t len)) {
…}
62 void setMimeCallback(
void (*callback)(
const char*)) {
64 this->notifyMimeCallback = callback;
69 const char*
mime() {
return actual_mime; }
71 static bool checkAAC(uint8_t* start,
size_t len) {
72 return start[0] == 0xFF &&
73 (start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9);
76 static bool checkAACExt(uint8_t* start,
size_t len) {
78 if (memcmp(start + 4,
"ftypM4A", 7) == 0) {
84 int pos = aac.findSyncWord((
const uint8_t*)start, len);
89 if (aac.isValid(start + pos, len - pos)) {
95 static bool checkMP3(uint8_t* start,
size_t len) {
96 return memcmp(start,
"ID3", 3) == 0 ||
97 (start[0] == 0xFF && ((start[1] & 0xE0) == 0xE0));
100 static bool checkMP3Ext(uint8_t* start,
size_t len) {
102 return mp3.isValid(start, len);
105 static bool checkWAV(uint8_t* start,
size_t len) {
106 return memcmp(start,
"RIFF", 4) == 0;
109 static bool checkOGG(uint8_t* start,
size_t len) {
110 return memcmp(start,
"OggS", 4) == 0;
115 if (len < 189)
return start[0] == 0x47;
117 return start[0] == 0x47 && start[188] == 0x47;
122 return memcmp(start,
"PSID", 4) == 0 || memcmp(start,
"RSID", 4) == 0;
125 static bool checkM4A(uint8_t* header,
size_t len) {
126 if (len < 12)
return false;
129 if (memcmp(header,
"ID3", 3) == 0)
return false;
132 if (memcmp(header + 4,
"mdat", 4) != 0)
return true;
135 if (memcmp(header + 4,
"ftyp", 4) != 0)
return false;
138 if (memcmp(header + 8,
"M4A ", 4) == 0 ||
139 memcmp(header + 8,
"mp42", 4) == 0 ||
140 memcmp(header + 8,
"isom", 4) == 0)
151 const char* mime =
nullptr;
152 bool (*check)(uint8_t* data,
size_t len) =
nullptr;
153 Check(
const char* mime,
bool (*check)(uint8_t* data,
size_t len)) {
160 bool is_first =
false;
161 const char* actual_mime =
nullptr;
162 const char* default_mime =
nullptr;
163 void (*notifyMimeCallback)(
const char*
mime) =
nullptr;
168 actual_mime =
lookupMime((uint8_t*)data, len);
169 if (notifyMimeCallback !=
nullptr && actual_mime !=
nullptr) {
170 notifyMimeCallback(actual_mime);
178 for (
int j = 0; j < checks.size(); j++) {
179 Check l_check = checks[j];
180 if (l_check.check(data, len)) {