diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 06a3340..523ded6 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -3,3 +3,5 @@ idf_component_register(SRCS "main.c" PRIV_REQUIRES esp_timer esp_wifi nvs_flash audio_board audio_hal audio_sal net_functions opus flac ota_server ui_http_server network_interface ) + +set_source_files_properties(main.c PROPERTIES COMPILE_FLAGS -Wno-implicit-fallthrough) diff --git a/main/main.c b/main/main.c index 89b046d..bbdef39 100644 --- a/main/main.c +++ b/main/main.c @@ -256,7 +256,7 @@ static FLAC__StreamDecoderReadStatus read_callback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { snapcastSetting_t *scSet = (snapcastSetting_t *)client_data; - decoderData_t *flacData; + // decoderData_t *flacData; (void)scSet; @@ -460,7 +460,6 @@ static void http_get_task(void *pvParameters) { uint16_t remotePort = 0; int rc1 = ERR_OK, rc2 = ERR_OK; struct netbuf *firstNetBuf = NULL; - struct netbuf *newNetBuf = NULL; uint16_t len; uint64_t timeout = FAST_SYNC_LATENCY_BUF; char *codecString = NULL; @@ -820,8 +819,7 @@ static void http_get_task(void *pvParameters) { scSet.muted = true; uint64_t startTime, endTime; - int32_t remainderSize = 0; - size_t currentPos = 0; + // size_t currentPos = 0; size_t typedMsgCurrentPos = 0; uint32_t typedMsgLen = 0; uint32_t offset = 0; @@ -885,7 +883,7 @@ static void http_get_task(void *pvParameters) { // now parse the data netbuf_first(firstNetBuf); do { - currentPos = 0; + // currentPos = 0; rc1 = netbuf_data(firstNetBuf, (void **)&start, &len); if (rc1 == ERR_OK) { @@ -1057,7 +1055,7 @@ static void http_get_task(void *pvParameters) { break; } - currentPos++; + // currentPos++;++; len--; start++; @@ -1074,12 +1072,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 1: { @@ -1087,12 +1087,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 2: { @@ -1100,12 +1102,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 3: { @@ -1117,12 +1121,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 4: { @@ -1130,12 +1136,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 5: { @@ -1143,12 +1151,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 6: { @@ -1156,12 +1166,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 7: { @@ -1173,12 +1185,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 8: { @@ -1186,12 +1200,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 9: { @@ -1199,12 +1215,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 10: { @@ -1212,12 +1230,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 11: { @@ -1225,7 +1245,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; @@ -1253,7 +1273,9 @@ static void http_get_task(void *pvParameters) { wire_chnk.timestamp.usec); #endif - break; + if (len == 0) { + break; + } } case 12: { @@ -1290,7 +1312,6 @@ static void http_get_task(void *pvParameters) { } tmpData = 0; - remainderSize = 0; payloadDataShift = 3; payloadOffset = 0; } @@ -1351,7 +1372,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos += tmp_size; start += tmp_size; - currentPos += tmp_size; + // currentPos += tmp_size; len -= tmp_size; if (typedMsgCurrentPos >= base_message_rx.size) { @@ -1675,12 +1696,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 1: { @@ -1688,12 +1711,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 2: { @@ -1701,12 +1726,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 3: { @@ -1730,12 +1757,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 4: { @@ -1746,7 +1775,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos += typedMsgLen; start += typedMsgLen; - currentPos += typedMsgLen; + // currentPos += typedMsgLen; len -= typedMsgLen; } else { memcpy(&codecString[offset], start, typedMsgLen); @@ -1755,7 +1784,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos += len; start += len; - currentPos += len; + // currentPos += len; len -= len; } @@ -1791,7 +1820,9 @@ static void http_get_task(void *pvParameters) { internalState++; } - break; + if (len == 0) { + break; + } } case 5: { @@ -1799,12 +1830,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 6: { @@ -1812,12 +1845,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 7: { @@ -1825,12 +1860,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 8: { @@ -1850,12 +1887,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 9: { @@ -1866,7 +1905,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos += typedMsgLen; start += typedMsgLen; - currentPos += typedMsgLen; + // currentPos += typedMsgLen; len -= typedMsgLen; } else { memcpy(&codecPayload[offset], start, len); @@ -1875,7 +1914,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos += len; start += len; - currentPos += len; + // currentPos += len; len -= len; } @@ -2025,49 +2064,18 @@ static void http_get_task(void *pvParameters) { case SNAPCAST_MESSAGE_SERVER_SETTINGS: { switch (internalState) { case 0: { - while ((netbuf_len(firstNetBuf) - currentPos) < - base_message_rx.size) { - ESP_LOGI(TAG, "need more data"); + typedMsgLen = *start & 0xFF; - // we need more data to process - rc1 = netconn_recv(lwipNetconn, &newNetBuf); - if (rc1 != ERR_OK) { - ESP_LOGE(TAG, "rx error for need more data"); + typedMsgCurrentPos++; + start++; + // currentPos++; + len--; - if (rc1 == ERR_CONN) { - // netconn_close(lwipNetconn); - // closing later, see first - // netconn_recv() in the loop + internalState++; - break; - } - - if (newNetBuf != NULL) { - netbuf_delete(newNetBuf); - - newNetBuf = NULL; - } - - continue; - } - - netbuf_chain(firstNetBuf, newNetBuf); + if (len == 0) { + break; } - - if (rc1 == ERR_OK) { - typedMsgLen = *start & 0xFF; - - typedMsgCurrentPos++; - start++; - currentPos++; - len--; - - internalState++; - } else { - ESP_LOGE(TAG, "some error"); - } - - break; } case 1: { @@ -2075,12 +2083,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 2: { @@ -2088,144 +2098,153 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 3: { typedMsgLen |= (*start & 0xFF) << 24; - // ESP_LOGI(TAG, - // "server settings string is %d - // long", typedMsgLen); + // ESP_LOGI(TAG,"server settings string is %lu" + // " long", typedMsgLen); - typedMsgCurrentPos++; - start++; - currentPos++; - len--; - - internalState++; - - break; - } - - case 4: { // now get some memory for server settings - // string at this point there is still - // plenty of RAM available, so we use - // malloc and netbuf_copy() here + // string serverSettingsString = malloc(typedMsgLen + 1); - if (serverSettingsString == NULL) { ESP_LOGE(TAG, "couldn't get memory for " "server settings string"); - } else { - netbuf_copy_partial(firstNetBuf, serverSettingsString, - typedMsgLen, currentPos); - - serverSettingsString[typedMsgLen] = - 0; // NULL terminate string - - // ESP_LOGI - //(TAG, "got string: %s", tmp); - - result = server_settings_message_deserialize( - &server_settings_message, serverSettingsString); - if (result) { - ESP_LOGE(TAG, - "Failed to read server " - "settings: %d", - result); - } else { - // log mute state, buffer, latency - ESP_LOGI(TAG, "Buffer length: %ld", - server_settings_message.buffer_ms); - ESP_LOGI(TAG, "Latency: %ld", - server_settings_message.latency); - ESP_LOGI(TAG, "Mute: %d", - server_settings_message.muted); - ESP_LOGI(TAG, "Setting volume: %ld", - server_settings_message.volume); - } - - // Volume setting using ADF HAL - // abstraction - if (scSet.muted != server_settings_message.muted) { -#if SNAPCAST_USE_SOFT_VOL - if (server_settings_message.muted) { - dsp_processor_set_volome(0.0); - } else { - dsp_processor_set_volome( - (double)server_settings_message.volume / 100); - } -#endif - audio_hal_set_mute(board_handle->audio_hal, - server_settings_message.muted); - } - - if (scSet.volume != server_settings_message.volume) { -#if SNAPCAST_USE_SOFT_VOL - if (!server_settings_message.muted) { - dsp_processor_set_volome( - (double)server_settings_message.volume / 100); - } -#else - audio_hal_set_volume(board_handle->audio_hal, - server_settings_message.volume); -#endif - } - - scSet.cDacLat_ms = server_settings_message.latency; - scSet.buf_ms = server_settings_message.buffer_ms; - scSet.muted = server_settings_message.muted; - scSet.volume = server_settings_message.volume; - - if (player_send_snapcast_setting(&scSet) != pdPASS) { - ESP_LOGE(TAG, - "Failed to notify sync task. " - "Did you init player?"); - - return; - } - - free(serverSettingsString); - serverSettingsString = NULL; } + typedMsgCurrentPos++; + start++; + // currentPos++; + len--; + internalState++; - // fall through + + offset = 0; + + if (len == 0) { + break; + } } - case 5: { + case 4: { size_t tmpSize = base_message_rx.size - typedMsgCurrentPos; if (len > 0) { if (tmpSize < len) { + if (serverSettingsString) { + memcpy(&serverSettingsString[offset], start, + tmpSize); + } + offset += tmpSize; + start += tmpSize; - currentPos += tmpSize; // will be - // incremented by 1 - // later so -1 here + // currentPos += tmpSize; // will be + // incremented by 1 + // later so -1 here typedMsgCurrentPos += tmpSize; len -= tmpSize; } else { + if (serverSettingsString) { + memcpy(&serverSettingsString[offset], start, len); + } + offset += len; + start += len; - currentPos += len; // will be incremented - // by 1 later so -1 - // here + // currentPos += len; // will be incremented + // by 1 later so -1 + // here typedMsgCurrentPos += len; len = 0; } } if (typedMsgCurrentPos >= base_message_rx.size) { - // ESP_LOGI(TAG, - // "done server settings"); + if (serverSettingsString) { + // ESP_LOGI(TAG, "done server settings %lu/%lu", + // offset, + // typedMsgLen); + + // NULL terminate string + serverSettingsString[typedMsgLen] = 0; + + // ESP_LOGI(TAG, "got string: %s", + // serverSettingsString); + + result = server_settings_message_deserialize( + &server_settings_message, serverSettingsString); + if (result) { + ESP_LOGE(TAG, + "Failed to read server " + "settings: %d", + result); + } else { + // log mute state, buffer, latency + ESP_LOGI(TAG, "Buffer length: %ld", + server_settings_message.buffer_ms); + ESP_LOGI(TAG, "Latency: %ld", + server_settings_message.latency); + ESP_LOGI(TAG, "Mute: %d", + server_settings_message.muted); + ESP_LOGI(TAG, "Setting volume: %ld", + server_settings_message.volume); + } + + // Volume setting using ADF HAL + // abstraction + if (scSet.muted != server_settings_message.muted) { +#if SNAPCAST_USE_SOFT_VOL + if (server_settings_message.muted) { + dsp_processor_set_volome(0.0); + } else { + dsp_processor_set_volome( + (double)server_settings_message.volume / 100); + } +#endif + audio_hal_set_mute(board_handle->audio_hal, + server_settings_message.muted); + } + + if (scSet.volume != server_settings_message.volume) { +#if SNAPCAST_USE_SOFT_VOL + if (!server_settings_message.muted) { + dsp_processor_set_volome( + (double)server_settings_message.volume / 100); + } +#else + audio_hal_set_volume( + board_handle->audio_hal, + server_settings_message.volume); +#endif + } + + scSet.cDacLat_ms = server_settings_message.latency; + scSet.buf_ms = server_settings_message.buffer_ms; + scSet.muted = server_settings_message.muted; + scSet.volume = server_settings_message.volume; + + if (player_send_snapcast_setting(&scSet) != pdPASS) { + ESP_LOGE(TAG, + "Failed to notify sync task. " + "Did you init player?"); + + return; + } + + free(serverSettingsString); + serverSettingsString = NULL; + } state = BASE_MESSAGE_STATE; internalState = 0; @@ -2253,12 +2272,12 @@ static void http_get_task(void *pvParameters) { if (tmpSize < len) { start += tmpSize; - currentPos += tmpSize; + // currentPos += tmpSize; typedMsgCurrentPos += tmpSize; len -= tmpSize; } else { start += len; - currentPos += len; + // currentPos += len; typedMsgCurrentPos += len; len = 0; @@ -2287,12 +2306,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 1: { @@ -2300,12 +2321,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 2: { @@ -2313,12 +2336,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 3: { @@ -2326,12 +2351,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 4: { @@ -2339,12 +2366,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 5: { @@ -2352,12 +2381,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 6: { @@ -2365,12 +2396,14 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; internalState++; - break; + if (len == 0) { + break; + } } case 7: { @@ -2378,7 +2411,7 @@ static void http_get_task(void *pvParameters) { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; if (typedMsgCurrentPos >= base_message_rx.size) { // ESP_LOGI(TAG, "done time message"); @@ -2496,7 +2529,7 @@ static void http_get_task(void *pvParameters) { default: { typedMsgCurrentPos++; start++; - currentPos++; + // currentPos++; len--; if (typedMsgCurrentPos >= base_message_rx.size) {