#include "data_sources.h" ////////////// SDDataSource ////////////// SDDataSource::SDDataSource(String file) { _file = SD.open(file, "r"); } SDDataSource::~SDDataSource() { if (_file) _file.close(); } size_t SDDataSource::read(uint8_t* buf, size_t len) { return _file.read(buf, len); } int SDDataSource::read() { return _file.read(); } size_t SDDataSource::position() { return _file.position(); } void SDDataSource::seek(size_t position) { _file.seek(position); } size_t SDDataSource::size() { return _file.size(); } void SDDataSource::close() { _file.close(); } bool SDDataSource::usable() { return _file; } void SDDataSource::skip_id3_tag() { uint32_t original_position = _file.position(); uint32_t offset = 0; if (_file.read()=='I' && _file.read()=='D' && _file.read()=='3') { DEBUG("ID3 tag found\n"); // Skip ID3 tag version _file.read(); _file.read(); byte tags = _file.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 & _file.read()); } offset += 10; if (footer_present) offset += 10; DEBUG("ID3 tag length is %d bytes.\n", offset); _file.seek(offset); } else { DEBUG("No ID3 tag found\n"); _file.seek(original_position); } } ////////////// HTTPSDataSource ////////////// HTTPSDataSource::HTTPSDataSource(String url, uint32_t offset) { _http = new HTTPClientWrapper(); if (!_http->get(url, offset)) return; _position = 0; } HTTPSDataSource::~HTTPSDataSource() { _http->close(); delete _http; } bool HTTPSDataSource::usable() { return _http; } size_t HTTPSDataSource::read(uint8_t* buf, size_t len) { size_t result = _http->read(buf, len); _position += result; return result; } int HTTPSDataSource::read() { int b = _http->read(); if (b>=0) _position++; return b; } size_t HTTPSDataSource::position() { return _position; } void HTTPSDataSource::seek(size_t position) { return; /* TODO */ } size_t HTTPSDataSource::size() { return _http->getSize(); } void HTTPSDataSource::close() { _http->close(); }