Description
Arduino 1.8.19
LilyPad MP3
I was having a few issues when attempting to play an mp3 from a specified ms time and found the following.
-
The variable "bitrate" is declared in SFEMP3Shield.h as a uint8_t, which only allows bitrates up to 224kbps. I changed it to uint16_t which solves that issue.
-
The If...else if... else if... else statement found in the getBitRateFromMP3File(filename) function (SFEMP3Shield.cpp) seems to not be functioning as, I imagine, it should be. If the MP3 file is MPEG Version 2/2.5 then the first if statement evaluates true, and no other code is run in the if/else if block.... causing the "bitrate" variable to be filled with an incorrect bitrate.
I tested with multiple files, bitrates, and sample rates and was getting incorrect bitrates often.
//found the 11 1's
//parse version, layer and bitrate out and save bitrate
if(!(temp & 0b00001000)) { //!true if Version 1, !false version 2 and 2.5
row_num = 3;
}
else if((temp & 0b00000110) == 0b00000100) { //true if layer 2, false if layer 1 or 3
row_num += 1;
}
else if((temp & 0b00000110) == 0b00000010) { //true if layer 3, false if layer 2 or 1
row_num += 2;
} else {
continue; // Not found, need to skip the rest and continue looking.
// \warning But this can lead to a dead end and file end of file.
}
I seem to have fixed my issue by replacing the existing if...else if....else if...else with the following.
bool nobits = true;
if(!(temp & 0b00001000)) {
// MPEG Version 2 or 2.5
row_num = 3;
nobits = false;
}
if((temp & 0b00000110) == 0b00000110) {
// Layer 1
//row_num += 0;
nobits = false;
}
if((temp & 0b00000110) == 0b00000100) {
// Layer 2
row_num += 1;
nobits = false;
}
if((temp & 0b00000110) == 0b00000010) {
// Layer 3
row_num += 2;
nobits = false;
}
if(nobits){
continue;
}
These two changes allowed me to play any file from any ms timestamp, without issue.