Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
ESP32-audioI2S
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
ESP32-audioI2S
Commits
fe1f37c9
Unverified
Commit
fe1f37c9
authored
Jan 11, 2023
by
Wolle
Committed by
GitHub
Jan 11, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix ESP crashes during playing local MP3 file with ID3 Tag v2.2
parent
be305923
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
34 deletions
+56
-34
src/Audio.cpp
src/Audio.cpp
+53
-33
src/Audio.h
src/Audio.h
+3
-1
No files found.
src/Audio.cpp
View file @
fe1f37c9
/*
7d
/*
* Audio.cpp
*
* Created on: Oct 26.2018
*
* Version 2.0.8
b
* Updated on: Jan 1
0
.2023
* Version 2.0.8
c
* Updated on: Jan 1
1
.2023
* Author: Wolle (schreibfaul1)
*
*/
...
...
@@ -959,7 +959,7 @@ void Audio::showID3Tag(const char* tag, const char* value){
if
(
!
strcmp
(
tag
,
"IPL"
))
sprintf
(
m_chbuf
,
"Involved people list: %s"
,
value
);
if
(
!
strcmp
(
tag
,
"PIC"
))
sprintf
(
m_chbuf
,
"Attached picture: %s"
,
value
);
if
(
!
strcmp
(
tag
,
"SLT"
))
sprintf
(
m_chbuf
,
"Synchronized lyric/text: %s"
,
value
);
//
if(!strcmp(tag, "TAL")) sprintf(m_chbuf, "Album/Movie/Show title: %s", value);
if
(
!
strcmp
(
tag
,
"TAL"
))
sprintf
(
m_chbuf
,
"Album/Movie/Show title: %s"
,
value
);
if
(
!
strcmp
(
tag
,
"TBP"
))
sprintf
(
m_chbuf
,
"BPM (Beats Per Minute): %s"
,
value
);
if
(
!
strcmp
(
tag
,
"TCM"
))
sprintf
(
m_chbuf
,
"Composer: %s"
,
value
);
if
(
!
strcmp
(
tag
,
"TCO"
))
sprintf
(
m_chbuf
,
"Content type: %s"
,
value
);
...
...
@@ -1524,7 +1524,8 @@ int Audio::read_FLAC_Header(uint8_t *data, size_t len) {
int
Audio
::
read_ID3_Header
(
uint8_t
*
data
,
size_t
len
)
{
static
size_t
id3Size
;
static
size_t
headerSize
;
static
size_t
remainingHeaderBytes
;
static
size_t
universal_tmp
=
0
;
static
uint8_t
ID3version
;
static
int
ehsz
=
0
;
static
char
tag
[
5
];
...
...
@@ -1543,7 +1544,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
}
m_controlCounter
++
;
APIC_seen
=
false
;
headerSize
=
0
;
remainingHeaderBytes
=
0
;
ehsz
=
0
;
if
(
specialIndexOf
(
data
,
"ID3"
,
4
)
!=
0
)
{
// ID3 not found
if
(
!
m_f_m3u8data
)
AUDIO_INFO
(
"file has no mp3 tag, skip metadata"
);
...
...
@@ -1573,9 +1574,9 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
if
(
ID3version
==
2
){
m_controlCounter
=
10
;
}
headerSize
=
id3Size
;
remainingHeaderBytes
=
id3Size
;
m_ID3Size
=
id3Size
;
headerSize
-=
10
;
remainingHeaderBytes
-=
10
;
return
10
;
}
...
...
@@ -1585,7 +1586,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
if
(
m_f_exthdr
)
{
AUDIO_INFO
(
"ID3 extended header"
);
ehsz
=
bigEndian
(
data
,
4
);
headerSize
-=
4
;
remainingHeaderBytes
-=
4
;
ehsz
-=
4
;
return
4
;
}
...
...
@@ -1598,16 +1599,16 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
if
(
m_controlCounter
==
2
){
// skip extended header if exists
if
(
ehsz
>
256
)
{
ehsz
-=
256
;
headerSize
-=
256
;
remainingHeaderBytes
-=
256
;
return
256
;}
// Throw it away
else
{
m_controlCounter
++
;
headerSize
-=
ehsz
;
remainingHeaderBytes
-=
ehsz
;
return
ehsz
;}
// Throw it away
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if
(
m_controlCounter
==
3
){
// read a ID3 frame, get the tag
if
(
headerSize
==
0
){
if
(
remainingHeaderBytes
==
0
){
m_controlCounter
=
99
;
return
0
;
}
...
...
@@ -1619,7 +1620,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
frameid
[
4
]
=
0
;
for
(
uint8_t
i
=
0
;
i
<
4
;
i
++
)
tag
[
i
]
=
frameid
[
i
];
// tag = frameid
headerSize
-=
4
;
remainingHeaderBytes
-=
4
;
if
(
frameid
[
0
]
==
0
&&
frameid
[
1
]
==
0
&&
frameid
[
2
]
==
0
&&
frameid
[
3
]
==
0
)
{
// We're in padding
m_controlCounter
=
98
;
// all ID3 metadata processed
...
...
@@ -1636,18 +1637,18 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
else
{
framesize
=
bigEndian
(
data
,
4
);
// << 8
}
headerSize
-=
4
;
remainingHeaderBytes
-=
4
;
uint8_t
flag
=
*
(
data
+
4
);
// skip 1st flag
(
void
)
flag
;
headerSize
--
;
remainingHeaderBytes
--
;
compressed
=
(
*
(
data
+
5
))
&
0x80
;
// Frame is compressed using [#ZLIB zlib] with 4 bytes for 'decompressed
// size' appended to the frame header.
headerSize
--
;
remainingHeaderBytes
--
;
uint32_t
decompsize
=
0
;
if
(
compressed
){
if
(
m_f_Log
)
log_i
(
"iscompressed"
);
decompsize
=
bigEndian
(
data
+
6
,
4
);
headerSize
-=
4
;
remainingHeaderBytes
-=
4
;
(
void
)
decompsize
;
if
(
m_f_Log
)
log_i
(
"decompsize=%u"
,
decompsize
);
return
6
+
4
;
...
...
@@ -1658,12 +1659,12 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
if
(
m_controlCounter
==
5
){
// If the frame is larger than 256 bytes, skip the rest
if
(
framesize
>
256
){
framesize
-=
256
;
headerSize
-=
256
;
remainingHeaderBytes
-=
256
;
return
256
;
}
else
{
m_controlCounter
=
3
;
// check next frame
headerSize
-=
framesize
;
remainingHeaderBytes
-=
framesize
;
return
framesize
;
}
}
...
...
@@ -1682,7 +1683,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
isUnicode
=
false
;
if
(
getDatamode
()
==
AUDIO_LOCALFILE
){
APIC_seen
=
true
;
APIC_pos
=
id3Size
-
headerSize
;
APIC_pos
=
id3Size
-
remainingHeaderBytes
;
APIC_size
=
framesize
;
}
return
0
;
...
...
@@ -1694,7 +1695,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
value
[
i
]
=
*
(
data
+
i
);
}
framesize
-=
fs
;
headerSize
-=
fs
;
remainingHeaderBytes
-=
fs
;
value
[
fs
]
=
0
;
if
(
isUnicode
&&
fs
>
1
)
{
unicode2utf8
(
value
,
fs
);
// convert unicode to utf-8 U+0020...U+07FF
...
...
@@ -1718,26 +1719,45 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// -- section V2.2 only , greater Vers above ----
// --- section V2.2 only , greater Vers above ----
// see https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2.2.html
if
(
m_controlCounter
==
10
){
// frames in V2.2, 3bytes identifier, 3bytes size descriptor
if
(
universal_tmp
>
0
){
if
(
universal_tmp
>
256
)
{
universal_tmp
-=
256
;
return
256
;}
else
{
uint8_t
t
=
universal_tmp
;
universal_tmp
=
0
;
return
t
;}
}
frameid
[
0
]
=
*
(
data
+
0
);
frameid
[
1
]
=
*
(
data
+
1
);
frameid
[
2
]
=
*
(
data
+
2
);
frameid
[
3
]
=
0
;
for
(
uint8_t
i
=
0
;
i
<
4
;
i
++
)
tag
[
i
]
=
frameid
[
i
];
// tag = frameid
headerSize
-=
3
;
remainingHeaderBytes
-=
3
;
size_t
len
=
bigEndian
(
data
+
3
,
3
);
headerSize
-=
3
;
headerSize
-=
len
;
universal_tmp
=
len
;
remainingHeaderBytes
-=
3
;
char
value
[
256
];
size_t
tmp
=
len
;
if
(
tmp
>
254
)
tmp
=
254
;
memcpy
(
value
,
(
data
+
7
),
tmp
);
value
[
tmp
+
1
]
=
0
;
if
(
len
>
249
)
{
len
=
249
;
}
memcpy
(
value
,
(
data
+
7
),
len
);
value
[
len
+
1
]
=
0
;
m_chbuf
[
0
]
=
0
;
if
(
startsWith
(
tag
,
"PIC"
))
{
// image embedded in header
if
(
getDatamode
()
==
AUDIO_LOCALFILE
){
APIC_seen
=
true
;
// #460
APIC_pos
=
id3Size
-
remainingHeaderBytes
;
APIC_size
=
universal_tmp
;
if
(
m_f_Log
)
log_i
(
"Attached picture seen at pos %d length %d"
,
APIC_pos
,
APIC_size
);
}
}
else
{
showID3Tag
(
tag
,
value
);
}
remainingHeaderBytes
-=
universal_tmp
;
universal_tmp
-=
len
;
showID3Tag
(
tag
,
value
);
if
(
len
==
0
)
m_controlCounter
=
98
;
if
(
remainingHeaderBytes
==
0
)
m_controlCounter
=
98
;
return
3
+
3
+
len
;
}
...
...
@@ -1745,13 +1765,13 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if
(
m_controlCounter
==
98
){
// skip all ID3 metadata (mostly spaces)
if
(
headerSize
>
256
)
{
headerSize
-=
256
;
if
(
remainingHeaderBytes
>
256
)
{
remainingHeaderBytes
-=
256
;
return
256
;
}
// Throw it away
else
{
m_controlCounter
=
99
;
return
headerSize
;
return
remainingHeaderBytes
;
}
// Throw it away
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...
...
src/Audio.h
View file @
fe1f37c9
...
...
@@ -2,7 +2,9 @@
* Audio.h
*
* Created on: Oct 28,2018
* Updated on: Jan 10,2023
*
* Version 2.0.8c
* Updated on: Jan 11,2023
* Author: Wolle (schreibfaul1)
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment