Skip to content

Commit a07ac19

Browse files
committed
SYLT, new ontrolCounter
1 parent 7a4e08e commit a07ac19

File tree

1 file changed

+87
-87
lines changed

1 file changed

+87
-87
lines changed

src/Audio.cpp

Lines changed: 87 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,93 +1914,8 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) {
19141914
return 0;
19151915
}
19161916

1917-
if( // any lyrics embedded in file, passing it to external function
1918-
startsWith(m_ID3Hdr.tag, "SYLT") || startsWith(m_ID3Hdr.tag, "USLT")) {
1919-
if(m_dataMode == AUDIO_LOCALFILE || (m_streamType == ST_WEBFILE && m_f_acceptRanges)) {
1920-
ps_ptr<char> tmp;
1921-
ps_ptr<char> content_descriptor;
1922-
ps_ptr<char> syltBuff;
1923-
bool isBigEndian = true;
1924-
size_t len = 0;
1925-
int idx = 0;
1926-
1927-
m_ID3Hdr.SYLT.seen = true;
1928-
m_ID3Hdr.SYLT.pos = m_ID3Hdr.id3Size - m_ID3Hdr.remainingHeaderBytes;
1929-
m_ID3Hdr.SYLT.size = m_ID3Hdr.framesize;
1930-
1931-
syltBuff.alloc(m_ID3Hdr.SYLT.size, "syltBuff");
1932-
1933-
if(m_streamType == ST_WEBFILE && m_f_acceptRanges){
1934-
uint32_t pos = m_pwf.byteCounter;
1935-
// log_w("m_audiofile.position() %i, m_ID3Hdr.SYLT.pos %i", pos, m_ID3Hdr.SYLT.pos);
1936-
bool res;
1937-
res = httpRange(m_currentHost.c_get(), m_ID3Hdr.SYLT.pos);
1938-
if(!res) AUDIO_LOG_ERROR("http range request was not successful");
1939-
res = parseHttpRangeHeader();
1940-
if(!res) AUDIO_LOG_ERROR("http range response was not successful");
1941-
uint16_t bytesWritten = 0;
1942-
while(bytesWritten < m_ID3Hdr.SYLT.size){
1943-
bytesWritten += _client->read((uint8_t*)syltBuff.get() + bytesWritten, m_ID3Hdr.SYLT.size);
1944-
}
1945-
res = httpRange(m_currentHost.c_get(), pos);
1946-
if(!res) AUDIO_LOG_ERROR("http range request was not successful");
1947-
res = parseHttpRangeHeader();
1948-
if(!res) AUDIO_LOG_ERROR("http range response was not successful");
1949-
}
1950-
if(m_dataMode == AUDIO_LOCALFILE){
1951-
uint32_t pos = m_audiofile.position();
1952-
// log_w("m_audiofile.position() %i, m_ID3Hdr.SYLT.pos %i", pos, m_ID3Hdr.SYLT.pos);
1953-
m_audiofile.seek(m_ID3Hdr.SYLT.pos);
1954-
uint16_t bytesWritten = 0;
1955-
while(bytesWritten < m_ID3Hdr.SYLT.size){
1956-
bytesWritten += m_audiofile.read((uint8_t*)syltBuff.get() + bytesWritten, m_ID3Hdr.SYLT.size);
1957-
}
1958-
m_audiofile.seek(pos);
1959-
}
1960-
// syltBuff.hex_dump(10);
1961-
1962-
m_ID3Hdr.SYLT.text_encoding = syltBuff[0]; // 0=ISO-8859-1, 1=UTF-16, 2=UTF-16BE, 3=UTF-8
1963-
if(m_ID3Hdr.SYLT.text_encoding == 1) isBigEndian = false;
1964-
if(m_ID3Hdr.SYLT.text_encoding > 3){AUDIO_LOG_ERROR("unknown text encoding: %i", m_ID3Hdr.SYLT.text_encoding), m_ID3Hdr.SYLT.text_encoding = 0;}
1965-
char encodingTab [4][12] = {"ISO-8859-1", "UTF-16", "UTF-16BE", "UTF-8"};
1966-
memcpy(m_ID3Hdr.SYLT.lang, syltBuff.get() + 1, 3); m_ID3Hdr.SYLT.lang[3] = '\0';
1967-
AUDIO_INFO("Lyrics: text_encoding: %s, language: %s, size %i", encodingTab[m_ID3Hdr.SYLT.text_encoding], m_ID3Hdr.SYLT.lang, m_ID3Hdr.SYLT.size);
1968-
m_ID3Hdr.SYLT.time_stamp_format = syltBuff[4];
1969-
m_ID3Hdr.SYLT.content_type = syltBuff[5];
1970-
1971-
idx = 6;
1972-
1973-
if(m_ID3Hdr.SYLT.text_encoding == 0 || m_ID3Hdr.SYLT.text_encoding == 3){ // utf-8
1974-
len = content_descriptor.copy_from((const char*)(syltBuff.get() + idx), "content_descriptor");
1975-
}
1976-
else{ // utf-16
1977-
len = content_descriptor.copy_from_utf16((const uint8_t*)(syltBuff.get() + idx), isBigEndian, "content_descriptor");
1978-
}
1979-
if(len > 2) AUDIO_INFO("Lyrics: content_descriptor: %s", content_descriptor.c_get());
1980-
idx += len;
1981-
1982-
while (idx < m_ID3Hdr.SYLT.size) {
1983-
// UTF-16LE, UTF-16BE
1984-
if (m_ID3Hdr.SYLT.text_encoding == 1 || m_ID3Hdr.SYLT.text_encoding == 2) {
1985-
idx += tmp.copy_from_utf16((const uint8_t*)(syltBuff.get() + idx), isBigEndian, "sylt-text");
1986-
} else {
1987-
// ISO-8859-1 / UTF-8
1988-
idx += tmp.copy_from((const char*)syltBuff.get() + idx, "sylt-text");
1989-
}
1990-
if (tmp.starts_with("\n")) tmp.remove_before(1);
1991-
m_syltLines.push_back(std::move(tmp));
1992-
1993-
if (idx + 4 > m_ID3Hdr.SYLT.size) break; // no more 4 bytes?
1994-
1995-
uint32_t timestamp = bigEndian((uint8_t*)syltBuff.get() + idx, 4);
1996-
m_syltTimeStamp.push_back(timestamp);
1997-
1998-
idx += 4;
1999-
}
2000-
for(int i = 0; i < m_syltLines.size(); i++){
2001-
AUDIO_INFO("%07i ms, %s", m_syltTimeStamp[i], m_syltLines[i].c_get());
2002-
}
2003-
}
1917+
if(startsWith(m_ID3Hdr.tag, "SYLT") || startsWith(m_ID3Hdr.tag, "USLT")) { // any lyrics embedded in file, passing it to external function
1918+
m_controlCounter = 7;
20041919
return 0;
20051920
}
20061921

@@ -2086,6 +2001,91 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) {
20862001
}
20872002
return fs;
20882003
}
2004+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2005+
if(m_controlCounter == 7) { // SYLT
2006+
m_controlCounter = 5;
2007+
if(m_dataMode == AUDIO_LOCALFILE || (m_streamType == ST_WEBFILE && m_f_acceptRanges)) {
2008+
ps_ptr<char> tmp;
2009+
ps_ptr<char> content_descriptor;
2010+
ps_ptr<char> syltBuff;
2011+
bool isBigEndian = true;
2012+
size_t len = 0;
2013+
int idx = 0;
2014+
m_ID3Hdr.SYLT.seen = true;
2015+
m_ID3Hdr.SYLT.pos = m_ID3Hdr.id3Size - m_ID3Hdr.remainingHeaderBytes;
2016+
m_ID3Hdr.SYLT.size = m_ID3Hdr.framesize;
2017+
syltBuff.alloc(m_ID3Hdr.SYLT.size, "syltBuff");
2018+
if(m_streamType == ST_WEBFILE && m_f_acceptRanges){
2019+
uint32_t pos = m_pwf.byteCounter;
2020+
// log_w("m_audiofile.position() %i, m_ID3Hdr.SYLT.pos %i", pos, m_ID3Hdr.SYLT.pos);
2021+
bool res;
2022+
res = httpRange(m_currentHost.c_get(), m_ID3Hdr.SYLT.pos);
2023+
if(!res) AUDIO_LOG_ERROR("http range request was not successful");
2024+
res = parseHttpRangeHeader();
2025+
if(!res) AUDIO_LOG_ERROR("http range response was not successful");
2026+
uint16_t bytesWritten = 0;
2027+
while(bytesWritten < m_ID3Hdr.SYLT.size){
2028+
bytesWritten += _client->read((uint8_t*)syltBuff.get() + bytesWritten, m_ID3Hdr.SYLT.size);
2029+
}
2030+
res = httpRange(m_currentHost.c_get(), pos);
2031+
if(!res) AUDIO_LOG_ERROR("http range request was not successful");
2032+
res = parseHttpRangeHeader();
2033+
if(!res) AUDIO_LOG_ERROR("http range response was not successful");
2034+
}
2035+
if(m_dataMode == AUDIO_LOCALFILE){
2036+
uint32_t pos = m_audiofile.position();
2037+
// log_w("m_audiofile.position() %i, m_ID3Hdr.SYLT.pos %i", pos, m_ID3Hdr.SYLT.pos);
2038+
m_audiofile.seek(m_ID3Hdr.SYLT.pos);
2039+
uint16_t bytesWritten = 0;
2040+
while(bytesWritten < m_ID3Hdr.SYLT.size){
2041+
bytesWritten += m_audiofile.read((uint8_t*)syltBuff.get() + bytesWritten, m_ID3Hdr.SYLT.size);
2042+
}
2043+
m_audiofile.seek(pos);
2044+
}
2045+
// syltBuff.hex_dump(10);
2046+
m_ID3Hdr.SYLT.text_encoding = syltBuff[0]; // 0=ISO-8859-1, 1=UTF-16, 2=UTF-16BE, 3=UTF-8
2047+
if(m_ID3Hdr.SYLT.text_encoding == 1) isBigEndian = false;
2048+
if(m_ID3Hdr.SYLT.text_encoding > 3){AUDIO_LOG_ERROR("unknown text encoding: %i", m_ID3Hdr.SYLT.text_encoding), m_ID3Hdr.SYLT.text_encoding = 0;}
2049+
char encodingTab [4][12] = {"ISO-8859-1", "UTF-16", "UTF-16BE", "UTF-8"};
2050+
memcpy(m_ID3Hdr.SYLT.lang, syltBuff.get() + 1, 3); m_ID3Hdr.SYLT.lang[3] = '\0';
2051+
AUDIO_INFO("Lyrics: text_encoding: %s, language: %s, size %i", encodingTab[m_ID3Hdr.SYLT.text_encoding], m_ID3Hdr.SYLT.lang, m_ID3Hdr.SYLT.size);
2052+
m_ID3Hdr.SYLT.time_stamp_format = syltBuff[4];
2053+
m_ID3Hdr.SYLT.content_type = syltBuff[5];
2054+
idx = 6;
2055+
if(m_ID3Hdr.SYLT.text_encoding == 0 || m_ID3Hdr.SYLT.text_encoding == 3){ // utf-8
2056+
len = content_descriptor.copy_from((const char*)(syltBuff.get() + idx), "content_descriptor");
2057+
}
2058+
else{ // utf-16
2059+
len = content_descriptor.copy_from_utf16((const uint8_t*)(syltBuff.get() + idx), isBigEndian, "content_descriptor");
2060+
}
2061+
if(len > 2) AUDIO_INFO("Lyrics: content_descriptor: %s", content_descriptor.c_get());
2062+
idx += len;
2063+
while (idx < m_ID3Hdr.SYLT.size) {
2064+
// UTF-16LE, UTF-16BE
2065+
if (m_ID3Hdr.SYLT.text_encoding == 1 || m_ID3Hdr.SYLT.text_encoding == 2) {
2066+
idx += tmp.copy_from_utf16((const uint8_t*)(syltBuff.get() + idx), isBigEndian, "sylt-text");
2067+
} else {
2068+
// ISO-8859-1 / UTF-8
2069+
idx += tmp.copy_from((const char*)syltBuff.get() + idx, "sylt-text");
2070+
}
2071+
if (tmp.starts_with("\n")) tmp.remove_before(1);
2072+
m_syltLines.push_back(std::move(tmp));
2073+
if (idx + 4 > m_ID3Hdr.SYLT.size) break; // no more 4 bytes?
2074+
uint32_t timestamp = bigEndian((uint8_t*)syltBuff.get() + idx, 4);
2075+
m_syltTimeStamp.push_back(timestamp);
2076+
idx += 4;
2077+
}
2078+
for(int i = 0; i < m_syltLines.size(); i++){
2079+
AUDIO_INFO("%07i ms, %s", m_syltTimeStamp[i], m_syltLines[i].c_get());
2080+
}
2081+
}
2082+
return 0;
2083+
}
2084+
2085+
2086+
2087+
2088+
20892089
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20902090

20912091
// --- section V2.2 only , greater Vers above ----

0 commit comments

Comments
 (0)