From e2fc307451e22de3ab64a6aaa78e6aa0719ae4c4 Mon Sep 17 00:00:00 2001 From: Carlos Date: Sun, 29 Aug 2021 21:16:52 +0200 Subject: [PATCH] - rename a view things - run player_task on core 1 with max priority - create/destroy chunk queue as required automatically - use mutex to access snapcast config and communicate this change by queue with size 1 - increase buffers for WIFI and LWIP in sdkconfig for NO_SPIRAM config - add some more debug output --- components/lightsnapcast/include/player.h | 13 +- components/lightsnapcast/player.c | 425 +++++++++++++--------- main/main.c | 127 +++---- sdkconfig | 60 +-- sdkconfig.old | 131 ++----- 5 files changed, 385 insertions(+), 371 deletions(-) diff --git a/components/lightsnapcast/include/player.h b/components/lightsnapcast/include/player.h index 65a5391..daaea8e 100644 --- a/components/lightsnapcast/include/player.h +++ b/components/lightsnapcast/include/player.h @@ -39,27 +39,26 @@ typedef enum codec_type_e typedef struct snapcastSetting_s { uint32_t buffer_ms; - uint32_t chunkDuration_ms; - int32_t clientDacLatency_ms; + uint32_t chkDur_ms; + int32_t cDacLat_ms; codec_type_t codec; - int32_t sampleRate; - uint8_t channels; + int32_t sr; + uint8_t ch; i2s_bits_per_sample_t bits; bool muted; uint32_t volume; } snapcastSetting_t; -QueueHandle_t init_player (void); +int init_player (void); int deinit_player (void); int8_t insert_pcm_chunk (wire_chunk_message_t *decodedWireChunk); int8_t free_pcm_chunk (pcm_chunk_message_t *pcmChunk); int8_t player_latency_insert (int64_t newValue); -int8_t player_notify_buffer_ms (uint32_t ms); -int8_t player_send_snapcast_setting (snapcastSetting_t setting); +int8_t player_send_snapcast_setting (snapcastSetting_t *setting); int8_t reset_latency_buffer (void); int8_t latency_buffer_full (void); diff --git a/components/lightsnapcast/player.c b/components/lightsnapcast/player.c index fb9bcad..a3c7400 100644 --- a/components/lightsnapcast/player.c +++ b/components/lightsnapcast/player.c @@ -23,8 +23,8 @@ #include "i2s.h" // use custom i2s driver instead of IDF version -#define SYNC_TASK_PRIORITY 20 -#define SYNC_TASK_CORE_ID tskNO_AFFINITY +#define SYNC_TASK_PRIORITY configMAX_PRIORITIES - 1 // 20 +#define SYNC_TASK_CORE_ID 1 // tskNO_AFFINITY static const char *TAG = "PLAYER"; @@ -54,12 +54,11 @@ static sMedianNode_t shortMedianBuffer[SHORT_BUFFER_LEN]; static int8_t currentDir = 0; //!< current apll direction, see apll_adjust() static QueueHandle_t pcmChunkQueueHandle = NULL; -#define PCM_CHNK_QUEUE_LENGTH \ - 50 // TODO: one chunk is hardcoded to 20ms, change it to be dynamically - // adjustable. -static StaticQueue_t pcmChunkQueue; -static uint8_t pcmChunkQueueStorageArea[PCM_CHNK_QUEUE_LENGTH - * sizeof (pcm_chunk_message_t *)]; + +//#define PCM_CHNK_QUEUE_LENGTH 50 // TODO: one chunk is hardcoded to 20ms, +// change it to be dynamically adjustable. static StaticQueue_t pcmChunkQueue; +// static uint8_t pcmChunkQueueStorageArea[PCM_CHNK_QUEUE_LENGTH +// * sizeof (pcm_chunk_message_t *)]; static TaskHandle_t syncTaskHandle = NULL; @@ -70,11 +69,12 @@ static size_t chunkInBytes; static uint32_t i2sDmaBufCnt; static uint32_t i2sDmaBufMaxLen; -snapcastSetting_t currentSnapcastSetting; +static SemaphoreHandle_t snapcastSettingsMux = NULL; +static snapcastSetting_t currentSnapcastSetting; static void tg0_timer_init (void); static void tg0_timer_deinit (void); -static void snapcast_sync_task (void *pvParameters); +static void player_task (void *pvParameters); /* #define CONFIG_MASTER_I2S_BCK_PIN 5 @@ -94,10 +94,10 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) const int __dmaBufMaxLen = 1024; int m_scale = 8, fi2s_clk; - chunkInBytes = (setting->chunkDuration_ms * setting->sampleRate - * setting->channels * (setting->bits / 8)) - / 1000; - chunkInFrames = chunkInBytes / (setting->channels * (setting->bits / 8)); + chunkInBytes + = (setting->chkDur_ms * setting->sr * setting->ch * (setting->bits / 8)) + / 1000; + chunkInFrames = chunkInBytes / (setting->ch * (setting->bits / 8)); __dmaBufCnt = 1; __dmaBufLen = chunkInFrames; @@ -121,10 +121,10 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) i2sDmaBufCnt = __dmaBufCnt; i2sDmaBufMaxLen = __dmaBufLen; - fi2s_clk = setting->sampleRate * setting->channels * setting->bits * m_scale; + fi2s_clk = setting->sr * setting->ch * setting->bits * m_scale; apll_normal_predefine[0] = setting->bits; - apll_normal_predefine[1] = setting->sampleRate; + apll_normal_predefine[1] = setting->sr; if (i2s_apll_calculate_fi2s ( fi2s_clk, setting->bits, &apll_normal_predefine[2], &apll_normal_predefine[3], &apll_normal_predefine[4], @@ -135,7 +135,7 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) } apll_corr_predefine[0][0] = setting->bits; - apll_corr_predefine[0][1] = setting->sampleRate * 1.001; + apll_corr_predefine[0][1] = setting->sr * 1.001; if (i2s_apll_calculate_fi2s ( fi2s_clk * 1.001, setting->bits, &apll_corr_predefine[0][2], &apll_corr_predefine[0][3], &apll_corr_predefine[0][4], @@ -145,7 +145,7 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) ESP_LOGE (TAG, "ERROR, fi2s_clk * 1.001"); } apll_corr_predefine[1][0] = setting->bits; - apll_corr_predefine[1][1] = setting->sampleRate * 0.999; + apll_corr_predefine[1][1] = setting->sr * 0.999; if (i2s_apll_calculate_fi2s ( fi2s_clk * 0.999, setting->bits, &apll_corr_predefine[1][2], &apll_corr_predefine[1][3], &apll_corr_predefine[1][4], @@ -160,7 +160,7 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) i2s_config_t i2s_config0 = { .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX - .sample_rate = setting->sampleRate, + .sample_rate = setting->sr, .bits_per_sample = setting->bits, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // 2-channels .communication_format = I2S_COMM_FORMAT_STAND_I2S, @@ -182,14 +182,51 @@ player_setup_i2s (i2s_port_t i2sNum, snapcastSetting_t *setting) return 0; } +/** + * + */ +static int +destroy_pcm_queue (QueueHandle_t *queueHandle) +{ + int ret = pdPASS; + pcm_chunk_message_t *chnk = NULL; + + if (*queueHandle == NULL) + { + ESP_LOGW (TAG, "no pcm chunk queue created?"); + ret = pdFAIL; + } + else + { + // free all allocated memory + while (uxQueueMessagesWaiting (*queueHandle)) + { + ret = xQueueReceive (*queueHandle, &chnk, pdMS_TO_TICKS (2000)); + if (ret != pdFAIL) + { + if (chnk != NULL) + { + free_pcm_chunk (chnk); + } + } + } + + // delete the queue + vQueueDelete (*queueHandle); + *queueHandle = NULL; + + ret = pdPASS; + } + + return ret; +} + // ensure this is called after http_task was killed! int deinit_player (void) { int ret = 0; - pcm_chunk_message_t *chnk = NULL; - // stop the task if (syncTaskHandle == NULL) { @@ -200,30 +237,13 @@ deinit_player (void) vTaskDelete (syncTaskHandle); } - if (pcmChunkQueueHandle == NULL) + if (snapcastSettingsMux != NULL) { - ESP_LOGW (TAG, "no pcm chunk queue created?"); + vSemaphoreDelete (snapcastSettingsMux); + snapcastSettingsMux = NULL; } - else - { - // free all allocated memory - while (uxQueueMessagesWaiting (pcmChunkQueueHandle)) - { - ret = xQueueReceive (pcmChunkQueueHandle, &chnk, - pdMS_TO_TICKS (2000)); - if (ret != pdFAIL) - { - if (chnk != NULL) - { - free_pcm_chunk (chnk); - } - } - } - // delete the queue - vQueueDelete (pcmChunkQueueHandle); - pcmChunkQueueHandle = NULL; - } + ret = destroy_pcm_queue (&pcmChunkQueueHandle); if (latencyBufSemaphoreHandle == NULL) { @@ -245,26 +265,32 @@ deinit_player (void) /** * call before http task creation! */ -QueueHandle_t +int init_player (void) { - int ret; + int ret = 0; currentSnapcastSetting.buffer_ms = 1000; - currentSnapcastSetting.chunkDuration_ms = 20; + currentSnapcastSetting.chkDur_ms = 20; currentSnapcastSetting.codec = NONE; - currentSnapcastSetting.sampleRate = 44100; - currentSnapcastSetting.channels = 2; + currentSnapcastSetting.sr = 44100; + currentSnapcastSetting.ch = 2; currentSnapcastSetting.bits = 16; currentSnapcastSetting.muted = false; currentSnapcastSetting.volume = 70; + if (snapcastSettingsMux == NULL) + { + snapcastSettingsMux = xSemaphoreCreateMutex (); + xSemaphoreGive (snapcastSettingsMux); + } + ret = player_setup_i2s (I2S_NUM_0, ¤tSnapcastSetting); if (ret < 0) { ESP_LOGE (TAG, "player_setup_i2s failed: %d", ret); - return NULL; + return -1; } // create semaphore for time diff buffer to server @@ -273,14 +299,6 @@ init_player (void) latencyBufSemaphoreHandle = xSemaphoreCreateMutex (); } - // create snapcast receive buffer - if (pcmChunkQueueHandle == NULL) - { - pcmChunkQueueHandle = xQueueCreateStatic ( - PCM_CHNK_QUEUE_LENGTH, sizeof (pcm_chunk_message_t *), - pcmChunkQueueStorageArea, &pcmChunkQueue); - } - // init diff buff median filter latencyMedianFilterLong.numNodes = LATENCY_MEDIAN_FILTER_LEN; latencyMedianFilterLong.medianBuffer = latencyMedianLongBuffer; @@ -292,14 +310,42 @@ init_player (void) { ESP_LOGI (TAG, "Start snapcast_sync_task"); - xTaskCreatePinnedToCore (snapcast_sync_task, "snapcast_sync_task", - 8 * 1024, NULL, SYNC_TASK_PRIORITY, - &syncTaskHandle, SYNC_TASK_CORE_ID); + xTaskCreatePinnedToCore (player_task, "snapcast_sync_task", 8 * 1024, + NULL, SYNC_TASK_PRIORITY, &syncTaskHandle, + SYNC_TASK_CORE_ID); } ESP_LOGI (TAG, "init player done"); - return pcmChunkQueueHandle; + return 0; +} + +int8_t +player_set_snapcast_settings (snapcastSetting_t *setting) +{ + int8_t ret = pdPASS; + + xSemaphoreTake (snapcastSettingsMux, portMAX_DELAY); + + memcpy (¤tSnapcastSetting, setting, sizeof (snapcastSetting_t)); + + xSemaphoreGive (snapcastSettingsMux); + + return ret; +} + +int8_t +player_get_snapcast_settings (snapcastSetting_t *setting) +{ + int8_t ret = pdPASS; + + xSemaphoreTake (snapcastSettingsMux, portMAX_DELAY); + + memcpy (setting, ¤tSnapcastSetting, sizeof (snapcastSetting_t)); + + xSemaphoreGive (snapcastSettingsMux); + + return ret; } int8_t @@ -331,54 +377,66 @@ player_latency_insert (int64_t newValue) * */ int8_t -player_notify_buffer_ms (uint32_t ms) -{ - if (syncTaskHandle == NULL) - { - return -1; - } - - // notify task of changed parameters - xTaskNotify (syncTaskHandle, ms, eSetBits); - - return 0; -} - -/** - * - */ -int8_t -player_send_snapcast_setting (snapcastSetting_t setting) +player_send_snapcast_setting (snapcastSetting_t *setting) { int ret; + snapcastSetting_t curSet; + uint8_t settingChanged = 1; if ((syncTaskHandle == NULL) || (snapcastSettingQueueHandle == NULL)) { - return -1; + return pdFAIL; } - if ((currentSnapcastSetting.bits != setting.bits) - || (currentSnapcastSetting.buffer_ms != setting.buffer_ms) - || (currentSnapcastSetting.channels != setting.channels) - || (currentSnapcastSetting.chunkDuration_ms != setting.chunkDuration_ms) - || (currentSnapcastSetting.codec != setting.codec) - || (currentSnapcastSetting.muted != setting.muted) - || (currentSnapcastSetting.sampleRate != setting.sampleRate) - || (currentSnapcastSetting.volume != setting.volume)) + ret = player_get_snapcast_settings (&curSet); + + if ((curSet.bits != setting->bits) + || (curSet.buffer_ms != setting->buffer_ms) || (curSet.ch != setting->ch) + || (curSet.chkDur_ms != setting->chkDur_ms) + || (curSet.codec != setting->codec) || (curSet.muted != setting->muted) + || (curSet.sr != setting->sr) || (curSet.volume != setting->volume)) { - // notify task of changed parameters - memcpy (¤tSnapcastSetting, &setting, sizeof (snapcastSetting_t)); - ret = xQueueSend (snapcastSettingQueueHandle, ¤tSnapcastSetting, - pdMS_TO_TICKS (10)); - if (ret != pdPASS) + // check if it is only volume / mute related setting, which is handled by + // http_get_task() + if (((curSet.muted != setting->muted) + || (curSet.volume != setting->volume)) + && ((curSet.bits == setting->bits) + && (curSet.buffer_ms == setting->buffer_ms) + && (curSet.ch == setting->ch) + && (curSet.chkDur_ms == setting->chkDur_ms) + && (curSet.codec == setting->codec) + && (curSet.sr == setting->sr))) { - ESP_LOGE ( - TAG, - "player_send_snapcast_setting: couldn't send snapcast setting"); + // no notify needed, only set changed parameters + ret = player_set_snapcast_settings (setting); + if (ret != pdPASS) + { + ESP_LOGE (TAG, "player_send_snapcast_setting: couldn't change " + "snapcast setting"); + } + } + else + { + ret = xQueueOverwrite (snapcastSettingQueueHandle, &settingChanged); + if (ret != pdPASS) + { + ESP_LOGE (TAG, "player_send_snapcast_setting: couldn't notify " + "snapcast setting"); + } + else + { + // notify successful, so change parameters + ret = player_set_snapcast_settings (setting); + if (ret != pdPASS) + { + ESP_LOGE (TAG, "player_send_snapcast_setting: couldn't " + "change snapcast setting"); + } + } } } - return 0; + return pdPASS; } /** @@ -619,7 +677,6 @@ void adjust_apll (int8_t direction) { int sdm0, sdm1, sdm2, o_div; - // int index = 2; // 2 for slow adjustment, 0 for fast adjustment // only change if necessary if (currentDir == direction) @@ -627,28 +684,6 @@ adjust_apll (int8_t direction) return; } - // if (direction == 1) { - // // speed up - // sdm0 = apll_predefine_48k_corr[index][2]; - // sdm1 = apll_predefine_48k_corr[index][3]; - // sdm2 = apll_predefine_48k_corr[index][4]; - // o_div = apll_predefine_48k_corr[index][5]; - // } else if (direction == -1) { - // // slow down - // sdm0 = apll_predefine_48k_corr[index + 1][2]; - // sdm1 = apll_predefine_48k_corr[index + 1][3]; - // sdm2 = apll_predefine_48k_corr[index + 1][4]; - // o_div = apll_predefine_48k_corr[index + 1][5]; - // } else { - // // reset to normal playback speed - // sdm0 = apll_predefine[5][2]; - // sdm1 = apll_predefine[5][3]; - // sdm2 = apll_predefine[5][4]; - // o_div = apll_predefine[5][5]; - // - // direction = 0; - // } - if (direction == 1) { // speed up @@ -759,6 +794,13 @@ insert_pcm_chunk (wire_chunk_message_t *decodedWireChunk) return -1; } + if (pcmChunkQueueHandle == NULL) + { + ESP_LOGW (TAG, "pcm chunk queue not created"); + + return -2; + } + pcmChunk = (pcm_chunk_message_t *)calloc (1, sizeof (pcm_chunk_message_t)); if (pcmChunk == NULL) { @@ -902,8 +944,6 @@ insert_pcm_chunk (wire_chunk_message_t *decodedWireChunk) if (largestFreeBlock <= tmpSize) { s = largestFreeBlock; - // TODO: DMA buffer needs to be changed also to - // one chunk size if sample rate changes } else { @@ -1099,17 +1139,18 @@ insert_pcm_chunk (wire_chunk_message_t *decodedWireChunk) * */ static void -snapcast_sync_task (void *pvParameters) +player_task (void *pvParameters) { pcm_chunk_message_t *chnk = NULL; int64_t serverNow = 0; int64_t age; BaseType_t ret; - int64_t chunkDuration_us; // = WIRE_CHUNK_DURATION_MS * 1000; + int64_t chunkDuration_us; char *p_payload = NULL; size_t size = 0; uint32_t notifiedValue; - snapcastSetting_t snapcastSetting; + snapcastSetting_t scSet; + uint8_t scSetChgd = 0; uint64_t timer_val; const int32_t alarmValSub = 0; int initialSync = 0; @@ -1120,10 +1161,12 @@ snapcast_sync_task (void *pvParameters) size_t written; bool gotSnapserverConfig = false; int64_t clientDacLatency_us = 0; + uint64_t start, end; ESP_LOGI (TAG, "started sync task"); - snapcastSettingQueueHandle = xQueueCreate (1, sizeof (snapcastSetting_t)); + // create message queue to inform task of changed settings + snapcastSettingQueueHandle = xQueueCreate (1, sizeof (uint8_t)); initialSync = 0; @@ -1141,22 +1184,20 @@ snapcast_sync_task (void *pvParameters) { // check if we got changed setting available, if so we need to // reinitialize - ret = xQueueReceive (snapcastSettingQueueHandle, &snapcastSetting, 0); + ret = xQueueReceive (snapcastSettingQueueHandle, &scSetChgd, 0); if (ret == pdTRUE) { - buffer_us_local = (int64_t) (snapcastSetting.buffer_ms) * 1000LL; + player_get_snapcast_settings (&scSet); - chunkDuration_us - = (int64_t) (snapcastSetting.chunkDuration_ms) * 1000LL; + buffer_us_local = (int64_t) (scSet.buffer_ms) * 1000LL; + + chunkDuration_us = (int64_t) (scSet.chkDur_ms) * 1000LL; chunkInBytes - = (snapcastSetting.chunkDuration_ms * snapcastSetting.sampleRate - * snapcastSetting.channels * (snapcastSetting.bits / 8)) + = (scSet.chkDur_ms * scSet.sr * scSet.ch * (scSet.bits / 8)) / 1000; - clientDacLatency_us - = (int64_t)snapcastSetting.clientDacLatency_ms * 1000LL; + clientDacLatency_us = (int64_t)scSet.cDacLat_ms * 1000LL; - if ((snapcastSetting.sampleRate > 0) && (snapcastSetting.bits) > 0 - && (snapcastSetting.channels > 0)) + if ((scSet.sr > 0) && (scSet.bits) > 0 && (scSet.ch > 0)) { i2s_custom_stop (I2S_NUM_0); @@ -1172,19 +1213,31 @@ snapcast_sync_task (void *pvParameters) = 1; // force adjust_apll to set correct playback speed adjust_apll (0); - i2s_custom_set_clk (I2S_NUM_0, snapcastSetting.sampleRate, - snapcastSetting.bits, - snapcastSetting.channels); + i2s_custom_set_clk (I2S_NUM_0, scSet.sr, scSet.bits, scSet.ch); initialSync = 0; } + if ((scSet.buffer_ms > 0) && (scSet.chkDur_ms > 0)) + { + // create snapcast receive buffer + if (pcmChunkQueueHandle != NULL) + { + destroy_pcm_queue (&pcmChunkQueueHandle); + } + + int entries = ((float)scSet.buffer_ms / (float)scSet.chkDur_ms) + + 0.5; // round up + pcmChunkQueueHandle + = xQueueCreate (entries, sizeof (pcm_chunk_message_t *)); + + ESP_LOGI (TAG, "created new queue with %d", entries); + } + ESP_LOGI (TAG, "snapserver config changed, buffer %dms, chunk %dms, " - "sample rate %d, ch %d, bits %d", - snapcastSetting.buffer_ms, - snapcastSetting.chunkDuration_ms, - snapcastSetting.sampleRate, snapcastSetting.channels, - snapcastSetting.bits); + "sample rate %d, ch %d, bits %d mute %d", + scSet.buffer_ms, scSet.chkDur_ms, scSet.sr, scSet.ch, + scSet.bits, scSet.muted); gotSnapserverConfig = true; } @@ -1195,10 +1248,26 @@ snapcast_sync_task (void *pvParameters) continue; } + start = esp_timer_get_time (); + if (chnk == NULL) { - ret = xQueueReceive (pcmChunkQueueHandle, &chnk, - pdMS_TO_TICKS (2000)); + if (pcmChunkQueueHandle != NULL) + { + ret = xQueueReceive (pcmChunkQueueHandle, &chnk, + pdMS_TO_TICKS (2000)); + } + else + { + // ESP_LOGE (TAG, + // "Couldn't get PCM chunk, pcm queue not + // created"); + + vTaskDelay (pdMS_TO_TICKS (100)); + + continue; + } + if (ret != pdFAIL) { // ESP_LOGW(TAG, "got pcm chunk"); @@ -1393,7 +1462,11 @@ snapcast_sync_task (void *pvParameters) int64_t t; get_diff_to_server (&t); - ESP_LOGW (TAG, "RESYNCING HARD 1 %lldus, %lldus", age, t); + end = esp_timer_get_time (); + ESP_LOGW ( + TAG, + "RESYNCING HARD 1 %lldus, %lldus, %lldus, exTime: %lldus", + age, avg, t, end - start); dir = 0; @@ -1402,17 +1475,17 @@ snapcast_sync_task (void *pvParameters) continue; } + const uint8_t enableControlLoop = 1; + const int64_t age_expect + = -chunkDuration_us + * 1; // this value is highly coupled with I2S DMA buffer + // size. DMA buffer has a size of 1 chunk (e.g. 20ms) + // so next chunk we get from queue will be -20ms + const int64_t maxOffset = 50; //µs, softsync 1 + const int64_t hardResyncThreshold = 3000; //µs, hard sync + if (initialSync == 1) { - const uint8_t enableControlLoop = 1; - const int64_t age_expect - = -chunkDuration_us - * 1; // this value is highly coupled with I2S DMA buffer - // size. DMA buffer has a size of 1 chunk (e.g. 20ms) - // so next chunk we get from queue will be -20ms - const int64_t maxOffset = 50; //µs, softsync 1 - const int64_t hardResyncThreshold = 3000; //µs, hard sync - avg = MEDIANFILTER_Insert (&shortMedianFilter, age + (-age_expect)); if (MEDIANFILTER_isFull (&shortMedianFilter) == 0) @@ -1433,8 +1506,11 @@ snapcast_sync_task (void *pvParameters) int64_t t; get_diff_to_server (&t); - ESP_LOGW (TAG, "RESYNCING HARD 2 %lldus, %lldus, %lldus", - age, avg, t); + end = esp_timer_get_time (); + ESP_LOGW (TAG, + "RESYNCING HARD 2 %lldus, %lldus, %lldus, " + "exTime: %lldus", + age, avg, t, end - start); initialSync = 0; @@ -1460,6 +1536,24 @@ snapcast_sync_task (void *pvParameters) adjust_apll (dir); } + int64_t t; + get_diff_to_server (&t); + + if ((avg < 30 * -maxOffset) || (avg > 30 * maxOffset)) + { + end = esp_timer_get_time (); + + ESP_LOGW (TAG, "%d: %lldus, %lldus %lldus, exTime: %lldus", + dir, age, avg, t, end - start); + } + else + { + end = esp_timer_get_time (); + + ESP_LOGI (TAG, "%d: %lldus, %lldus %lldus, exTime: %lldus", + dir, age, avg, t, end - start); + } + fragment = chnk->fragment; p_payload = fragment->payload; size = fragment->size; @@ -1502,19 +1596,20 @@ snapcast_sync_task (void *pvParameters) } while (1); } - - int64_t t; - get_diff_to_server (&t); - ESP_LOGI (TAG, "%d: %lldus, %lldus %lldus", dir, age, avg, t); } else { int64_t t; + get_diff_to_server (&t); - ESP_LOGE (TAG, - "Couldn't get PCM chunk, recv: messages waiting %d, " - "latency %lldus", - uxQueueMessagesWaiting (pcmChunkQueueHandle), t); + + if (pcmChunkQueueHandle != NULL) + { + ESP_LOGE (TAG, + "Couldn't get PCM chunk, recv: messages waiting %d, " + "latency %lldus", + uxQueueMessagesWaiting (pcmChunkQueueHandle), t); + } dir = 0; diff --git a/main/main.c b/main/main.c index 9e86617..0d8bd97 100644 --- a/main/main.c +++ b/main/main.c @@ -61,8 +61,6 @@ xTaskHandle t_http_get_task; xQueueHandle prot_queue; -static snapcastSetting_t snapcastSetting; - // static int64_t clientDacLatency = 0; // uint32_t buffer_ms = 400; // uint8_t muteCH[4] = {0}; @@ -84,7 +82,7 @@ static const char *TAG = "SNAPCAST"; extern char mac_address[18]; -static QueueHandle_t playerChunkQueueHandle; +// static QueueHandle_t playerChunkQueueHandle = NULL; SemaphoreHandle_t timeSyncSemaphoreHandle = NULL; #if CONFIG_USE_DSP_PROCESSOR @@ -97,13 +95,17 @@ uint8_t dspFlow = dspfStereo; // dspfBiamp; // dspfStereo; // dspfBassBoost; void time_sync_msg_cb (void *args) { - static BaseType_t xHigherPriorityTaskWoken; + BaseType_t xHigherPriorityTaskWoken; // causes kernel panic, which shouldn't happen though? // Isn't it called from timer task instead of ISR? // xSemaphoreGive(timeSyncSemaphoreHandle); xSemaphoreGiveFromISR (timeSyncSemaphoreHandle, &xHigherPriorityTaskWoken); + if (xHigherPriorityTaskWoken) + { + portYIELD_FROM_ISR (); + } } /** @@ -139,6 +141,7 @@ http_get_task (void *pvParameters) mdns_result_t *r; OpusDecoder *opusDecoder = NULL; codec_type_t codec = NONE; + snapcastSetting_t scSet; // create a timer to send time sync messages every x µs esp_timer_create (&tSyncArgs, &timeSyncMessageTimer); @@ -320,14 +323,14 @@ http_get_task (void *pvParameters) hello_message_serialized = NULL; // init default setting - snapcastSetting.buffer_ms = 0; - snapcastSetting.codec = NONE; - snapcastSetting.bits = 0; - snapcastSetting.channels = 0; - snapcastSetting.sampleRate = 0; - snapcastSetting.chunkDuration_ms = 0; - snapcastSetting.volume = 0; - snapcastSetting.muted = false; + scSet.buffer_ms = 0; + scSet.codec = NONE; + scSet.bits = 0; + scSet.ch = 0; + scSet.sr = 0; + scSet.chkDur_ms = 0; + scSet.volume = 0; + scSet.muted = true; for (;;) { @@ -471,10 +474,10 @@ http_get_task (void *pvParameters) codec = OPUS; - snapcastSetting.codec = codec; - snapcastSetting.bits = bits; - snapcastSetting.channels = channels; - snapcastSetting.sampleRate = rate; + scSet.codec = codec; + scSet.bits = bits; + scSet.ch = channels; + scSet.sr = rate; } else if (strcmp (codec_header_message.codec, "pcm") == 0) { @@ -490,10 +493,10 @@ http_get_task (void *pvParameters) codec_header_message.codec, rate, bits, channels); - snapcastSetting.codec = codec; - snapcastSetting.bits = bits; - snapcastSetting.channels = channels; - snapcastSetting.sampleRate = rate; + scSet.codec = codec; + scSet.bits = bits; + scSet.ch = channels; + scSet.sr = rate; } else { @@ -566,15 +569,14 @@ http_get_task (void *pvParameters) { #if CONFIG_USE_PSRAM audio = (int16_t *)heap_caps_malloc ( - frameSize * snapcastSetting.channels - * (snapcastSetting.bits / 8), + frameSize * scSet.ch * (scSet.bits / 8), MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); // 960*2: 20ms, // 960*1: 10ms #else audio = (int16_t *)malloc ( - frameSize * snapcastSetting.channels - * (snapcastSetting.bits + frameSize * scSet.ch + * (scSet.bits / 8)); // 960*2: 20ms, 960*1: 10ms #endif } @@ -601,8 +603,7 @@ http_get_task (void *pvParameters) #if CONFIG_USE_PSRAM audio = (int16_t *)heap_caps_realloc ( audio, - pcm_size * snapcastSetting.channels - * (snapcastSetting.bits / 8), + pcm_size * scSet.ch * (scSet.bits / 8), MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); // 2 channels + // 2 Byte per @@ -610,9 +611,8 @@ http_get_task (void *pvParameters) // int32_t #else audio = (int16_t *)realloc ( - audio, pcm_size - * snapcastSetting.channels - * (snapcastSetting.bits / 8)); + audio, + pcm_size * scSet.ch * (scSet.bits / 8)); // audio = (int16_t // *)heap_caps_realloc( // (int32_t @@ -644,21 +644,19 @@ http_get_task (void *pvParameters) { wire_chunk_message_t pcm_chunk_message; - pcm_chunk_message.size - = frame_size * snapcastSetting.channels - * (snapcastSetting.bits / 8); + pcm_chunk_message.size = frame_size + * scSet.ch + * (scSet.bits / 8); pcm_chunk_message.payload = (char *)audio; pcm_chunk_message.timestamp = timestamp; - snapcastSetting.chunkDuration_ms + scSet.chkDur_ms = (1000UL * pcm_chunk_message.size) - / (uint32_t) ( - snapcastSetting.channels - * (snapcastSetting.bits / 8)) - / snapcastSetting.sampleRate; - if (player_send_snapcast_setting ( - snapcastSetting) - < 0) + / (uint32_t) (scSet.ch + * (scSet.bits / 8)) + / scSet.sr; + if (player_send_snapcast_setting (&scSet) + != pdPASS) { ESP_LOGE ( TAG, @@ -679,9 +677,8 @@ http_get_task (void *pvParameters) // } #if CONFIG_USE_DSP_PROCESSOR - dsp_setup_flow ( - 500, snapcastSetting.sampleRate, - snapcastSetting.chunkDuration_ms); + dsp_setup_flow (500, scSet.sr, + scSet.chkDur_ms); dsp_processor (pcm_chunk_message.payload, pcm_chunk_message.size, dspFlow); @@ -730,14 +727,12 @@ http_get_task (void *pvParameters) memcpy (pcm_chunk_message.payload, start, pcm_chunk_message.size); - snapcastSetting.chunkDuration_ms + scSet.chkDur_ms = (1000UL * pcm_chunk_message.size) - / (uint32_t) (snapcastSetting.channels - * (snapcastSetting.bits / 8)) - / snapcastSetting.sampleRate; - if (player_send_snapcast_setting ( - snapcastSetting) - < 0) + / (uint32_t) (scSet.ch * (scSet.bits / 8)) + / scSet.sr; + if (player_send_snapcast_setting (&scSet) + != pdPASS) { ESP_LOGE (TAG, "Failed to notify sync task about " @@ -747,9 +742,7 @@ http_get_task (void *pvParameters) } #if CONFIG_USE_DSP_PROCESSOR - dsp_setup_flow ( - 500, snapcastSetting.sampleRate, - snapcastSetting.chunkDuration_ms); + dsp_setup_flow (500, scSet.sr, scSet.chkDur_ms); dsp_processor (pcm_chunk_message.payload, pcm_chunk_message.size, dspFlow); #endif @@ -801,25 +794,23 @@ http_get_task (void *pvParameters) server_settings_message.volume); // Volume setting using ADF HAL abstraction - if (snapcastSetting.muted != server_settings_message.muted) + if (scSet.muted != server_settings_message.muted) { audio_hal_set_mute (board_handle->audio_hal, server_settings_message.muted); } - if (snapcastSetting.volume != server_settings_message.volume) + if (scSet.volume != server_settings_message.volume) { - audio_hal_set_mute (board_handle->audio_hal, - server_settings_message.volume); + audio_hal_set_volume (board_handle->audio_hal, + server_settings_message.volume); } - snapcastSetting.clientDacLatency_ms - = server_settings_message.latency; - snapcastSetting.buffer_ms - = server_settings_message.buffer_ms; - snapcastSetting.muted = server_settings_message.muted; - snapcastSetting.volume = server_settings_message.volume; + scSet.cDacLat_ms = server_settings_message.latency; + scSet.buffer_ms = server_settings_message.buffer_ms; + scSet.muted = server_settings_message.muted; + scSet.volume = server_settings_message.volume; - if (player_send_snapcast_setting (snapcastSetting) < 0) + if (player_send_snapcast_setting (&scSet) != pdPASS) { ESP_LOGE ( TAG, @@ -1053,7 +1044,7 @@ app_main (void) } ESP_ERROR_CHECK (ret); - esp_log_level_set ("*", ESP_LOG_INFO); + esp_log_level_set ("*", ESP_LOG_WARN); // esp_log_level_set("c_I2S", ESP_LOG_NONE); // esp_log_level_set ( "HEADPHONE", @@ -1076,11 +1067,7 @@ app_main (void) #endif ESP_LOGI (TAG, "init player"); - playerChunkQueueHandle = init_player (); - if (playerChunkQueueHandle == NULL) - { - return; - } + init_player (); // Enable and setup WIFI in station mode and connect to Access point setup in // menu config or set up provisioning mode settable in menuconfig diff --git a/sdkconfig b/sdkconfig index 523c65c..5da3827 100644 --- a/sdkconfig +++ b/sdkconfig @@ -285,7 +285,7 @@ CONFIG_ESP_DISPATCHER_DELEGATE_STACK_SIZE=4096 # # ESP32 audio buffer and I2S config # -CONFIG_USE_DSP_PROCESSOR=y +# CONFIG_USE_DSP_PROCESSOR is not set CONFIG_USE_BIQUAD_ASM=y # end of ESP32 audio buffer and I2S config @@ -321,8 +321,8 @@ CONFIG_SNAPCLIENT_NAME="esp-snapclient" # Compiler options # # CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set -CONFIG_COMPILER_OPTIMIZATION_SIZE=y -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y # CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set @@ -669,17 +669,17 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # # Wi-Fi # -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=2 +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=6 CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=12 # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=6 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=12 # CONFIG_ESP32_WIFI_CSI_ENABLED is not set CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=2 +CONFIG_ESP32_WIFI_TX_BA_WIN=6 CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=2 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 CONFIG_ESP32_WIFI_NVS_ENABLED=y CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y # CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set @@ -687,10 +687,10 @@ CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 # CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set # CONFIG_ESP32_WIFI_IRAM_OPT is not set -# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y # end of Wi-Fi # @@ -781,7 +781,7 @@ CONFIG_FMB_TIMER_INDEX=0 CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_HZ=1000 CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set @@ -874,7 +874,7 @@ CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=12 CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set @@ -898,13 +898,13 @@ CONFIG_LWIP_MAX_ACTIVE_TCP=3 CONFIG_LWIP_MAX_LISTENING_TCP=3 CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=6 -CONFIG_LWIP_TCP_MSS=1440 -CONFIG_LWIP_TCP_TMR_INTERVAL=100 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1460 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 CONFIG_LWIP_TCP_MSL=60000 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880 -CONFIG_LWIP_TCP_WND_DEFAULT=5760 -CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5840 +CONFIG_LWIP_TCP_WND_DEFAULT=5840 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=12 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y # CONFIG_LWIP_TCP_SACK_OUT is not set # CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set @@ -930,10 +930,10 @@ CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y # end of Checksums CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048 -CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x0 # CONFIG_LWIP_PPP_SUPPORT is not set CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 @@ -1344,7 +1344,7 @@ CONFIG_MONITOR_BAUD_115200B=y CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set -CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set @@ -1440,14 +1440,14 @@ CONFIG_TIMER_QUEUE_LENGTH=5 # CONFIG_USE_ONLY_LWIP_SELECT is not set CONFIG_ESP_GRATUITOUS_ARP=y CONFIG_GARP_TMR_INTERVAL=60 -CONFIG_TCPIP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_RECVMBOX_SIZE=12 CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=6 -CONFIG_TCP_MSS=1440 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1460 CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=2880 -CONFIG_TCP_WND_DEFAULT=5760 -CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_SND_BUF_DEFAULT=5840 +CONFIG_TCP_WND_DEFAULT=5840 +CONFIG_TCP_RECVMBOX_SIZE=12 CONFIG_TCP_QUEUE_OOSEQ=y # CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_TCP_OVERSIZE_MSS=y @@ -1455,10 +1455,10 @@ CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_DISABLE is not set CONFIG_UDP_RECVMBOX_SIZE=6 CONFIG_TCPIP_TASK_STACK_SIZE=2048 -CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_TCPIP_TASK_AFFINITY_CPU0=y # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_TCPIP_TASK_AFFINITY=0x0 # CONFIG_PPP_SUPPORT is not set CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 diff --git a/sdkconfig.old b/sdkconfig.old index 2d27ba7..1bb3be8 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -285,8 +285,7 @@ CONFIG_ESP_DISPATCHER_DELEGATE_STACK_SIZE=4096 # # ESP32 audio buffer and I2S config # -CONFIG_USE_PSRAM=y -CONFIG_USE_DSP_PROCESSOR=y +# CONFIG_USE_DSP_PROCESSOR is not set CONFIG_USE_BIQUAD_ASM=y # end of ESP32 audio buffer and I2S config @@ -322,8 +321,8 @@ CONFIG_SNAPCLIENT_NAME="esp-snapclient" # Compiler options # # CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set -CONFIG_COMPILER_OPTIMIZATION_SIZE=y -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y # CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set @@ -473,7 +472,6 @@ CONFIG_ESP_TLS_USING_MBEDTLS=y # # ESP32-specific # -CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y CONFIG_ESP32_REV_MIN_0=y # CONFIG_ESP32_REV_MIN_1 is not set # CONFIG_ESP32_REV_MIN_2 is not set @@ -484,68 +482,7 @@ CONFIG_ESP32_DPORT_WORKAROUND=y # CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 -CONFIG_ESP32_SPIRAM_SUPPORT=y - -# -# SPI RAM config -# -CONFIG_SPIRAM_TYPE_AUTO=y -# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set -CONFIG_SPIRAM_SIZE=-1 -# CONFIG_SPIRAM_SPEED_40M is not set -CONFIG_SPIRAM_SPEED_80M=y -CONFIG_SPIRAM=y -CONFIG_SPIRAM_BOOT_INIT=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set -# CONFIG_SPIRAM_USE_MEMMAP is not set -CONFIG_SPIRAM_USE_CAPS_ALLOC=y -# CONFIG_SPIRAM_USE_MALLOC is not set -CONFIG_SPIRAM_MEMTEST=y -# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set -# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set -CONFIG_SPIRAM_CACHE_WORKAROUND=y - -# -# SPIRAM cache workaround debugging -# -CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW=y -# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST is not set -# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS is not set -# end of SPIRAM cache workaround debugging - -CONFIG_SPIRAM_BANKSWITCH_ENABLE=y -CONFIG_SPIRAM_BANKSWITCH_RESERVE=8 -# CONFIG_SPIRAM_OCCUPY_HSPI_HOST is not set -CONFIG_SPIRAM_OCCUPY_VSPI_HOST=y -# CONFIG_SPIRAM_OCCUPY_NO_HOST is not set - -# -# PSRAM clock and cs IO for ESP32-DOWD -# -CONFIG_D0WD_PSRAM_CLK_IO=17 -CONFIG_D0WD_PSRAM_CS_IO=16 -# end of PSRAM clock and cs IO for ESP32-DOWD - -# -# PSRAM clock and cs IO for ESP32-D2WD -# -CONFIG_D2WD_PSRAM_CLK_IO=9 -CONFIG_D2WD_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-D2WD - -# -# PSRAM clock and cs IO for ESP32-PICO -# -CONFIG_PICO_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-PICO - -# CONFIG_SPIRAM_CUSTOM_SPIWP_SD3_PIN is not set -CONFIG_SPIRAM_SPIWP_SD3_PIN=7 -# CONFIG_SPIRAM_2T_MODE is not set -# end of SPI RAM config - +# CONFIG_ESP32_SPIRAM_SUPPORT is not set # CONFIG_ESP32_TRAX is not set CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set @@ -710,6 +647,7 @@ CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PD_FLASH=y # # Memory protection @@ -731,30 +669,28 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # # Wi-Fi # -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=18 # CONFIG_ESP32_WIFI_CSI_ENABLED is not set CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=4 +CONFIG_ESP32_WIFI_TX_BA_WIN=6 CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=4 -# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_RX_BA_WIN=6 CONFIG_ESP32_WIFI_NVS_ENABLED=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 # CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set # CONFIG_ESP32_WIFI_IRAM_OPT is not set -# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y # end of Wi-Fi # @@ -806,7 +742,6 @@ CONFIG_FATFS_LFN_NONE=y CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y -CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y # CONFIG_FATFS_USE_FASTSEEK is not set # end of FAT Filesystem support @@ -939,7 +874,7 @@ CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set @@ -963,12 +898,12 @@ CONFIG_LWIP_MAX_ACTIVE_TCP=3 CONFIG_LWIP_MAX_LISTENING_TCP=3 CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=6 -CONFIG_LWIP_TCP_MSS=1440 -CONFIG_LWIP_TCP_TMR_INTERVAL=100 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1460 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 CONFIG_LWIP_TCP_MSL=60000 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880 -CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5840 +CONFIG_LWIP_TCP_WND_DEFAULT=5840 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y # CONFIG_LWIP_TCP_SACK_OUT is not set @@ -995,10 +930,10 @@ CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y # end of Checksums CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048 -CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x0 # CONFIG_LWIP_PPP_SUPPORT is not set CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 @@ -1047,7 +982,6 @@ CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # mbedTLS # CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y -# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set # CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set # CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y @@ -1410,7 +1344,7 @@ CONFIG_MONITOR_BAUD_115200B=y CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set -CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set @@ -1429,8 +1363,7 @@ CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 CONFIG_ADC2_DISABLE_DAC=y -CONFIG_SPIRAM_SUPPORT=y -# CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is not set +# CONFIG_SPIRAM_SUPPORT is not set CONFIG_TRACEMEM_RESERVE_DRAM=0x0 # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y @@ -1507,13 +1440,13 @@ CONFIG_TIMER_QUEUE_LENGTH=5 # CONFIG_USE_ONLY_LWIP_SELECT is not set CONFIG_ESP_GRATUITOUS_ARP=y CONFIG_GARP_TMR_INTERVAL=60 -CONFIG_TCPIP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_RECVMBOX_SIZE=32 CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=6 -CONFIG_TCP_MSS=1440 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1460 CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=2880 -CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_SND_BUF_DEFAULT=5840 +CONFIG_TCP_WND_DEFAULT=5840 CONFIG_TCP_RECVMBOX_SIZE=6 CONFIG_TCP_QUEUE_OOSEQ=y # CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set @@ -1522,10 +1455,10 @@ CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_DISABLE is not set CONFIG_UDP_RECVMBOX_SIZE=6 CONFIG_TCPIP_TASK_STACK_SIZE=2048 -CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_TCPIP_TASK_AFFINITY_CPU0=y # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_TCPIP_TASK_AFFINITY=0x0 # CONFIG_PPP_SUPPORT is not set CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072