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 actual_mime = default_mime;
49 for (
int j = 0;
j < checks.size();
j++) {
61 void setMimeCallback(
void (*callback)(
const char*)) {
63 this->notifyMimeCallback = callback;
72 static bool checkAAC(
uint8_t* start,
size_t len) {
73 return start[0] == 0xFF &&
74 (start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9);
77 static bool checkAACExt(uint8_t* start,
size_t len) {
79 if (memcmp(start+4,
"ftypM4A", 7) == 0) {
85 int pos = aac.findSyncWord((
const uint8_t*)start, len);
90 if (aac.isValid(start+pos, len-pos)) {
96 static bool checkMP3(uint8_t* start,
size_t len) {
97 return memcmp(start,
"ID3", 3) == 0 ||
98 (start[0] == 0xFF && ((start[1] & 0xE0) == 0xE0));
101 static bool checkMP3Ext(uint8_t* start,
size_t len) {
103 return mp3.isValid(start, len);
106 static bool checkWAV(uint8_t* start,
size_t len) {
107 return memcmp(start,
"RIFF", 4) == 0;
110 static bool checkOGG(uint8_t* start,
size_t len) {
111 return memcmp(start,
"OggS", 4) == 0;
116 if (len < 189)
return start[0] == 0x47;
118 return start[0] == 0x47 && start[188] == 0x47;
123 return memcmp(start,
"PSID", 4) == 0 ||
memcmp(start,
"RSID", 4) == 0;
131 const char* mime =
nullptr;
132 bool (*check)(
uint8_t* data,
size_t len) =
nullptr;
133 Check(
const char* mime,
bool (*check)(
uint8_t* data,
size_t len)) {
140 bool is_first =
false;
141 const char* actual_mime =
nullptr;
142 const char* default_mime =
nullptr;
143 void (*notifyMimeCallback)(
const char*
mime) =
nullptr;
149 if (notifyMimeCallback !=
nullptr && actual_mime !=
nullptr) {
150 notifyMimeCallback(actual_mime);
158 for (
int j = 0;
j < checks.size();
j++) {
160 if (
l_check.check(data, len)) {