1
1
#pragma once
2
2
3
- #include " AudioTools/AudioCodecs/HeaderParserMP3.h"
4
3
#include " AudioTools/AudioCodecs/HeaderParserAAC.h"
4
+ #include " AudioTools/AudioCodecs/HeaderParserMP3.h"
5
5
#include " AudioTools/CoreAudio/AudioBasic/StrView.h"
6
6
7
7
namespace audio_tools {
@@ -23,11 +23,12 @@ namespace audio_tools {
23
23
class MimeDetector {
24
24
public:
25
25
MimeDetector () {
26
- setCheck (" audio/mpeg" , checkMP3Ext);
27
- setCheck (" audio/aac" , checkAACExt);
28
26
setCheck (" audio/vnd.wave" , checkWAV);
29
27
setCheck (" audio/ogg" , checkOGG);
30
28
setCheck (" video/MP2T" , checkMP2T);
29
+ setCheck (" audio/prs.sid" , checkSID);
30
+ setCheck (" audio/mpeg" , checkMP3Ext);
31
+ setCheck (" audio/aac" , checkAACExt);
31
32
}
32
33
33
34
bool begin () {
@@ -37,6 +38,7 @@ class MimeDetector {
37
38
38
39
// / write the header to determine the mime
39
40
size_t write (uint8_t * data, size_t len) {
41
+ actual_mime = default_mime;
40
42
determineMime (data, len);
41
43
return len;
42
44
}
@@ -63,25 +65,29 @@ class MimeDetector {
63
65
64
66
// / Provides the actual mime type, that was determined from the first
65
67
// / available data
66
- const char * mime () { return actual_mime; }
68
+ const char * mime () {
69
+ return actual_mime;
70
+ }
67
71
68
72
static bool checkAAC (uint8_t * start, size_t len) {
69
73
return start[0 ] == 0xFF &&
70
74
(start[1 ] == 0xF0 || start[1 ] == 0xF1 || start[1 ] == 0xF9 );
71
75
}
72
76
73
77
static bool checkAACExt (uint8_t * start, size_t len) {
74
- // quick check
75
- if (!(start[0 ] == 0xFF &&
76
- (start[1 ] == 0xF0 || start[1 ] == 0xF1 || start[1 ] == 0xF9 )))
77
- return false ;
78
- HeaderParserMP3 mp3;
78
+ // checking logic for files
79
+ if (memcmp (start+4 , " ftypM4A" , 7 ) == 0 ) {
80
+ return true ;
81
+ }
82
+ // check for streaming
83
+ HeaderParserAAC aac;
79
84
// it should start with a synch word
80
- if (mp3.findSyncWord ((const uint8_t *)start, len) != 0 ) {
85
+ int pos = aac.findSyncWord ((const uint8_t *)start, len);
86
+ if (pos == -1 ) {
81
87
return false ;
82
88
}
83
89
// make sure that it is not an mp3
84
- if (mp3 .isValid (start, len)) {
90
+ if (aac .isValid (start+pos , len-pos )) {
85
91
return false ;
86
92
}
87
93
return true ;
@@ -98,7 +104,7 @@ class MimeDetector {
98
104
}
99
105
100
106
static bool checkWAV (uint8_t * start, size_t len) {
101
- return memcmp (start, " OggS " , 4 ) == 0 ;
107
+ return memcmp (start, " RIFF " , 4 ) == 0 ;
102
108
}
103
109
104
110
static bool checkOGG (uint8_t * start, size_t len) {
@@ -107,12 +113,19 @@ class MimeDetector {
107
113
108
114
// / MPEG-2 TS Byte Stream Format
109
115
static bool checkMP2T (uint8_t * start, size_t len) {
110
- if (len < 189 )
111
- return start[0 ] == 0x47 ;
116
+ if (len < 189 ) return start[0 ] == 0x47 ;
112
117
113
118
return start[0 ] == 0x47 && start[188 ] == 0x47 ;
114
119
}
115
120
121
+ // / Commodore 64 SID File
122
+ static bool checkSID (uint8_t * start, size_t len) {
123
+ return memcmp (start, " PSID" , 4 ) == 0 || memcmp (start, " RSID" , 4 ) == 0 ;
124
+ }
125
+
126
+ // / Provides the default mime type if no mime could be determined
127
+ void setDefaultMime (const char * mime) { default_mime = mime; }
128
+
116
129
protected:
117
130
struct Check {
118
131
const char * mime = nullptr ;
@@ -126,6 +139,7 @@ class MimeDetector {
126
139
Vector<Check> checks{0 };
127
140
bool is_first = false ;
128
141
const char * actual_mime = nullptr ;
142
+ const char * default_mime = nullptr ;
129
143
void (*notifyMimeCallback)(const char * mime) = nullptr ;
130
144
131
145
// / Update the mime type
@@ -147,7 +161,7 @@ class MimeDetector {
147
161
return l_check.mime ;
148
162
}
149
163
}
150
- return nullptr ;
164
+ return default_mime ;
151
165
}
152
166
};
153
167
0 commit comments