@@ -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