3#include "AudioTools/AudioCodecs/MP3HeaderParser.h"
4#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
27 setCheck(
"audio/vnd.wave", checkWAV);
46 for (
int j = 0;
j < checks.size();
j++) {
58 void setMimeCallback(
void (*callback)(
const char*)) {
60 this->notifyMimeCallback = callback;
65 const char*
mime() {
return actual_mime; }
67 static bool checkAAC(
uint8_t* start,
size_t len) {
68 return start[0] == 0xFF &&
69 (start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9);
72 static bool checkAACExt(uint8_t* start,
size_t len) {
74 if (!(start[0] == 0xFF &&
75 (start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9)))
79 if (mp3.findSyncWord((
const uint8_t*)start, len) != 0) {
83 if (mp3.isValid(start, len)) {
89 static bool checkMP3(uint8_t* start,
size_t len) {
90 return memcmp(start,
"ID3", 3) == 0 ||
91 (start[0] == 0xFF && ((start[1] & 0xE0) == 0xE0));
94 static bool checkMP3Ext(uint8_t* start,
size_t len) {
96 return mp3.isValid(start, len);
99 static bool checkWAV(uint8_t* start,
size_t len) {
100 return memcmp(start,
"OggS", 4) == 0;
103 static bool checkOGG(uint8_t* start,
size_t len) {
104 return memcmp(start,
"OggS", 4) == 0;
110 return start[0] == 0x47;
112 return start[0] == 0x47 && start[188] == 0x47;
117 const char* mime =
nullptr;
118 bool (*check)(
uint8_t* data,
size_t len) =
nullptr;
119 Check(
const char* mime,
bool (*check)(
uint8_t* data,
size_t len)) {
126 bool is_first =
false;
127 const char* actual_mime =
nullptr;
128 void (*notifyMimeCallback)(
const char*
mime) =
nullptr;
134 if (notifyMimeCallback !=
nullptr && actual_mime !=
nullptr) {
135 notifyMimeCallback(actual_mime);
143 for (
int j = 0;
j < checks.size();
j++) {
145 if (
l_check.check(data, len)) {