Merge branch 'fix_20ms_chunk_size_bug' into eth_and_wifi

This commit is contained in:
Karl Osterseher
2025-01-29 22:27:13 +01:00
Unverified
2 changed files with 248 additions and 213 deletions

View File

@@ -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)

View File

@@ -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) {