From 314d86e1ee05b681d34353ffee9d601885d985b6 Mon Sep 17 00:00:00 2001 From: e2002 Date: Mon, 26 Dec 2022 17:42:37 +0300 Subject: [PATCH] i2s_position --- yoRadio/data/www/index.html | 2 +- yoRadio/data/www/script.js.gz | Bin 5459 -> 5489 bytes yoRadio/src/audioI2S/Audio.cpp | 11 ++++++++++- yoRadio/src/audioI2S/AudioEx.h | 1 + yoRadio/src/audioVS1053/audioVS1053Ex.h | 1 + yoRadio/src/core/netserver.cpp | 10 ++++++++-- yoRadio/src/core/netserver.h | 2 +- yoRadio/src/core/player.cpp | 3 ++- yoRadio/src/core/player.h | 1 + yoRadio/yoRadio.ino | 5 +++++ 10 files changed, 30 insertions(+), 6 deletions(-) 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 52bca8b94687ba11e7e1aa5e7de515b6f5975388..e90f34f7ad1871921482a5763305ddf89ab24c2f 100644 GIT binary patch delta 5230 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 delta 5184 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 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); +}