diff --git a/components/lightsnapcast/include/player.h b/components/lightsnapcast/include/player.h index 8ac2648..84eac1b 100644 --- a/components/lightsnapcast/include/player.h +++ b/components/lightsnapcast/include/player.h @@ -13,7 +13,7 @@ // size?! #define CHNK_CTRL_CNT 2 -#define LATENCY_MEDIAN_FILTER_LEN 199 // 299 //499 // 199 // 29 // 99 +#define LATENCY_MEDIAN_FILTER_LEN 199 // set to 0 if you do not wish to be the median an average around actual // median average will be (LATENCY_MEDIAN_FILTER_LEN / @@ -22,8 +22,8 @@ // reality n+1 samples will be averaged #define LATENCY_MEDIAN_AVG_DIVISOR 0 -#define SHORT_BUFFER_LEN 199 // 99 -#define MINI_BUFFER_LEN 39 // 19 +#define SHORT_BUFFER_LEN 99 +#define MINI_BUFFER_LEN 19 typedef struct pcm_chunk_fragment pcm_chunk_fragment_t; struct pcm_chunk_fragment { diff --git a/components/lightsnapcast/player.c b/components/lightsnapcast/player.c index 2dbd052..5d77c67 100644 --- a/components/lightsnapcast/player.c +++ b/components/lightsnapcast/player.c @@ -29,7 +29,7 @@ #include -#define SYNC_TASK_PRIORITY (configMAX_PRIORITIES - 1) +#define SYNC_TASK_PRIORITY (configMAX_PRIORITIES - 2) #define SYNC_TASK_CORE_ID 1 // tskNO_AFFINITY static const char *TAG = "PLAYER"; @@ -1305,8 +1305,8 @@ static void player_task(void *pvParameters) { const bool enableControlLoop = true; - const int64_t shortOffset = 8; // 20; //µs, softsync - const int64_t miniOffset = 1; //µs, softsync + const int64_t shortOffset = 2; // 8; // 20; //µs, softsync + const int64_t miniOffset = 1; //µs, softsync const int64_t hardResyncThreshold = 10000; //µs, hard sync if (initialSync == 1) { @@ -1386,9 +1386,18 @@ static void player_task(void *pvParameters) { usec = usec % 1000; // ESP_LOGI (TAG, "%d, %lldus, %lldus %llds, %lld.%lldms", dir, age, // avg, sec, msec, usec); - // ESP_LOGI(TAG, "%d, %lldus, %lldus, %lldus", dir, avg, - // shortMedian, - // miniMedian); + // ESP_LOGI(TAG, "%d, %lldus, %lldus, %lldus, q:%d", dir, avg, + // shortMedian, miniMedian, uxQueueMessagesWaiting(pcmChkQHdl)); + // ESP_LOGI( TAG, "8b f %d b %d", + // heap_caps_get_free_size(MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL), + // heap_caps_get_largest_free_block + // (MALLOC_CAP_8BIT | + // MALLOC_CAP_INTERNAL)); + // ESP_LOGI( TAG, "32b f %d b %d", + // heap_caps_get_free_size(MALLOC_CAP_32BIT | MALLOC_CAP_EXEC), + // heap_caps_get_largest_free_block + // (MALLOC_CAP_32BIT | + // MALLOC_CAP_EXEC)); } dir = 0; diff --git a/main/main.c b/main/main.c index d1354e4..cdb3b46 100644 --- a/main/main.c +++ b/main/main.c @@ -75,14 +75,14 @@ SemaphoreHandle_t decoderWriteSemaphore = NULL; const char *VERSION_STRING = "0.0.2"; -#define HTTP_TASK_PRIORITY (configMAX_PRIORITIES - 2) // 9 +#define HTTP_TASK_PRIORITY (configMAX_PRIORITIES - 1) // 9 #define HTTP_TASK_CORE_ID 1 // 1 // tskNO_AFFINITY #define OTA_TASK_PRIORITY 6 #define OTA_TASK_CORE_ID tskNO_AFFINITY // 1 // tskNO_AFFINITY -#define FLAC_DECODER_TASK_PRIORITY 7 -#define FLAC_DECODER_TASK_CORE_ID tskNO_AFFINITY // 1 // tskNO_AFFINITY +#define FLAC_DECODER_TASK_PRIORITY HTTP_TASK_PRIORITY +#define FLAC_DECODER_TASK_CORE_ID HTTP_TASK_CORE_ID // 1 // tskNO_AFFINITY #define FLAC_TASK_PRIORITY 7 #define FLAC_TASK_CORE_ID tskNO_AFFINITY // 1 // tskNO_AFFINITY @@ -153,9 +153,8 @@ void time_sync_msg_cb(void *args) { base_message_t base_message_tx; // struct timeval now; int64_t now; - int result; - time_message_t time_message_tx = {{0, 0}}; - int rc1 = ERR_OK; + // time_message_t time_message_tx = {{0, 0}}; + int rc1; // causes kernel panic, which shouldn't happen though? // Isn't it called from timer task instead of ISR? @@ -169,57 +168,45 @@ void time_sync_msg_cb(void *args) { // // return; // } - now = esp_timer_get_time(); + + uint8_t *p_pkt = (uint8_t *)malloc(BASE_MESSAGE_SIZE + TIME_MESSAGE_SIZE); + if (p_pkt == NULL) { + ESP_LOGW( + TAG, + "%s: Failed to get memory for time sync message. Skipping this round.", + __func__); + + return; + } + + memset(p_pkt, 0, BASE_MESSAGE_SIZE + TIME_MESSAGE_SIZE); base_message_tx.type = SNAPCAST_MESSAGE_TIME; base_message_tx.id = id_counter++; base_message_tx.refersTo = 0; base_message_tx.received.sec = 0; base_message_tx.received.usec = 0; - // base_message_tx.sent.sec = now.tv_sec; - // base_message_tx.sent.usec = now.tv_usec; + now = esp_timer_get_time(); base_message_tx.sent.sec = now / 1000000; base_message_tx.sent.usec = now - base_message_tx.sent.sec * 1000000; base_message_tx.size = TIME_MESSAGE_SIZE; - - result = base_message_serialize(&base_message_tx, base_message_serialized, - BASE_MESSAGE_SIZE); - if (result) { + rc1 = base_message_serialize(&base_message_tx, (char *)&p_pkt[0], + BASE_MESSAGE_SIZE); + if (rc1) { ESP_LOGE(TAG, "Failed to serialize base message for time"); return; } - memset(&time_message_tx, 0, sizeof(time_message_tx)); - - result = time_message_serialize(&time_message_tx, time_message_serialized, - TIME_MESSAGE_SIZE); - if (result) { - ESP_LOGI(TAG, "Failed to serialize time message"); - - return; - } - -#if 0 - rc1 = netconn_write(lwipNetconn, base_message_serialized, BASE_MESSAGE_SIZE, - NETCONN_NOCOPY); - if (rc1 != ERR_OK) { - ESP_LOGW(TAG, "error writing timesync base msg"); - - return; - } - - rc1 = netconn_write(lwipNetconn, time_message_serialized, TIME_MESSAGE_SIZE, - NETCONN_NOCOPY); - if (rc1 != ERR_OK) { - ESP_LOGW(TAG, "error writing timesync msg"); - - return; - } -#else - uint8_t *p_pkt = (uint8_t *)malloc(BASE_MESSAGE_SIZE + TIME_MESSAGE_SIZE); - memcpy(&p_pkt[0], base_message_serialized, BASE_MESSAGE_SIZE); - memcpy(&p_pkt[BASE_MESSAGE_SIZE], time_message_serialized, TIME_MESSAGE_SIZE); + // memset(&time_message_tx, 0, sizeof(time_message_tx)); + // result = time_message_serialize(&time_message_tx, + // &p_pkt[BASE_MESSAGE_SIZE], + // TIME_MESSAGE_SIZE); + // if (result) { + // ESP_LOGI(TAG, "Failed to serialize time message"); + // + // return; + // } rc1 = netconn_write(lwipNetconn, p_pkt, BASE_MESSAGE_SIZE + TIME_MESSAGE_SIZE, NETCONN_NOCOPY); @@ -228,8 +215,8 @@ void time_sync_msg_cb(void *args) { return; } + free(p_pkt); -#endif // ESP_LOGI(TAG, "%s: sent time sync message", __func__); @@ -2349,8 +2336,7 @@ static void http_get_task(void *pvParameters) { player_latency_insert(tmpDiffToServer); - // ESP_LOGI(TAG, "Current latency: %lld", - // tmpDiffToServer); + ESP_LOGI(TAG, "Current latency:%lld:", tmpDiffToServer); // store current time lastTimeSync = now; diff --git a/sdkconfig b/sdkconfig index 5a58275..28a5334 100644 --- a/sdkconfig +++ b/sdkconfig @@ -523,10 +523,10 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64 -# 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=32 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=8 # CONFIG_ESP32_WIFI_CSI_ENABLED is not set CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y CONFIG_ESP32_WIFI_TX_BA_WIN=32 diff --git a/sdkconfig.old b/sdkconfig.old index 7e12f40..5a58275 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -522,7 +522,7 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # Wi-Fi # CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=0 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64 # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 @@ -530,7 +530,8 @@ CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 # CONFIG_ESP32_WIFI_CSI_ENABLED is not set CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y CONFIG_ESP32_WIFI_TX_BA_WIN=32 -# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=16 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