diff --git a/yoRadio/src/core/config.cpp b/yoRadio/src/core/config.cpp index c45fc4d..f795046 100644 --- a/yoRadio/src/core/config.cpp +++ b/yoRadio/src/core/config.cpp @@ -3,6 +3,7 @@ //#include #include "display.h" #include "player.h" +#include "netserver.h" Config config; @@ -236,6 +237,8 @@ void Config::saveVolume(){ byte Config::setVolume(byte val) { store.volume = val; + display.putRequest(DRAWVOL); + netserver.requestOnChange(VOLUME, 0); return store.volume; } @@ -280,6 +283,8 @@ void Config::setTitle(const char* title) { memset(config.station.title, 0, BUFLEN); strlcpy(config.station.title, title, BUFLEN); u8fix(config.station.title); + netserver.requestOnChange(TITLE, 0); + netserver.loop(); display.putRequest(NEWTITLE); } diff --git a/yoRadio/src/core/controls.cpp b/yoRadio/src/core/controls.cpp index 21972f2..f70b62c 100644 --- a/yoRadio/src/core/controls.cpp +++ b/yoRadio/src/core/controls.cpp @@ -165,7 +165,7 @@ void encodersLoop(yoEncoder *enc, bool first){ int nv = config.store.volume+encoderDelta; if(nv<0) nv=0; if(nv>254) nv=254; - player.setVol((byte)nv, false); + player.setVol((uint8_t)nv); }else{ if(encoderDelta > 0) player.next(); else player.prev(); } @@ -199,7 +199,7 @@ void encoder2Loop() { #if IR_PIN!=255 void irBlink() { if(LED_BUILTIN==255) return; - if (player.mode == STOPPED) { + if (player.status() == STOPPED) { for (byte i = 0; i < 7; i++) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(100); @@ -249,7 +249,7 @@ void irLoop() { irBlink(); if (display.mode() == NUMBERS) { display.putRequest(NEWMODE, PLAYER); - player.play(display.numOfNextStation); + player.sendCommand({PR_PLAY, display.numOfNextStation}); display.numOfNextStation = 0; break; } @@ -439,7 +439,7 @@ void controlsEvent(bool toRight, int8_t volDelta) { int nv = config.store.volume+volDelta; if(nv<0) nv=0; if(nv>254) nv=254; - player.setVol((byte)nv, false); + player.setVol((uint8_t)nv); }else{ player.stepVol(toRight); } @@ -472,7 +472,7 @@ void onBtnClick(int id) { } if (display.mode() == STATIONS) { display.putRequest(NEWMODE, PLAYER); - player.play(display.currentPlItem); + player.sendCommand({PR_PLAY, display.currentPlItem}); } break; } diff --git a/yoRadio/src/core/display.cpp b/yoRadio/src/core/display.cpp index 4859da7..99328b6 100644 --- a/yoRadio/src/core/display.cpp +++ b/yoRadio/src/core/display.cpp @@ -416,7 +416,7 @@ void Display::loop() { #endif*/ break; } - case DSPRSSI: if(_rssi){ _setRSSI(request.payload); } if (_heapbar && config.store.audioinfo) _heapbar->setValue(player.inBufferFilled()); break; + case DSPRSSI: if(_rssi){ _setRSSI(request.payload); } if (_heapbar && config.store.audioinfo) _heapbar->setValue(player.isRunning()?player.inBufferFilled():0); break; case PSTART: _layoutChange(true); break; case PSTOP: _layoutChange(false); break; case DSP_START: _start(); break; diff --git a/yoRadio/src/core/mqtt.cpp b/yoRadio/src/core/mqtt.cpp index 3d076ca..f6d7db7 100644 --- a/yoRadio/src/core/mqtt.cpp +++ b/yoRadio/src/core/mqtt.cpp @@ -39,7 +39,7 @@ void mqttPublishStatus() { memset(topic, 0, 140); memset(status, 0, BUFLEN*3); sprintf(topic, "%s%s", MQTT_ROOT_TOPIC, "status"); - sprintf(status, "{\"status\": %d, \"station\": %d, \"name\": \"%s\", \"title\": \"%s\", \"on\": %d}", player.mode==PLAYING?1:0, config.store.lastStation, config.station.name, config.station.title, config.store.dspon); + sprintf(status, "{\"status\": %d, \"station\": %d, \"name\": \"%s\", \"title\": \"%s\", \"on\": %d}", player.status()==PLAYING?1:0, config.store.lastStation, config.station.name, config.station.title, config.store.dspon); mqttClient.publish(topic, 0, true, status); } } @@ -87,12 +87,12 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties return; } if (strcmp(buf, "stop") == 0) { - player.mode = STOPPED; - telnet.info(); + player.sendCommand({PR_STOP, 0}); + //telnet.info(); return; } if (strcmp(buf, "start") == 0 || strcmp(buf, "play") == 0) { - player.request.station = config.store.lastStation; + player.sendCommand({PR_PLAY, config.store.lastStation}); return; } if (strcmp(buf, "boot") == 0 || strcmp(buf, "reboot") == 0) { @@ -110,8 +110,8 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties if (strcmp(buf, "turnoff") == 0) { uint8_t sst = config.store.smartstart; config.setDspOn(0); - player.mode = STOPPED; - telnet.info(); + player.sendCommand({PR_STOP, 0}); + //telnet.info(); delay(100); config.store.smartstart = sst; config.save(); @@ -119,22 +119,21 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties } if (strcmp(buf, "turnon") == 0) { config.setDspOn(1); - if (config.store.smartstart == 1) player.request.station = config.store.lastStation; + if (config.store.smartstart == 1) player.sendCommand({PR_PLAY, config.store.lastStation}); return; } int volume; if ( sscanf(buf, "vol %d", &volume) == 1) { if (volume < 0) volume = 0; if (volume > 254) volume = 254; - player.setVol(volume, false); + player.setVol(volume); return; } int sb; if (sscanf(buf, "play %d", &sb) == 1 ) { if (sb < 1) sb = 1; if (sb >= config.store.countStation) sb = config.store.countStation; - player.request.station = (uint16_t)sb; - player.request.doSave = true; + player.sendCommand({PR_PLAY, (uint16_t)sb}); return; } if (strstr(buf, "http")==buf){ diff --git a/yoRadio/src/core/netserver.cpp b/yoRadio/src/core/netserver.cpp index d0e0996..810f786 100644 --- a/yoRadio/src/core/netserver.cpp +++ b/yoRadio/src/core/netserver.cpp @@ -116,7 +116,7 @@ void handleUpdate(AsyncWebServerRequest *request, String filename, size_t index, if (!index) { int target = (request->getParam("updatetarget", true)->value() == "spiffs") ? U_SPIFFS : U_FLASH; Serial.printf("Update Start: %s\n", filename.c_str()); - player.mode = STOPPED; + player.sendCommand({PR_STOP, 0}); display.putRequest(NEWMODE, UPDATING); if (!Update.begin(UPDATE_SIZE_UNKNOWN, target)) { Update.printError(Serial); @@ -186,11 +186,15 @@ void NetServer::chunkedHtmlPage(const String& contentType, AsyncWebServerRequest #define SHOW_WEATHER false #endif +#ifndef NS_QUEUE_TICKS + #define NS_QUEUE_TICKS 2 +#endif + char wsbuf[BUFLEN * 2]; void NetServer::processQueue(){ if(nsQueue==NULL) return; nsRequestParams_t request; - if(xQueueReceive(nsQueue, &request, 5)){ + if(xQueueReceive(nsQueue, &request, NS_QUEUE_TICKS)){ memset(wsbuf, 0, BUFLEN * 2); uint8_t clientId = request.clientId; switch (request.type) { @@ -239,13 +243,13 @@ void NetServer::processQueue(){ case STATIONNAME: sprintf (wsbuf, "{\"nameset\": \"%s\"}", config.station.name); break; case ITEM: sprintf (wsbuf, "{\"current\": %d}", config.store.lastStation); break; case TITLE: sprintf (wsbuf, "{\"meta\": \"%s\"}", config.station.title); if (player.requestToStart) { telnet.info(); player.requestToStart = false; } else { telnet.printf("##CLI.META#: %s\n> ", config.station.title); } break; - case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break; + case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); telnet.printf("##CLI.VOL#: %d\n", 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 SDSNUFFLE: sprintf (wsbuf, "{\"snuffle\": %d}", config.sdSnuffle); break; case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break; - case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break; + case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.status() == 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; @@ -520,13 +524,14 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client } /* EOF RESETS */ if (strcmp(cmd, "volume") == 0) { byte v = atoi(val); - player.setVol(v, false); + player.setVol(v); } if (strcmp(cmd, "sdpos") == 0) { if (config.store.play_mode==PM_SDCARD){ config.sdResumePos = 0; if(!player.isRunning()){ - player.play(config.store.lastStation, atoi(val)-player.sd_min); + player.setResumeFilePos(atoi(val)-player.sd_min); + player.sendCommand({PR_PLAY, config.store.lastStation}); }else{ player.setFilePos(atoi(val)-player.sd_min); } @@ -575,8 +580,7 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client #endif // xSemaphoreGive(player.playmutex); if (player.isRunning()) { - player.request.station = config.store.lastStation; - player.request.doSave = false; + player.sendCommand({PR_PLAY, -config.store.lastStation}); } return; } @@ -653,7 +657,6 @@ bool NetServer::importPlaylist() { } void NetServer::requestOnChange(requestType_e request, uint8_t clientId) { - //char buf[BUFLEN * 2] = { 0 }; nsRequestParams_t nsrequest; nsrequest.type = request; nsrequest.clientId = clientId; @@ -744,8 +747,8 @@ void handleHTTPArgs(AsyncWebServerRequest * request) { } if (network.status == CONNECTED) { bool commandFound=false; - if (request->hasArg("start")) { player.request.station = config.store.lastStation; commandFound=true; } - if (request->hasArg("stop")) { player.mode = STOPPED; config.setTitle(const_PlStopped); commandFound=true; } + if (request->hasArg("start")) { player.sendCommand({PR_PLAY, config.store.lastStation}); commandFound=true; } + if (request->hasArg("stop")) { player.sendCommand({PR_STOP, 0}); commandFound=true; } if (request->hasArg("toggle")) { player.toggle(); commandFound=true; } if (request->hasArg("prev")) { player.prev(); commandFound=true; } if (request->hasArg("next")) { player.next(); commandFound=true; } @@ -777,8 +780,7 @@ void handleHTTPArgs(AsyncWebServerRequest * request) { int id = atoi(p->value().c_str()); if (id < 1) id = 1; if (id > config.store.countStation) id = config.store.countStation; - player.request.station = id; - player.request.doSave = true; + player.sendCommand({PR_PLAY, id}); commandFound=true; DBGVB("[%s] play=%d", __func__, id); } @@ -788,7 +790,7 @@ void handleHTTPArgs(AsyncWebServerRequest * request) { if (v < 0) v = 0; if (v > 254) v = 254; config.store.volume = v; - player.setVol(v, false); + player.setVol(v); commandFound=true; DBGVB("[%s] vol=%d", __func__, v); } diff --git a/yoRadio/src/core/options.h b/yoRadio/src/core/options.h index 5f6bc88..08cd60f 100644 --- a/yoRadio/src/core/options.h +++ b/yoRadio/src/core/options.h @@ -1,7 +1,7 @@ #ifndef options_h #define options_h -#define YOVERSION "0.9.084" +#define YOVERSION "0.9.090" /******************************************************* DO NOT EDIT THIS FILE. diff --git a/yoRadio/src/core/player.cpp b/yoRadio/src/core/player.cpp index a41dd2d..31bb02b 100644 --- a/yoRadio/src/core/player.cpp +++ b/yoRadio/src/core/player.cpp @@ -9,6 +9,7 @@ #include "netserver.h" Player player; +QueueHandle_t playerQueue; #if VS1053_CS!=255 && !I2S_INTERNAL #if VS_HSPI @@ -34,6 +35,8 @@ Player player; void Player::init() { Serial.print("##[BOOT]#\tplayer.init\t"); + playerQueue=NULL; + playerQueue = xQueueCreate( 5, sizeof( playerRequestParams_t ) ); #ifdef MQTT_ROOT_TOPIC memset(burl, 0, MQTT_BURL_SIZE); #endif @@ -50,30 +53,36 @@ void Player::init() { setBalance(config.store.balance); setTone(config.store.bass, config.store.middle, config.store.trebble); setVolume(0); - mode = STOPPED; + _status = STOPPED; setOutputPins(false); requestToStart = true; - volTimer=false; - zeroRequest(); + _volTimer=false; playmutex = xSemaphoreCreateMutex(); randomSeed(analogRead(0)); + #if PLAYER_FORCE_MONO + forceMono(true); + #endif + _loadVol(config.store.volume); Serial.println("done"); } +void Player::sendCommand(playerRequestParams_t request){ + if(playerQueue==NULL) return; + xQueueSend(playerQueue, &request, portMAX_DELAY); +} + void Player::stopInfo() { config.setSmartStart(0); - telnet.info(); + //telnet.info(); netserver.requestOnChange(MODE, 0); requestToStart = true; } -void Player::stop(const char *nttl){ +void Player::_stop(){ if(config.store.play_mode==PM_SDCARD) config.sdResumePos = player.getFilePos(); - mode = STOPPED; + _status = STOPPED; setOutputPins(false); - if(nttl) config.setTitle(nttl); - else config.setTitle((display.mode()==LOST || display.mode()==UPDATING)?"":const_PlStopped); - netserver.requestOnChange(TITLE, 0); + config.setTitle((display.mode()==LOST || display.mode()==UPDATING)?"":const_PlStopped); config.station.bitrate = 0; #ifdef USE_NEXTION nextion.bitrate(config.station.bitrate); @@ -81,7 +90,9 @@ void Player::stop(const char *nttl){ netserver.requestOnChange(BITRATE, 0); display.putRequest(DBITRATE); display.putRequest(PSTOP); - //setDefaults(); + #ifdef CLEAR_BUFFERS + setDefaults(); + #endif stopSong(); stopInfo(); if (player_on_stop_play) player_on_stop_play(); @@ -91,40 +102,45 @@ void Player::initHeaders(const char *file) { if(strlen(file)==0) return; connecttoFS(SD,file); eofHeader = false; - //for(int c=0;c<20;c++) player.loopreader(); while(!eofHeader) Audio::loop(); //netserver.requestOnChange(SDPOS, 0); setDefaults(); } +#ifndef PL_QUEUE_TICKS + #define PL_QUEUE_TICKS 2 +#endif + void Player::loop() { - if (mode == PLAYING) { - xSemaphoreTake(playmutex, portMAX_DELAY); - Audio::loop(); - xSemaphoreGive(playmutex); - } else { - if (isRunning()) stop(); - } - if (request.station > 0) { - if (request.doSave) { - config.setLastStation(request.station); + if(playerQueue==NULL) return; + playerRequestParams_t requestP; + if(xQueueReceive(playerQueue, &requestP, PL_QUEUE_TICKS)){ + switch (requestP.type){ + case PR_STOP: _stop(); break; + case PR_PLAY: { + if (requestP.payload>0) { + config.setLastStation((uint16_t)requestP.payload); + } + _play((uint16_t)abs(requestP.payload)); + if (player_on_station_change) player_on_station_change(); + break; + } + case PR_VOL: { + config.setVolume(requestP.payload); + Audio::setVolume(volToI2S(requestP.payload)); + break; + } + default: break; } - play(request.station); - if (player_on_station_change) player_on_station_change(); - zeroRequest(); } - if (request.volume >= 0) { - config.setVolume(request.volume); - telnet.printf("##CLI.VOL#: %d\n", config.store.volume); - Audio::setVolume(volToI2S(request.volume)); - zeroRequest(); - display.putRequest(DRAWVOL); - netserver.requestOnChange(VOLUME, 0); - } - if(volTimer){ - if((millis()-volTicks)>3000){ + xSemaphoreTake(playmutex, portMAX_DELAY); + Audio::loop(); + xSemaphoreGive(playmutex); + + if(_volTimer){ + if((millis()-_volTicks)>3000){ config.saveVolume(); - volTimer=false; + _volTimer=false; } } #ifdef MQTT_ROOT_TOPIC @@ -134,36 +150,26 @@ void Player::loop() { #endif } -void Player::zeroRequest() { - request.station = 0; - request.volume = -1; - request.doSave = false; -} - void Player::setOutputPins(bool isPlaying) { if(LED_BUILTIN!=255) digitalWrite(LED_BUILTIN, LED_INVERT?!isPlaying:isPlaying); if(MUTE_PIN!=255) digitalWrite(MUTE_PIN, isPlaying?!MUTE_VAL:MUTE_VAL); } -void Player::play(uint16_t stationId, uint32_t filePos) { +void Player::_play(uint16_t stationId) { remoteStationName = false; config.setDspOn(1); display.putRequest(PSTOP); - setDefaults(); setOutputPins(false); config.setTitle(config.store.play_mode==PM_WEB?const_PlConnect:""); config.station.bitrate=0; - netserver.requestOnChange(TITLE, 0); config.loadStation(stationId); - setVol(config.store.volume, true); + _loadVol(config.store.volume); 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-player.sd_min)) { - mode = PLAYING; + if (config.store.play_mode==PM_WEB?connecttohost(config.station.url):connecttoFS(SD,config.station.url,config.sdResumePos==0?_resumeFilePos:config.sdResumePos-player.sd_min)) { + _status = PLAYING; if(config.store.play_mode==PM_SDCARD) config.sdResumePos = 0; config.setTitle(""); - netserver.requestOnChange(TITLE, 0); config.setSmartStart(1); netserver.requestOnChange(MODE, 0); setOutputPins(true); @@ -179,16 +185,14 @@ void Player::play(uint16_t stationId, uint32_t filePos) { void Player::browseUrl(){ remoteStationName = true; config.setDspOn(1); - resumeAfterUrl = mode==PLAYING; + resumeAfterUrl = _status==PLAYING; display.putRequest(PSTOP); // setDefaults(); setOutputPins(false); config.setTitle(const_PlConnect); - netserver.requestOnChange(TITLE, 0); if (connecttohost(burl)){ - mode = PLAYING; + _status = PLAYING; config.setTitle(""); - netserver.requestOnChange(TITLE, 0); netserver.requestOnChange(MODE, 0); setOutputPins(true); requestToStart = true; @@ -205,8 +209,7 @@ void Player::prev() { if(config.store.play_mode==PM_WEB || !config.sdSnuffle){ if (config.store.lastStation == 1) config.store.lastStation = config.store.countStation; else config.store.lastStation--; } - request.station = config.store.lastStation; - request.doSave = true; + sendCommand({PR_PLAY, config.store.lastStation}); } void Player::next() { @@ -215,48 +218,46 @@ void Player::next() { }else{ config.store.lastStation = random(1, config.store.countStation); } - request.station = config.store.lastStation; - request.doSave = true; + sendCommand({PR_PLAY, config.store.lastStation}); } void Player::toggle() { - if (mode == PLAYING) { - mode = STOPPED; + if (_status == PLAYING) { + sendCommand({PR_STOP, 0}); } else { - request.station = config.store.lastStation; + sendCommand({PR_PLAY, config.store.lastStation}); } } void Player::stepVol(bool up) { if (up) { if (config.store.volume <= 254 - config.store.volsteps) { - setVol(config.store.volume + config.store.volsteps, false); + setVol(config.store.volume + config.store.volsteps); }else{ - setVol(254, false); + setVol(254); } } else { if (config.store.volume >= config.store.volsteps) { - setVol(config.store.volume - config.store.volsteps, false); + setVol(config.store.volume - config.store.volsteps); }else{ - setVol(0, false); + setVol(0); } } } -byte Player::volToI2S(byte volume) { +uint8_t Player::volToI2S(uint8_t volume) { int vol = map(volume, 0, 254 - config.station.ovol * 3 , 0, 254); if (vol > 254) vol = 254; if (vol < 0) vol = 0; return vol; } -void Player::setVol(byte volume, bool inside) { - if (inside) { - setVolume(volToI2S(volume)); - } else { - volTicks = millis(); - volTimer = true; - request.volume = volume; - request.doSave = true; - } +void Player::_loadVol(uint8_t volume) { + setVolume(volToI2S(volume)); +} + +void Player::setVol(uint8_t volume) { + _volTicks = millis(); + _volTimer = true; + player.sendCommand({PR_VOL, volume}); } diff --git a/yoRadio/src/core/player.h b/yoRadio/src/core/player.h index 6e1c7ff..d2b0dbd 100644 --- a/yoRadio/src/core/player.h +++ b/yoRadio/src/core/player.h @@ -12,23 +12,27 @@ #define MQTT_BURL_SIZE 512 #endif -enum audioMode_e { PLAYING, STOPPED }; - -struct audiorequest_t +enum playerRequestType_e : uint8_t { PR_PLAY = 1, PR_STOP = 2, PR_PREV = 3, PR_NEXT = 4, PR_VOL = 5 }; +struct playerRequestParams_t { - uint16_t station; - int volume; - bool doSave; + playerRequestType_e type; + int payload; }; + +enum plStatus_e : uint8_t{ PLAYING = 1, STOPPED = 2 }; + class Player: public Audio { private: - uint32_t volTicks; /* delayed volume save */ - bool volTimer; /* delayed volume save */ + uint32_t _volTicks; /* delayed volume save */ + bool _volTimer; /* delayed volume save */ + uint32_t _resumeFilePos; + plStatus_e _status; + private: + void _stop(); + void _play(uint16_t stationId); + void _loadVol(uint8_t volume); public: - audioMode_e mode; - audiorequest_t request; bool requestToStart; - void zeroRequest(); SemaphoreHandle_t playmutex=NULL; bool lockOutput = true; bool resumeAfterUrl = false; @@ -41,20 +45,21 @@ class Player: public Audio { void init(); void loop(); void initHeaders(const char *file); - void play(uint16_t stationId, uint32_t filePos=0); + void sendCommand(playerRequestParams_t request); #ifdef MQTT_ROOT_TOPIC void browseUrl(); #endif bool remoteStationName = false; - void stop(const char *nttl = NULL); + plStatus_e status() { return _status; } void prev(); void next(); void toggle(); void stepVol(bool up); - void setVol(byte volume, bool inside); - byte volToI2S(byte volume); + void setVol(uint8_t volume); + uint8_t volToI2S(uint8_t volume); void stopInfo(); void setOutputPins(bool isPlaying); + void setResumeFilePos(uint32_t pos) { _resumeFilePos = pos; } }; extern Player player; diff --git a/yoRadio/src/core/telnet.cpp b/yoRadio/src/core/telnet.cpp index 288e89d..4e69c7b 100644 --- a/yoRadio/src/core/telnet.cpp +++ b/yoRadio/src/core/telnet.cpp @@ -124,7 +124,7 @@ void Telnet::printf(const char *format, ...) { clients[id].print(buf); } } - Serial.print(buf); + if(strstr(buf,"> ")==NULL) Serial.print(buf); } void Telnet::printf(byte id, const char *format, ...) { @@ -153,11 +153,11 @@ void Telnet::info() { strftime(timeStringBuff, sizeof(timeStringBuff), "%Y-%m-%dT%H:%M:%S+03:00", &network.timeinfo); telnet.printf("##SYS.DATE#: %s\n", timeStringBuff); //TODO timezone offset telnet.printf("##CLI.NAMESET#: %d %s\n", config.store.lastStation, config.station.name); - if (player.mode == PLAYING) { + if (player.status() == PLAYING) { telnet.printf("##CLI.META#: %s\n", config.station.title); } telnet.printf("##CLI.VOL#: %d\n", config.store.volume); - if (player.mode == PLAYING) { + if (player.status() == PLAYING) { telnet.printf("##CLI.PLAYING#\n"); } else { telnet.printf("##CLI.STOPPED#\n"); @@ -181,12 +181,12 @@ void Telnet::on_input(const char* str, byte clientId) { return; } if (strcmp(str, "cli.stop") == 0 || strcmp(str, "stop") == 0) { - player.mode = STOPPED; - info(); + player.sendCommand({PR_STOP, 0}); + //info(); return; } if (strcmp(str, "cli.start") == 0 || strcmp(str, "start") == 0 || strcmp(str, "cli.play") == 0 || strcmp(str, "play") == 0) { - player.play(config.store.lastStation); + player.sendCommand({PR_PLAY, config.store.lastStation}); return; } if (strcmp(str, "cli.vol") == 0 || strcmp(str, "vol") == 0) { @@ -209,7 +209,7 @@ void Telnet::on_input(const char* str, byte clientId) { if (sscanf(str, "vol(%d)", &volume) == 1 || sscanf(str, "cli.vol(\"%d\")", &volume) == 1 || sscanf(str, "vol %d", &volume) == 1) { if (volume < 0) volume = 0; if (volume > 254) volume = 254; - player.setVol(volume, false); + player.setVol(volume); return; } if (strcmp(str, "cli.audioinfo") == 0 || strcmp(str, "audioinfo") == 0) { @@ -263,11 +263,11 @@ void Telnet::on_input(const char* str, byte clientId) { printf(clientId, "##SYS.DATE#: %s+%02d:%02d\n", timeStringBuff, config.store.tzHour, config.store.tzMin); } printf(clientId, "##CLI.NAMESET#: %d %s\n", config.store.lastStation, config.station.name); - if (player.mode == PLAYING) { + if (player.status() == PLAYING) { printf(clientId, "##CLI.META#: %s\n", config.station.title); } printf(clientId, "##CLI.VOL#: %d\n", config.store.volume); - if (player.mode == PLAYING) { + if (player.status() == PLAYING) { printf(clientId, "##CLI.PLAYING#\n"); } else { printf(clientId, "##CLI.STOPPED#\n"); @@ -279,7 +279,7 @@ void Telnet::on_input(const char* str, byte clientId) { if (sscanf(str, "play(%d)", &sb) == 1 || sscanf(str, "cli.play(\"%d\")", &sb) == 1 || sscanf(str, "play %d", &sb) == 1 ) { if (sb < 1) sb = 1; if (sb >= config.store.countStation) sb = config.store.countStation; - player.play((uint16_t)sb); + player.sendCommand({PR_PLAY, (uint16_t)sb}); return; } if (strcmp(str, "sys.tzo") == 0 || strcmp(str, "tzo") == 0) { diff --git a/yoRadio/src/displays/nextion.cpp b/yoRadio/src/displays/nextion.cpp index dafaf43..6ae3a4e 100644 --- a/yoRadio/src/displays/nextion.cpp +++ b/yoRadio/src/displays/nextion.cpp @@ -222,7 +222,7 @@ void Nextion::loop() { } if(strcmp(scanBuf, "go") == 0) { display.putRequest(NEWMODE, PLAYER); - player.request.station=display.currentPlItem; + player.sendCommand({PR_PLAY, display.currentPlItem}); } if(strcmp(scanBuf, "toggle") == 0) { player.toggle(); @@ -230,8 +230,7 @@ void Nextion::loop() { } if (sscanf(rxbuf, "vol=%d", &scanDigit) == 1){ _volInside = true; - player.request.volume=scanDigit; - player.request.doSave=true; + player.sendCommand({PR_VOL, scanDigit}); } if (sscanf(rxbuf, "balance=%d", &scanDigit) == 1){ config.setBalance((int8_t)scanDigit); diff --git a/yoRadio/yoRadio.ino b/yoRadio/yoRadio.ino index 03d38d8..74d9635 100644 --- a/yoRadio/yoRadio.ino +++ b/yoRadio/yoRadio.ino @@ -45,10 +45,6 @@ void setup() { } netserver.begin(); telnet.begin(); - #if PLAYER_FORCE_MONO - player.forceMono(true); - #endif - player.setVol(config.store.volume, true); initControls(); display.putRequest(DSP_START); while(!display.ready()) delay(10); @@ -57,7 +53,7 @@ void setup() { #endif if (config.store.play_mode==PM_SDCARD) player.initHeaders(config.station.url); player.lockOutput=false; - if (config.store.smartstart == 1) player.play(config.store.lastStation); + if (config.store.smartstart == 1) player.sendCommand({PR_PLAY, config.store.lastStation}); } void loop() { @@ -75,7 +71,7 @@ void checkConnection(){ static uint32_t checkInterval = 3000; if ((WiFi.status() != WL_CONNECTED) && (millis() - checkMillis >=checkInterval)) { bool playing = player.isRunning(); - if (playing) player.mode = STOPPED; + if (playing) player.sendCommand({PR_STOP, 0}); display.putRequest(NEWMODE, LOST); Serial.println("Lost connection, reconnecting..."); while(true){ @@ -85,7 +81,7 @@ void checkConnection(){ delay(3000); } display.putRequest(NEWMODE, PLAYER); - if (playing) player.request.station = config.store.lastStation; + if (playing) player.sendCommand({PR_PLAY, config.store.lastStation}); checkMillis = millis(); #ifdef MQTT_ROOT_TOPIC connectToMqtt(); @@ -103,12 +99,12 @@ void audio_info(const char *info) { #ifdef USE_NEXTION nextion.audioinfo(info); #endif - if (strstr(info, "skip metadata") != NULL){ - config.setTitle(config.station.name); - netserver.requestOnChange(TITLE, 0); + if (strstr(info, "skip metadata") != NULL) config.setTitle(config.station.name); + if (strstr(info, "failed!") != NULL || strstr(info, "address is empty") != NULL || strstr(info, "not supported") != NULL || strstr(info, "Account already in use") != NULL || strstr(info, "HTTP/1.0 401") != NULL) { + //config.setTitle(info); + telnet.printf("##ERROR#:\t%s\n", info); + player.sendCommand({PR_STOP, 0}); } - if (strstr(info, "failed!") != NULL || strstr(info, "address is empty") != NULL) player.stop(info); - if (strstr(info, "not supported") != NULL || strstr(info, "Account already in use") != NULL || strstr(info, "HTTP/1.0 401") != NULL) player.stop(info); char* ici; char b[20]={0}; if ((ici = strstr(info, "BitRate: ")) != NULL) { strlcpy(b, ici + 9, 50); @@ -141,7 +137,6 @@ void audio_showstation(const char *info) { if (strlen(info) > 0) { bool p = printable(info); config.setTitle(p?info:config.station.name); - netserver.requestOnChange(TITLE, 0); if(player.remoteStationName){ config.setStation(p?info:config.station.name); display.putRequest(NEWSTATION); @@ -153,7 +148,9 @@ void audio_showstation(const char *info) { void audio_showstreamtitle(const char *info) { DBGH(); if (strstr(info, "Account already in use") != NULL || strstr(info, "HTTP/1.0 401") != NULL){ - player.stop(info); + //config.setTitle(info); + telnet.printf("##ERROR#:\t%s\n", info); + player.sendCommand({PR_STOP, 0}); return; } if (strlen(info) > 0) { @@ -163,7 +160,6 @@ void audio_showstreamtitle(const char *info) { #else config.setTitle(p?info:config.station.name); #endif - netserver.requestOnChange(TITLE, 0); } } @@ -186,7 +182,6 @@ void audio_id3album(const char *info){ strlcat(out, info, BUFLEN); config.setTitle(out); } - netserver.requestOnChange(TITLE, 0); } } @@ -196,7 +191,6 @@ void audio_id3title(const char *info){ void audio_beginSDread(){ config.setTitle(""); - netserver.requestOnChange(TITLE, 0); } void audio_id3data(const char *info){ //id3 metadata @@ -207,19 +201,20 @@ void audio_id3data(const char *info){ //id3 metadata void audio_eof_mp3(const char *info){ //end of file config.sdResumePos = 0; if(config.sdSnuffle){ - player.play(random(1, config.store.countStation)); + player.sendCommand({PR_PLAY, random(1, config.store.countStation)}); }else{ player.next(); } } void audio_eof_stream(const char *info){ - player.stop(); + player.sendCommand({PR_STOP, 0}); if(!player.resumeAfterUrl) return; if (config.store.play_mode==PM_WEB){ - player.play(config.store.lastStation); + player.sendCommand({PR_PLAY, config.store.lastStation}); }else{ - player.play(config.store.lastStation, config.sdResumePos==0?0:config.sdResumePos-player.sd_min); + player.setResumeFilePos( config.sdResumePos==0?0:config.sdResumePos-player.sd_min); + player.sendCommand({PR_PLAY, config.store.lastStation}); } }