diff --git a/yoRadio/data/www/index.html b/yoRadio/data/www/index.html index 115130f..8dd0600 100644 --- a/yoRadio/data/www/index.html +++ b/yoRadio/data/www/index.html @@ -65,7 +65,7 @@
0:00
- +
volume: 0
diff --git a/yoRadio/data/www/script.js.gz b/yoRadio/data/www/script.js.gz index 52bca8b..e90f34f 100644 Binary files a/yoRadio/data/www/script.js.gz and b/yoRadio/data/www/script.js.gz differ diff --git a/yoRadio/src/audioI2S/Audio.cpp b/yoRadio/src/audioI2S/Audio.cpp index 8594995..acdf63a 100644 --- a/yoRadio/src/audioI2S/Audio.cpp +++ b/yoRadio/src/audioI2S/Audio.cpp @@ -1300,6 +1300,7 @@ int Audio::read_WAV_Header(uint8_t* data, size_t len) { if(m_streamType == ST_WEBFILE) m_audioDataSize = m_contentlength - headerSize; } AUDIO_INFO("Audio-Length: %u", m_audioDataSize); + if(audio_progress) audio_progress(headerSize, m_audioDataSize); return 4; } m_controlCounter = 100; // header succesfully read @@ -1371,6 +1372,7 @@ int Audio::read_FLAC_Header(uint8_t *data, size_t len) { m_audioDataStart = headerSize; m_audioDataSize = m_contentlength - m_audioDataStart; AUDIO_INFO("Audio-Length: %u", m_audioDataSize); + if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize); retvalue = 0; return 0; } @@ -1519,6 +1521,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) { AUDIO_INFO("file has no mp3 tag, skip metadata"); m_audioDataSize = m_contentlength; AUDIO_INFO("Audio-Length: %u", m_audioDataSize); + if(audio_progress) audio_progress(295903, m_audioDataSize); return -1; // error, no ID3 signature found } ID3version = *(data + 3); @@ -1733,6 +1736,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) { m_controlCounter = 100; // ok m_audioDataSize = m_contentlength - m_audioDataStart; AUDIO_INFO("Audio-Length: %u", m_audioDataSize); + if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize); if(APIC_seen && audio_id3image){ cardLock(true); size_t pos = audiofile.position(); @@ -1979,6 +1983,7 @@ int Audio::read_M4A_Header(uint8_t *data, size_t len) { if(m_controlCounter == M4A_MDAT) { // mdat m_audioDataSize = bigEndian(data, 4) -8; // length of this atom - strlen(M4A_MDAT) AUDIO_INFO( "Audio-Length: %u",m_audioDataSize); + if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize); retvalue = 8; headerSize += 8; m_controlCounter = M4A_AMRDY; // last step before starting the audio @@ -1990,6 +1995,7 @@ int Audio::read_M4A_Header(uint8_t *data, size_t len) { // m_contentlength = headerSize + m_audioDataSize; // after this mdat atom there may be other atoms if(getDatamode() == AUDIO_LOCALFILE){ AUDIO_INFO("Content-Length: %u", m_contentlength); + if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize); } m_controlCounter = M4A_OKAY; // that's all return 0; @@ -4441,7 +4447,10 @@ bool Audio::setFilePos(uint32_t pos) { InBuff.resetBuffer(); if(pos < m_audioDataStart) pos = m_audioDataStart; // issue #96 if(m_avr_bitrate) m_audioCurrentTime = ((pos-m_audioDataStart) / m_avr_bitrate) * 8; // #96 - return audiofile.seek(pos); + cardLock(true); + uint32_t sk = audiofile.seek(pos); + cardLock(false); + return sk; } //--------------------------------------------------------------------------------------------------------------------- bool Audio::audioFileSeek(const float speed) { diff --git a/yoRadio/src/audioI2S/AudioEx.h b/yoRadio/src/audioI2S/AudioEx.h index 3e8a070..b54c8c1 100644 --- a/yoRadio/src/audioI2S/AudioEx.h +++ b/yoRadio/src/audioI2S/AudioEx.h @@ -89,6 +89,7 @@ extern __attribute__((weak)) void audio_lasthost(const char*); extern __attribute__((weak)) void audio_eof_speech(const char*); extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end extern __attribute__((weak)) void audio_process_extern(int16_t* buff, uint16_t len, bool *continueI2S); // record audiodata or send via BT +extern __attribute__((weak)) void audio_progress(uint32_t startpos, uint32_t endpos); #define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);} diff --git a/yoRadio/src/audioVS1053/audioVS1053Ex.h b/yoRadio/src/audioVS1053/audioVS1053Ex.h index 41f163b..92cc9dd 100644 --- a/yoRadio/src/audioVS1053/audioVS1053Ex.h +++ b/yoRadio/src/audioVS1053/audioVS1053Ex.h @@ -49,6 +49,7 @@ extern __attribute__((weak)) void audio_icyurl(const char*); extern __attribute__((weak)) void audio_icydescription(const char*); extern __attribute__((weak)) void audio_lasthost(const char*); extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end +extern __attribute__((weak)) void audio_progress(uint32_t start, uint32_t durarion); #define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);} diff --git a/yoRadio/src/core/netserver.cpp b/yoRadio/src/core/netserver.cpp index 3ef3f1d..9c9fa14 100644 --- a/yoRadio/src/core/netserver.cpp +++ b/yoRadio/src/core/netserver.cpp @@ -416,7 +416,11 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client if (strcmp(cmd, "sdpos") == 0) { if (config.store.play_mode==PM_SDCARD){ config.sdResumePos = 0; - player.play(config.store.lastStation, atoi(val)); + if(!player.isRunning()){ + player.play(config.store.lastStation, atoi(val)-player.sd_min); + }else{ + player.setFilePos(atoi(val)-player.sd_min); + } } } if (strcmp(cmd, "balance") == 0) { @@ -583,7 +587,7 @@ void NetServer::requestOnChange(requestType_e request, uint8_t clientId) { break; } case GETMODE: sprintf (wsbuf, "{\"pmode\":\"%s\"}", network.status == CONNECTED ? "player" : "ap"); break; - case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) requestOnChange(SDPOS, clientId); return; break; + case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) { requestOnChange(SDPOS, clientId); requestOnChange(SDLEN, clientId); } return; break; case GETSYSTEM: sprintf (wsbuf, "{\"sst\":%d,\"aif\":%d,\"vu\":%d,\"softr\":%d}", config.store.smartstart != 2, config.store.audioinfo, config.store.vumeter, config.store.softapdelay); break; case GETSCREEN: sprintf (wsbuf, "{\"flip\":%d,\"inv\":%d,\"nump\":%d,\"tsf\":%d,\"tsd\":%d,\"dspon\":%d,\"br\":%d,\"con\":%d}", config.store.flipscreen, config.store.invertdisplay, config.store.numplaylist, config.store.fliptouch, config.store.dbgtouch, config.store.dspon, config.store.brightness, config.store.contrast); break; case GETTIMEZONE: sprintf (wsbuf, "{\"tzh\":%d,\"tzm\":%d,\"sntp1\":\"%s\",\"sntp2\":\"%s\"}", config.store.tzHour, config.store.tzMin, config.store.sntp1, config.store.sntp2); break; @@ -597,10 +601,12 @@ void NetServer::requestOnChange(requestType_e request, uint8_t clientId) { case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break; case NRSSI: sprintf (wsbuf, "{\"rssi\": %d}", rssi); rssi = 255; break; case SDPOS: sprintf (wsbuf, "{\"sdpos\": %d,\"sdend\": %d,\"sdtpos\": %d,\"sdtend\": %d}", player.getFilePos(), player.getFileSize(), player.getAudioCurrentTime(), player.getAudioFileDuration()); break; + case SDLEN: sprintf (wsbuf, "{\"sdmin\": %d,\"sdmax\": %d}", player.sd_min, player.sd_max); break; case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break; case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break; case EQUALIZER: sprintf (wsbuf, "{\"bass\": %d, \"middle\": %d, \"trebble\": %d}", config.store.bass, config.store.middle, config.store.trebble); break; case BALANCE: sprintf (wsbuf, "{\"balance\": %d}", config.store.balance); break; + default: break; } if (strlen(wsbuf) > 0) { if (clientId == 0) { websocket.textAll(wsbuf); }else{ websocket.text(clientId, wsbuf); } diff --git a/yoRadio/src/core/netserver.h b/yoRadio/src/core/netserver.h index 9dc9b57..bf57f52 100644 --- a/yoRadio/src/core/netserver.h +++ b/yoRadio/src/core/netserver.h @@ -5,7 +5,7 @@ #include "ESPAsyncWebServer.h" #include "AsyncUDP.h" -enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22 }; +enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22, SDLEN=23 }; enum import_e : uint8_t { IMDONE=0, IMPL=1, IMWIFI=2 }; class NetServer { diff --git a/yoRadio/src/core/player.cpp b/yoRadio/src/core/player.cpp index fb0531e..f5eec5f 100644 --- a/yoRadio/src/core/player.cpp +++ b/yoRadio/src/core/player.cpp @@ -149,8 +149,9 @@ void Player::play(uint16_t stationId, uint32_t filePos) { display.putRequest(NEWSTATION); netserver.requestOnChange(STATION, 0); telnet.printf("##CLI.NAMESET#: %d %s\n", config.store.lastStation, config.station.name); - if (config.store.play_mode==PM_WEB?connecttohost(config.station.url):connecttoFS(SD,config.station.url,config.sdResumePos==0?filePos:config.sdResumePos)) { + if (config.store.play_mode==PM_WEB?connecttohost(config.station.url):connecttoFS(SD,config.station.url,config.sdResumePos==0?filePos:config.sdResumePos-player.sd_min)) { mode = PLAYING; + if(config.store.play_mode==PM_SDCARD) config.sdResumePos = 0; config.setTitle(""); netserver.requestOnChange(TITLE, 0); config.setSmartStart(1); diff --git a/yoRadio/src/core/player.h b/yoRadio/src/core/player.h index b8a8901..c6aaeab 100644 --- a/yoRadio/src/core/player.h +++ b/yoRadio/src/core/player.h @@ -27,6 +27,7 @@ class Player: public Audio { void zeroRequest(); SemaphoreHandle_t playmutex=NULL; bool lockOutput = true; + uint32_t sd_min, sd_max; public: Player(); void init(); diff --git a/yoRadio/yoRadio.ino b/yoRadio/yoRadio.ino index 055bb04..07c9391 100644 --- a/yoRadio/yoRadio.ino +++ b/yoRadio/yoRadio.ino @@ -202,3 +202,8 @@ void audio_eof_mp3(const char *info){ //end of file config.sdResumePos = 0; player.play(random(1, config.store.countStation)); } +void audio_progress(uint32_t startpos, uint32_t endpos){ + player.sd_min = startpos; + player.sd_max = endpos; + netserver.requestOnChange(SDLEN, 0); +}