From 370dbfff6a0296ecdfb5a3295436c7e51ed5f506 Mon Sep 17 00:00:00 2001 From: David Koch Date: Wed, 2 Jan 2019 10:11:46 +0100 Subject: [PATCH 1/5] Only for testing: Changed to DUMMYTFT --- Esp32_radio/Esp32_radio.ino | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Esp32_radio/Esp32_radio.ino b/Esp32_radio/Esp32_radio.ino index 2766cdc..4eb8b7a 100644 --- a/Esp32_radio/Esp32_radio.ino +++ b/Esp32_radio/Esp32_radio.ino @@ -155,10 +155,10 @@ // Define (just one) type of display. See documentation. //#define BLUETFT // Works also for RED TFT 128x160 //#define OLED // 64x128 I2C OLED -//#define DUMMYTFT // Dummy display +#define DUMMYTFT // Dummy display //#define LCD1602I2C // LCD 1602 display with I2C backpack //#define ILI9341 // ILI9341 240*320 -#define NEXTION // Nextion display. Uses UART 2 (pin 16 and 17) +//#define NEXTION // Nextion display. Uses UART 2 (pin 16 and 17) // #include #include @@ -357,7 +357,7 @@ SemaphoreHandle_t SPIsem = NULL ; // For exclusive SPI us hw_timer_t* timer = NULL ; // For timer char timetxt[9] ; // Converted timeinfo char cmd[130] ; // Command from MQTT or Serial -uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream +uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream QueueHandle_t dataqueue ; // Queue for mp3 datastream QueueHandle_t spfqueue ; // Queue for special functions qdata_struct outchunk ; // Data to queue @@ -2343,7 +2343,7 @@ bool connectwifi() } tftlog ( pfs ) ; // Show IP delay ( 3000 ) ; // Allow user to read this - tftlog ( "\f" ) ; // Select new page if NEXTION + tftlog ( "\f" ) ; // Select new page if NEXTION return ( localAP == false ) ; // Return result of connection } @@ -2402,7 +2402,7 @@ bool do_nextion_update ( uint32_t clength ) } k = otaclient.read ( tmpbuff, k ) ; // Read a number of bytes from the stream dbgprint ( "TFT file, read %d bytes", k ) ; - nxtserial->write ( tmpbuff, k ) ; + nxtserial->write ( tmpbuff, k ) ; while ( !nxtserial->available() ) // Any input seen? { delay ( 20 ) ; @@ -2433,7 +2433,7 @@ bool do_nextion_update ( uint32_t clength ) bool do_software_update ( uint32_t clength ) { bool res = false ; // Update result - + if ( Update.begin ( clength ) ) // Update possible? { dbgprint ( "Begin OTA update, length is %d", @@ -2485,7 +2485,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char String line ; // Input header line String lstmod = "" ; // Last modified timestamp in NVS String newlstmod ; // Last modified from host - + updatereq = false ; // Clear update flag otastart() ; // Show something on screen stop_mp3client () ; // Stop input stream @@ -2523,7 +2523,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char break ; // Yes, get the OTA started } // Check if the HTTP Response is 200. Any other response is an error. - if ( line.startsWith ( "HTTP/1.1" ) ) // + if ( line.startsWith ( "HTTP/1.1" ) ) // { if ( line.indexOf ( " 200 " ) < 0 ) { @@ -2542,7 +2542,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char { dbgprint ( "No new version available" ) ; // No, show reason otaclient.flush() ; - return ; + return ; } if ( clength > 0 ) { @@ -2815,7 +2815,7 @@ String readprefs ( bool output ) String ( "/*******" ) ; } cmd = String ( "" ) ; // Do not analyze this - + } else if ( strstr ( key, "mqttpasswd" ) ) // Is it a MQTT password? { @@ -3007,7 +3007,7 @@ void scanserial2() dbgprint ( "NEXTION command seen %02X %s", cmd[0], cmd + 1 ) ; if ( cmd[0] == 0x70 ) // Button pressed? - { + { reply = analyzeCmd ( cmd + 1 ) ; // Analyze command and handle it dbgprint ( reply ) ; // Result for debugging } @@ -4528,7 +4528,7 @@ void loop() if ( updatereq ) // Software update requested? { if ( displaytype == T_NEXTION ) // NEXTION in use? - { + { update_software ( "lstmodn", // Yes, update NEXTION image from remote image UPDATEHOST, TFTFILE ) ; } @@ -5682,4 +5682,3 @@ void spftask ( void * parameter ) } //vTaskDelete ( NULL ) ; // Will never arrive here } - From 108f98895d8dfd10df386fa9c6709e18600a7b92 Mon Sep 17 00:00:00 2001 From: David Koch Date: Wed, 2 Jan 2019 11:54:55 +0100 Subject: [PATCH 2/5] Changes in shutdown pin control to make amp shutdown more reliable. --- Esp32_radio/Esp32_radio.ino | 52 +++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/Esp32_radio/Esp32_radio.ino b/Esp32_radio/Esp32_radio.ino index 4eb8b7a..56c9919 100644 --- a/Esp32_radio/Esp32_radio.ino +++ b/Esp32_radio/Esp32_radio.ino @@ -380,7 +380,6 @@ String host ; // The URL to connect t String playlist ; // The URL of the specified playlist bool hostreq = false ; // Request for new host bool reqtone = false ; // New tone setting requested -bool muteflag = false ; // Mute output bool resetreq = false ; // Request to reset the ESP32 bool updatereq = false ; // Request to update software from remote host bool NetworkFound = false ; // True if WiFi network connected @@ -653,6 +652,7 @@ class VS1053 int8_t shutdown_pin ; // Pin where the shutdown line is connected int8_t shutdownx_pin ; // Pin where the shutdown (inversed) line is connected uint8_t curvol ; // Current volume setting 0..100% + bool mute = false ; // Current mute state const uint8_t vs1053_chunk_size = 32 ; // SCI Register const uint8_t SCI_MODE = 0x0 ; @@ -740,6 +740,12 @@ class VS1053 { // higher is louder. return curvol ; } + void setMute ( bool _mute ) ; // Set the current mute state (has nothing to do with VS1053) + inline bool getMute() const // Get the current mute state (has nothing to do with VS1053) + { + return mute ; + } + void toggleMute() ; // Toggle the current mute state void printDetails ( const char *header ) ; // Print config details to serial output void softReset() ; // Do a soft reset bool testComm ( const char *header ) ; // Test communication with module @@ -933,6 +939,19 @@ void VS1053::begin() } } +// This following function should not use the SPI Bus! +void VS1053::setMute (bool _mute) +{ + mute = _mute ; + output_enable ( !mute ) ; +} + +// This following function should not use the SPI Bus! +void VS1053::toggleMute() +{ + setMute ( !getMute() ); +} + void VS1053::setVolume ( uint8_t vol ) { // Set volume. Both left and right. @@ -946,7 +965,7 @@ void VS1053::setVolume ( uint8_t vol ) value = map ( vol, 0, 100, 0xF8, 0x00 ) ; // 0..100% to one channel value = ( value << 8 ) | value ; write_register ( SCI_VOL, value ) ; // Volume left and right - output_enable ( vol != 0 ) ; // Enable/disable amplifier through shutdown pin(s) + output_enable ( vol != 0 && !mute ) ; // Enable/disable amplifier through shutdown pin(s) } } @@ -966,7 +985,7 @@ void VS1053::setTone ( uint8_t *rtone ) // Set bass/treble (4 ni void VS1053::startSong() { sdi_send_fillers ( 10 ) ; - output_enable ( true ) ; // Enable amplifier through shutdown pin(s) + output_enable ( !mute ) ; // Enable amplifier through shutdown pin(s) unless muted } bool VS1053::playChunk ( uint8_t* data, size_t len ) @@ -1024,6 +1043,7 @@ void VS1053::printDetails ( const char *header ) } } +// This following function should not use the SPI Bus! void VS1053::output_enable ( bool ena ) // Enable amplifier through shutdown pin(s) { if ( shutdown_pin >= 0 ) // Shutdown in use? @@ -4230,7 +4250,7 @@ void chk_enc() switch ( enc_menu_mode ) // Which mode (VOLUME, PRESET, TRACK)? { case VOLUME : - if ( muteflag ) + if ( vs1053player->getMute() ) { tftset ( 3, "" ) ; // Clear text } @@ -4238,7 +4258,7 @@ void chk_enc() { tftset ( 3, "Mute" ) ; } - muteflag = !muteflag ; // Mute/unmute + vs1053player->toggleMute() ; // Mute/unmute break ; case PRESET : currentpreset = -1 ; // Make sure current is different @@ -4270,7 +4290,7 @@ void chk_enc() host = getSDfilename ( "0" ) ; // Get random track hostreq = true ; // Request this host } - muteflag = false ; // Be sure muteing is off + vs1053player->setMute( false ) ; // Be sure muteing is off } } if ( rotationcount == 0 ) // Any rotation? @@ -4293,7 +4313,7 @@ void chk_enc() { ini_block.reqvol += rotationcount ; } - muteflag = false ; // Mute off + vs1053player->setMute( false ); // Mute off break ; case PRESET : if ( ( enc_preset + rotationcount ) < 0 ) // Negative not allowed @@ -5204,13 +5224,13 @@ const char* analyzeCmd ( const char* par, const char* val ) { ini_block.reqvol = 100 ; // Limit to normal values } - muteflag = false ; // Stop possibly muting + vs1053player->setMute( false ) ; // Stop possibly muting sprintf ( reply, "Volume is now %d", // Reply new volume ini_block.reqvol ) ; } else if ( argument == "mute" ) // Mute/unmute request { - muteflag = !muteflag ; // Request volume to zero/normal + vs1053player->toggleMute() ; } else if ( argument.indexOf ( "ir_" ) >= 0 ) // Ir setting? { // Do not handle here @@ -5588,8 +5608,7 @@ void playtask ( void * parameter ) playingstat = 0 ; // Status for MQTT mqttpub.trigger ( MQTT_PLAYING ) ; // Request publishing to MQTT claimSPI ( "stopsong" ) ; // Claim SPI bus - vs1053player->setVolume ( 0 ) ; // Mute - vs1053player->stopSong() ; // STOP, stop player + vs1053player->stopSong() ; // STOP, stop player, also mutes releaseSPI() ; // Release SPI bus vTaskDelay ( 500 / portTICK_PERIOD_MS ) ; // Pause for a short time break ; @@ -5625,14 +5644,9 @@ void handle_spec() releaseSPI() ; // Yes, release SPI bus } claimSPI ( "hspec" ) ; // Claim SPI bus - if ( muteflag ) // Mute or not? - { - vs1053player->setVolume ( 0 ) ; // Mute - } - else - { - vs1053player->setVolume ( ini_block.reqvol ) ; // Unmute - } + + vs1053player->setVolume ( ini_block.reqvol ) ; // Update volume to requested volume, this should not affect mute status + if ( reqtone ) // Request to change tone? { reqtone = false ; From 9a730861fec4f9a8288d46ebf18a30471561a299 Mon Sep 17 00:00:00 2001 From: David Koch Date: Wed, 2 Jan 2019 12:02:31 +0100 Subject: [PATCH 3/5] Revert "Only for testing: Changed to DUMMYTFT" This reverts commit 370dbfff6a0296ecdfb5a3295436c7e51ed5f506. --- Esp32_radio/Esp32_radio.ino | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Esp32_radio/Esp32_radio.ino b/Esp32_radio/Esp32_radio.ino index 56c9919..2afe193 100644 --- a/Esp32_radio/Esp32_radio.ino +++ b/Esp32_radio/Esp32_radio.ino @@ -155,10 +155,10 @@ // Define (just one) type of display. See documentation. //#define BLUETFT // Works also for RED TFT 128x160 //#define OLED // 64x128 I2C OLED -#define DUMMYTFT // Dummy display +//#define DUMMYTFT // Dummy display //#define LCD1602I2C // LCD 1602 display with I2C backpack //#define ILI9341 // ILI9341 240*320 -//#define NEXTION // Nextion display. Uses UART 2 (pin 16 and 17) +#define NEXTION // Nextion display. Uses UART 2 (pin 16 and 17) // #include #include @@ -357,7 +357,7 @@ SemaphoreHandle_t SPIsem = NULL ; // For exclusive SPI us hw_timer_t* timer = NULL ; // For timer char timetxt[9] ; // Converted timeinfo char cmd[130] ; // Command from MQTT or Serial -uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream +uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream QueueHandle_t dataqueue ; // Queue for mp3 datastream QueueHandle_t spfqueue ; // Queue for special functions qdata_struct outchunk ; // Data to queue @@ -2363,7 +2363,7 @@ bool connectwifi() } tftlog ( pfs ) ; // Show IP delay ( 3000 ) ; // Allow user to read this - tftlog ( "\f" ) ; // Select new page if NEXTION + tftlog ( "\f" ) ; // Select new page if NEXTION return ( localAP == false ) ; // Return result of connection } @@ -2422,7 +2422,7 @@ bool do_nextion_update ( uint32_t clength ) } k = otaclient.read ( tmpbuff, k ) ; // Read a number of bytes from the stream dbgprint ( "TFT file, read %d bytes", k ) ; - nxtserial->write ( tmpbuff, k ) ; + nxtserial->write ( tmpbuff, k ) ; while ( !nxtserial->available() ) // Any input seen? { delay ( 20 ) ; @@ -2453,7 +2453,7 @@ bool do_nextion_update ( uint32_t clength ) bool do_software_update ( uint32_t clength ) { bool res = false ; // Update result - + if ( Update.begin ( clength ) ) // Update possible? { dbgprint ( "Begin OTA update, length is %d", @@ -2505,7 +2505,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char String line ; // Input header line String lstmod = "" ; // Last modified timestamp in NVS String newlstmod ; // Last modified from host - + updatereq = false ; // Clear update flag otastart() ; // Show something on screen stop_mp3client () ; // Stop input stream @@ -2543,7 +2543,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char break ; // Yes, get the OTA started } // Check if the HTTP Response is 200. Any other response is an error. - if ( line.startsWith ( "HTTP/1.1" ) ) // + if ( line.startsWith ( "HTTP/1.1" ) ) // { if ( line.indexOf ( " 200 " ) < 0 ) { @@ -2562,7 +2562,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char { dbgprint ( "No new version available" ) ; // No, show reason otaclient.flush() ; - return ; + return ; } if ( clength > 0 ) { @@ -2835,7 +2835,7 @@ String readprefs ( bool output ) String ( "/*******" ) ; } cmd = String ( "" ) ; // Do not analyze this - + } else if ( strstr ( key, "mqttpasswd" ) ) // Is it a MQTT password? { @@ -3027,7 +3027,7 @@ void scanserial2() dbgprint ( "NEXTION command seen %02X %s", cmd[0], cmd + 1 ) ; if ( cmd[0] == 0x70 ) // Button pressed? - { + { reply = analyzeCmd ( cmd + 1 ) ; // Analyze command and handle it dbgprint ( reply ) ; // Result for debugging } @@ -4548,7 +4548,7 @@ void loop() if ( updatereq ) // Software update requested? { if ( displaytype == T_NEXTION ) // NEXTION in use? - { + { update_software ( "lstmodn", // Yes, update NEXTION image from remote image UPDATEHOST, TFTFILE ) ; } @@ -5696,3 +5696,4 @@ void spftask ( void * parameter ) } //vTaskDelete ( NULL ) ; // Will never arrive here } + From 1f2dafb80c8095d4e531a3acd939bd3b5081f625 Mon Sep 17 00:00:00 2001 From: David Koch Date: Wed, 2 Jan 2019 12:02:31 +0100 Subject: [PATCH 4/5] Added version history line --- Esp32_radio/Esp32_radio.ino | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Esp32_radio/Esp32_radio.ino b/Esp32_radio/Esp32_radio.ino index 2afe193..9a2e2a9 100644 --- a/Esp32_radio/Esp32_radio.ino +++ b/Esp32_radio/Esp32_radio.ino @@ -141,6 +141,7 @@ // 18-09-2018, ES: "uppreset" and "downpreset" for MP3 player. // 04-10-2018, ES: Fixed compile error OLED 64x128 display. // 09-10-2018, ES: Bug fix xSemaphoreTake. +// 02-01-2019, DK: Changes in shutdown pin control to make amp shutdown more reliable. Thanks to Pavulon87 // // // Define the version number, also used for webserver as Last-Modified header and to @@ -357,7 +358,7 @@ SemaphoreHandle_t SPIsem = NULL ; // For exclusive SPI us hw_timer_t* timer = NULL ; // For timer char timetxt[9] ; // Converted timeinfo char cmd[130] ; // Command from MQTT or Serial -uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream +uint8_t tmpbuff[6000] ; // Input buffer for mp3 or data stream QueueHandle_t dataqueue ; // Queue for mp3 datastream QueueHandle_t spfqueue ; // Queue for special functions qdata_struct outchunk ; // Data to queue @@ -2363,7 +2364,7 @@ bool connectwifi() } tftlog ( pfs ) ; // Show IP delay ( 3000 ) ; // Allow user to read this - tftlog ( "\f" ) ; // Select new page if NEXTION + tftlog ( "\f" ) ; // Select new page if NEXTION return ( localAP == false ) ; // Return result of connection } @@ -2422,7 +2423,7 @@ bool do_nextion_update ( uint32_t clength ) } k = otaclient.read ( tmpbuff, k ) ; // Read a number of bytes from the stream dbgprint ( "TFT file, read %d bytes", k ) ; - nxtserial->write ( tmpbuff, k ) ; + nxtserial->write ( tmpbuff, k ) ; while ( !nxtserial->available() ) // Any input seen? { delay ( 20 ) ; @@ -2453,7 +2454,7 @@ bool do_nextion_update ( uint32_t clength ) bool do_software_update ( uint32_t clength ) { bool res = false ; // Update result - + if ( Update.begin ( clength ) ) // Update possible? { dbgprint ( "Begin OTA update, length is %d", @@ -2505,7 +2506,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char String line ; // Input header line String lstmod = "" ; // Last modified timestamp in NVS String newlstmod ; // Last modified from host - + updatereq = false ; // Clear update flag otastart() ; // Show something on screen stop_mp3client () ; // Stop input stream @@ -2543,7 +2544,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char break ; // Yes, get the OTA started } // Check if the HTTP Response is 200. Any other response is an error. - if ( line.startsWith ( "HTTP/1.1" ) ) // + if ( line.startsWith ( "HTTP/1.1" ) ) // { if ( line.indexOf ( " 200 " ) < 0 ) { @@ -2562,7 +2563,7 @@ void update_software ( const char* lstmodkey, const char* updatehost, const char { dbgprint ( "No new version available" ) ; // No, show reason otaclient.flush() ; - return ; + return ; } if ( clength > 0 ) { @@ -2835,7 +2836,7 @@ String readprefs ( bool output ) String ( "/*******" ) ; } cmd = String ( "" ) ; // Do not analyze this - + } else if ( strstr ( key, "mqttpasswd" ) ) // Is it a MQTT password? { @@ -3027,7 +3028,7 @@ void scanserial2() dbgprint ( "NEXTION command seen %02X %s", cmd[0], cmd + 1 ) ; if ( cmd[0] == 0x70 ) // Button pressed? - { + { reply = analyzeCmd ( cmd + 1 ) ; // Analyze command and handle it dbgprint ( reply ) ; // Result for debugging } @@ -4548,7 +4549,7 @@ void loop() if ( updatereq ) // Software update requested? { if ( displaytype == T_NEXTION ) // NEXTION in use? - { + { update_software ( "lstmodn", // Yes, update NEXTION image from remote image UPDATEHOST, TFTFILE ) ; } @@ -5644,7 +5645,7 @@ void handle_spec() releaseSPI() ; // Yes, release SPI bus } claimSPI ( "hspec" ) ; // Claim SPI bus - + vs1053player->setVolume ( ini_block.reqvol ) ; // Update volume to requested volume, this should not affect mute status if ( reqtone ) // Request to change tone? @@ -5696,4 +5697,3 @@ void spftask ( void * parameter ) } //vTaskDelete ( NULL ) ; // Will never arrive here } - From 5ffdea67d34bebf446169c2075695e1901d7a675 Mon Sep 17 00:00:00 2001 From: David Koch Date: Wed, 2 Jan 2019 12:02:31 +0100 Subject: [PATCH 5/5] Added playback state to VS1053 to improve amp shutdown logic --- Esp32_radio/Esp32_radio.ino | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Esp32_radio/Esp32_radio.ino b/Esp32_radio/Esp32_radio.ino index 9a2e2a9..4f0f34f 100644 --- a/Esp32_radio/Esp32_radio.ino +++ b/Esp32_radio/Esp32_radio.ino @@ -653,7 +653,8 @@ class VS1053 int8_t shutdown_pin ; // Pin where the shutdown line is connected int8_t shutdownx_pin ; // Pin where the shutdown (inversed) line is connected uint8_t curvol ; // Current volume setting 0..100% - bool mute = false ; // Current mute state + bool mute = false ; // Current mute state + bool playing = false ; // Current playback state const uint8_t vs1053_chunk_size = 32 ; // SCI Register const uint8_t SCI_MODE = 0x0 ; @@ -905,6 +906,7 @@ void VS1053::begin() pinMode ( shutdownx_pin, OUTPUT ) ; } output_enable ( false ) ; // Disable amplifier through shutdown pin(s) + playing = false ; delay ( 100 ) ; // Init SPI in slow mode ( 0.2 MHz ) VS1053_SPI = SPISettings ( 200000, MSBFIRST, SPI_MODE0 ) ; @@ -966,7 +968,7 @@ void VS1053::setVolume ( uint8_t vol ) value = map ( vol, 0, 100, 0xF8, 0x00 ) ; // 0..100% to one channel value = ( value << 8 ) | value ; write_register ( SCI_VOL, value ) ; // Volume left and right - output_enable ( vol != 0 && !mute ) ; // Enable/disable amplifier through shutdown pin(s) + output_enable ( vol != 0 && !mute && playing ) ; // Enable/disable amplifier through shutdown pin(s) } } @@ -986,6 +988,7 @@ void VS1053::setTone ( uint8_t *rtone ) // Set bass/treble (4 ni void VS1053::startSong() { sdi_send_fillers ( 10 ) ; + playing = true ; output_enable ( !mute ) ; // Enable amplifier through shutdown pin(s) unless muted } @@ -1001,6 +1004,7 @@ void VS1053::stopSong() sdi_send_fillers ( 2052 ) ; output_enable ( false ) ; // Disable amplifier through shutdown pin(s) + playing = false ; delay ( 10 ) ; write_register ( SCI_MODE, _BV ( SM_SDINEW ) | _BV ( SM_CANCEL ) ) ; for ( i = 0 ; i < 200 ; i++ ) @@ -1023,6 +1027,7 @@ void VS1053::softReset() write_register ( SCI_MODE, _BV ( SM_SDINEW ) | _BV ( SM_RESET ) ) ; delay ( 10 ) ; await_data_request() ; + playing = false ; } void VS1053::printDetails ( const char *header ) @@ -4291,7 +4296,7 @@ void chk_enc() host = getSDfilename ( "0" ) ; // Get random track hostreq = true ; // Request this host } - vs1053player->setMute( false ) ; // Be sure muteing is off + vs1053player->setMute( false ) ; // Be sure muteing is off } } if ( rotationcount == 0 ) // Any rotation? @@ -5225,7 +5230,7 @@ const char* analyzeCmd ( const char* par, const char* val ) { ini_block.reqvol = 100 ; // Limit to normal values } - vs1053player->setMute( false ) ; // Stop possibly muting + vs1053player->setMute( false ) ; // Stop possible muting sprintf ( reply, "Volume is now %d", // Reply new volume ini_block.reqvol ) ; }