diff --git a/components/libmedian/MedianFilter.c b/components/libmedian/MedianFilter.c index d934301..f432999 100644 --- a/components/libmedian/MedianFilter.c +++ b/components/libmedian/MedianFilter.c @@ -108,6 +108,41 @@ int64_t MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int64_t sample) { return medianFilter->medianHead->value; } +/** + * + */ +int64_t MEDIANFILTER_get_median(sMedianFilter_t *medianFilter, uint32_t n) { + int64_t avgMedian = 0; + sMedianNode_t *it; + int32_t i; + + if ((n % 2) == 0) { + it = medianFilter->medianHead + ->prevValue; // set iterator as value head previous + // first add previous values + for (i = 0; i < n / 2; i++) { + avgMedian += it->value; + it = medianFilter->medianHead->prevValue; + } + + it = + medianFilter->medianHead->nextValue; // set iterator as value head next + // second add next values + for (i = 0; i < n / 2; i++) { + avgMedian += it->value; + it = medianFilter->medianHead->nextValue; + } + } + + avgMedian += medianFilter->medianHead->value; + + if (n > 0) { + avgMedian /= (n + 1); + } + + return avgMedian; +} + /** * */ diff --git a/components/libmedian/include/MedianFilter.h b/components/libmedian/include/MedianFilter.h index 157a876..a610754 100644 --- a/components/libmedian/include/MedianFilter.h +++ b/components/libmedian/include/MedianFilter.h @@ -36,6 +36,7 @@ typedef struct { int MEDIANFILTER_Init(sMedianFilter_t *medianFilter); int64_t MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int64_t sample); +int64_t MEDIANFILTER_get_median(sMedianFilter_t *medianFilter, uint32_t n); uint32_t MEDIANFILTER_isFull(sMedianFilter_t *medianFilter); #ifdef __cplusplus diff --git a/components/lightsnapcast/include/player.h b/components/lightsnapcast/include/player.h index 25fbf02..c8b25c5 100644 --- a/components/lightsnapcast/include/player.h +++ b/components/lightsnapcast/include/player.h @@ -14,9 +14,15 @@ #define CHNK_CTRL_CNT 2 #define LATENCY_MEDIAN_FILTER_LEN 199 // 299 //499 // 199 // 29 // 99 +#define LATENCY_MEDIAN_AVG_DIVISOR \ + 0 // set to 0 if you do not wish to be the median an average around actual + // median average will be (LATENCY_MEDIAN_FILTER_LEN / + // LATENCY_MEDIAN_AVG_DIVISOR) + 1 samples around median. e.g. if n=4 then + // 2 samples above and below will be added plus the actual median. So in + // reality n+1 samples will be averaged -#define SHORT_BUFFER_LEN 99 -#define MINI_BUFFER_LEN 19 +#define SHORT_BUFFER_LEN 199 // 99 +#define MINI_BUFFER_LEN 39 // 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 a655d56..90fe7b9 100644 --- a/components/lightsnapcast/player.c +++ b/components/lightsnapcast/player.c @@ -326,6 +326,9 @@ int8_t player_get_snapcast_settings(snapcastSetting_t *setting) { return ret; } +/** + * + */ int32_t player_latency_insert(int64_t newValue) { int64_t medianValue; @@ -340,6 +343,15 @@ int32_t player_latency_insert(int64_t newValue) { // ESP_LOGI(TAG, "(not full) latency median: %lldus", medianValue); // } +#if LATENCY_MEDIAN_AVG_DIVISOR + // ESP_LOGI(TAG, "actual latency median: %lldus", medianValue); + // medianValue = MEDIANFILTER_get_median(&latencyMedianFilter, + // ceil((float)LATENCY_MEDIAN_FILTER_LEN / + // (float)LATENCY_MEDIAN_AVG_DIVISOR)); + medianValue = MEDIANFILTER_get_median(&latencyMedianFilter, 32); +// ESP_LOGI(TAG, "avg latency median: %lldus", medianValue); +#endif + latencyToServer = medianValue; xSemaphoreGive(latencyBufSemaphoreHandle); @@ -1293,9 +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; // shortOffset / 2; // 50; //µs, softsync + const int64_t shortOffset = 8; // 20; //µs, softsync + const int64_t miniOffset = 1; //µs, softsync const int64_t hardResyncThreshold = 10000; //µs, hard sync if (initialSync == 1) { @@ -1375,8 +1386,8 @@ 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", dir, avg, shortMedian, + miniMedian); } dir = 0; diff --git a/main/main.c b/main/main.c index b30043f..fb63f05 100644 --- a/main/main.c +++ b/main/main.c @@ -92,6 +92,9 @@ xTaskHandle t_http_get_task = NULL; xTaskHandle t_flac_decoder_task = NULL; xTaskHandle t_flac_task = NULL; +#define FAST_SYNC_LATENCY_BUF 10000 // in µs +#define NORMAL_SYNC_LATENCY_BUF 1000000 // in µs + struct timeval tdif, tavg; static audio_board_handle_t board_handle = NULL; @@ -527,9 +530,6 @@ void flac_task(void *pvParameters) { } } -#define FAST_SYNC_LATENCY_BUF 10000 // in µs -#define NORMAL_SYNC_LATENCY_BUF 1000000 // in µs - /** * */ diff --git a/sdkconfig b/sdkconfig index 4f92049..5a58275 100644 --- a/sdkconfig +++ b/sdkconfig @@ -522,11 +522,11 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # Wi-Fi # CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=16 -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=16 +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_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 ab558f5..7e12f40 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -143,12 +143,7 @@ CONFIG_ESP_LYRAT_V4_3_BOARD=y # # ESP32 audio buffer and I2S config # -CONFIG_USE_DSP_PROCESSOR=y -CONFIG_SNAPCLIENT_DSP_FLOW_STEREO=y -# CONFIG_SNAPCLIENT_DSP_FLOW_BASSBOOST is not set -# CONFIG_SNAPCLIENT_DSP_FLOW_BIAMP is not set -CONFIG_USE_BIQUAD_ASM=y -# CONFIG_SNAPCLIENT_USE_SOFT_VOL is not set +# CONFIG_USE_DSP_PROCESSOR is not set # end of ESP32 audio buffer and I2S config # @@ -328,7 +323,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 @@ -339,69 +333,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 is not set -CONFIG_SPIRAM_USE_MALLOC=y -CONFIG_SPIRAM_MEMTEST=y -CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384 -# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set -CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 -# 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_ALLOW_STACK_EXTERNAL_MEMORY is not set -# 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_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 @@ -567,6 +499,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 @@ -589,17 +522,15 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # Wi-Fi # CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=16 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 -CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=0 +# 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_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=y -CONFIG_ESP32_WIFI_RX_BA_WIN=16 -# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set 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 @@ -667,7 +598,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 @@ -911,7 +841,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 @@ -1298,8 +1227,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