Skip ID3 tags. They can get quite large...
This commit is contained in:
parent
f29e38160a
commit
b5c29eaa38
@ -52,6 +52,7 @@ private:
|
|||||||
void _set_last_track(const char* album, uint8_t track, uint32_t position);
|
void _set_last_track(const char* album, uint8_t track, uint32_t position);
|
||||||
std::map<String, album_state> _last_tracks;
|
std::map<String, album_state> _last_tracks;
|
||||||
void _play_file(String filename, uint32_t offset);
|
void _play_file(String filename, uint32_t offset);
|
||||||
|
uint32_t _id3_tag_offset(File f);
|
||||||
void _finish_playing();
|
void _finish_playing();
|
||||||
void _finish_stopping();
|
void _finish_stopping();
|
||||||
void _mute();
|
void _mute();
|
||||||
|
@ -334,13 +334,40 @@ void Player::_play_file(String file, uint32_t file_offset) {
|
|||||||
_write_control_register(SCI_STATUS, _read_control_register(SCI_STATUS) & ~SS_DO_NOT_JUMP);
|
_write_control_register(SCI_STATUS, _read_control_register(SCI_STATUS) & ~SS_DO_NOT_JUMP);
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
|
if (file_offset == 0) {
|
||||||
|
_file.seek(_id3_tag_offset(_file));
|
||||||
|
}
|
||||||
_refills = 0;
|
_refills = 0;
|
||||||
_current_play_position = 0;
|
_current_play_position = _file.position();
|
||||||
_skip_to = file_offset;
|
_skip_to = file_offset;
|
||||||
if (_skip_to>0) _mute();
|
if (_skip_to>0) _mute();
|
||||||
INFO("Now playing.\n");
|
INFO("Now playing.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Player::_id3_tag_offset(File f) {
|
||||||
|
uint32_t original_position = f.position();
|
||||||
|
uint32_t offset = 0;
|
||||||
|
if (f.read()=='I' && f.read()=='D' && f.read()=='3') {
|
||||||
|
DEBUG("ID3 tag found\n");
|
||||||
|
// Skip ID3 tag version
|
||||||
|
f.read(); f.read();
|
||||||
|
byte tags = f.read();
|
||||||
|
bool footer_present = tags & 0x10;
|
||||||
|
DEBUG("ID3 footer found: %d\n", footer_present);
|
||||||
|
for (byte i=0; i<4; i++) {
|
||||||
|
offset <<= 7;
|
||||||
|
offset |= (0x7F & f.read());
|
||||||
|
}
|
||||||
|
offset += 10;
|
||||||
|
if (footer_present) offset += 10;
|
||||||
|
DEBUG("ID3 tag length is %d bytes.\n", offset);
|
||||||
|
} else {
|
||||||
|
DEBUG("No ID3 tag found\n");
|
||||||
|
}
|
||||||
|
f.seek(original_position);
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
void Player::_flush(uint count, int8_t byte) {
|
void Player::_flush(uint count, int8_t byte) {
|
||||||
SPIMaster::enable(XDCS);
|
SPIMaster::enable(XDCS);
|
||||||
SPI.beginTransaction(*_spi_settings);
|
SPI.beginTransaction(*_spi_settings);
|
||||||
|
Loading…
Reference in New Issue
Block a user