diff --git a/src/Audio.cpp b/src/Audio.cpp index b395b34a..3d67ad4a 100644 --- a/src/Audio.cpp +++ b/src/Audio.cpp @@ -90,6 +90,12 @@ size_t AudioBuffer::bufferFilled() { return m_dataLength; } +size_t AudioBuffer::getMaxAvailableBytes() { + if(m_writePtr >= m_readPtr) { m_dataLength = (m_writePtr - m_readPtr); } + else { m_dataLength = (m_endPtr - m_readPtr);} + return m_dataLength; +} + void AudioBuffer::bytesWritten(size_t bw) { m_writePtr += bw; if(m_writePtr == m_endPtr) { m_writePtr = m_buffer; } @@ -1077,13 +1083,17 @@ bool Audio::latinToUTF8(char* buff, size_t bufflen) { pos = 0; - while(buff[pos] != 0) { - len = strlen(buff); - if(buff[pos] >= 0x80 && buff[pos + 1] < 0x80) { // is not UTF8, is latin? - for(int i = len + 1; i > pos; i--) { buff[i + 1] = buff[i]; } + while(buff[pos] != 0){ + if ((buff[pos] & 0x80) == 0) {pos++; continue;} + else{ + len = strlen(buff); + for(int i = len + 1; i > pos; i--){ + buff[i+1] = buff[i]; + } uint8_t c = buff[pos]; - buff[pos++] = 0xc0 | ((c >> 6) & 0x1f); // 2+1+5 bits - buff[pos++] = 0x80 | ((char)c & 0x3f); // 1+1+6 bits + buff[pos] = 0xc0 | ((c >> 6)& 0x1f); // 2+1+5 bits + pos++; + buff[pos] = 0x80 | ((char)c & 0x3f); // 1+1+6 bits } pos++; if(pos > bufflen - 3) { @@ -1535,14 +1545,13 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) { } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if(m_controlCounter == 2) { // skip extended header if exists - if(ehsz > 256) { - ehsz -= 256; - remainingHeaderBytes -= 256; - return 256; - } // Throw it away - else { - m_controlCounter++; + if(m_controlCounter == 2){ // skip extended header if exists + if(ehsz > len) { + ehsz -=len; + remainingHeaderBytes -= len; + return len;} // Throw it away + else { + m_controlCounter ++; remainingHeaderBytes -= ehsz; return ehsz; } // Throw it away @@ -1597,11 +1606,11 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) { return 6; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if(m_controlCounter == 5) { // If the frame is larger than 512 bytes, skip the rest - if(framesize > 512) { - framesize -= 512; - remainingHeaderBytes -= 512; - return 512; + if(m_controlCounter == 5){ // If the frame is larger than 512 bytes, skip the rest + if(framesize > len){ + framesize -= len; + remainingHeaderBytes -= len; + return len; } else { m_controlCounter = 3; // check next frame @@ -1640,8 +1649,10 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) { } size_t fs = framesize; - if(fs > 512) fs = 512; - for(int i = 0; i < fs; i++) { m_ibuff[i] = *(data + i); } + if(fs >1024) fs = 1024; + for(int i=0; i 0x1F) { - m_ibuff[k] = m_ibuff[j]; + m_ibuff[k] = m_ibuff[j]; //remove non printables k++; } j++; - } // remove non printables - if(k > 0) m_ibuff[k] = 0; - else - m_ibuff[0] = 0; // new termination + } + m_ibuff[k] = '\0'; // new termination + latinToUTF8(m_ibuff, k - 1); } showID3Tag(tag, m_ibuff); return fs; @@ -1693,13 +1700,13 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) { frameid[3] = 0; for(uint8_t i = 0; i < 4; i++) tag[i] = frameid[i]; // tag = frameid remainingHeaderBytes -= 3; - size_t len = bigEndian(data + 3, 3); - universal_tmp = len; + size_t dataLen = bigEndian(data + 3, 3); + universal_tmp = dataLen; remainingHeaderBytes -= 3; char value[256]; - if(len > 249) { len = 249; } - memcpy(value, (data + 7), len); - value[len + 1] = 0; + if(dataLen > 249) {dataLen = 249; } + memcpy(value, (data + 7), dataLen); + value[dataLen + 1] = 0; m_chbuf[0] = 0; if(startsWith(tag, "PIC")) { // image embedded in header if(getDatamode() == AUDIO_LOCALFILE) { @@ -1719,21 +1726,21 @@ int Audio::read_ID3_Header(uint8_t* data, size_t len) { } else { showID3Tag(tag, value); } remainingHeaderBytes -= universal_tmp; - universal_tmp -= len; + universal_tmp -= dataLen; - if(len == 0) m_controlCounter = 98; + if(dataLen == 0) m_controlCounter = 98; if(remainingHeaderBytes == 0) m_controlCounter = 98; - return 3 + 3 + len; + return 3 + 3 + dataLen; } // -- end section V2.2 ----------- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if(m_controlCounter == 98) { // skip all ID3 metadata (mostly spaces) - if(remainingHeaderBytes > 256) { - remainingHeaderBytes -= 256; - return 256; - } // Throw it away + if(m_controlCounter == 98){ // skip all ID3 metadata (mostly spaces) + if(remainingHeaderBytes > len) { + remainingHeaderBytes -=len; + return len; + } // Throw it away else { m_controlCounter = 99; return remainingHeaderBytes; @@ -2887,8 +2894,8 @@ void Audio::processLocalFile() { m_f_running = false; return; } - if(InBuff.bufferFilled() > maxFrameSize) { // read the file header first - InBuff.bytesWasRead(readAudioHeader(InBuff.bufferFilled())); + if(InBuff.bufferFilled() > maxFrameSize){ // read the file header first + InBuff.bytesWasRead(readAudioHeader(InBuff.getMaxAvailableBytes())); } return; } @@ -3150,9 +3157,9 @@ void Audio::processWebFile() { } // we have a webfile, read the file header first - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if(m_controlCounter != 100) { - if(InBuff.bufferFilled() > maxFrameSize) { // read the file header first - int32_t bytesRead = readAudioHeader(maxFrameSize); + if(m_controlCounter != 100){ + if(InBuff.bufferFilled() > maxFrameSize){ // read the file header first + int32_t bytesRead = readAudioHeader(InBuff.getMaxAvailableBytes()); if(bytesRead > 0) InBuff.bytesWasRead(bytesRead); } return; @@ -5866,13 +5873,9 @@ uint32_t Audio::flac_correctResumeFilePos(uint32_t resumeFilePos) { p1 = audiofile.read(); p2 = audiofile.read(); - pos += 2; - while(!found || pos == m_file_size) { - if(p1 == 0xFF && p2 == 0xF8) { - found = true; - log_i("found"); - break; - } + pos+=2; + while(!found || pos == m_file_size){ + if(p1 == 0xFF && p2 == 0xF8){found = true; break;} p1 = p2; p2 = audiofile.read(); pos++; diff --git a/src/Audio.h b/src/Audio.h index c13632fc..41a1d03e 100644 --- a/src/Audio.h +++ b/src/Audio.h @@ -94,6 +94,7 @@ class AudioBuffer { size_t freeSpace(); // number of free bytes to overwrite size_t writeSpace(); // space fom writepointer to bufferend size_t bufferFilled(); // returns the number of filled bytes + size_t getMaxAvailableBytes(); // max readable bytes in one block void bytesWritten(size_t bw); // update writepointer void bytesWasRead(size_t br); // update readpointer uint8_t* getWritePtr(); // returns the current writepointer