- increase block time while allocating memory for decoded chunks

o wait max. 200ms and try to allocate memory every 1 ms
- set sync task to max priority and http task to (max priority - 1)
- mute audio if a hard resync happens to prevent clicks and other audible distortions
- reduce LWIP buffer sizes

Signed-off-by: Karl Osterseher <karli_o@gmx.at>
This commit is contained in:
Karl Osterseher
2023-01-03 19:12:41 +01:00
Unverified
parent d9c19e744e
commit 0c98a99a73
4 changed files with 64 additions and 44 deletions

View File

@@ -29,7 +29,7 @@
#include <math.h>
#define SYNC_TASK_PRIORITY (configMAX_PRIORITIES - 2)
#define SYNC_TASK_PRIORITY (configMAX_PRIORITIES - 1)
#define SYNC_TASK_CORE_ID 1 // tskNO_AFFINITY
static const char *TAG = "PLAYER";
@@ -77,6 +77,8 @@ static void tg0_timer_init(void);
static void tg0_timer_deinit(void);
static void player_task(void *pvParameters);
extern esp_err_t audio_set_mute(bool mute);
/*
#define CONFIG_MASTER_I2S_BCK_PIN 5
#define CONFIG_MASTER_I2S_LRCK_PIN 25
@@ -879,11 +881,11 @@ int32_t allocate_pcm_chunk_memory(pcm_chunk_message_t **pcmChunk,
#elif CONFIG_SPIRAM
ret = allocate_pcm_chunk_memory_caps(*pcmChunk, bytes, 0);
#else
// if allocation fails we try again x times after waiting for chunks to finish
// playback
// TODO: find a sane value for i, 4 seems to work well to prevent allocation
// errors
for (int i = 0; i < 4; i++) {
// TODO: x should probably be dynamically calculated as a fraction of buffer
// size if allocation fails we try again every 1ms for max. x ms waiting for
// chunks to finish playback
uint32_t x = 200;
for (int i = 0; i < x; i++) {
ret = allocate_pcm_chunk_memory_caps(*pcmChunk, bytes,
MALLOC_CAP_32BIT | MALLOC_CAP_EXEC);
if (ret < 0) {
@@ -900,8 +902,7 @@ int32_t allocate_pcm_chunk_memory(pcm_chunk_message_t **pcmChunk,
}
if (ret < 0) {
// TODO: insert actual chunk duration here
vTaskDelay(pdMS_TO_TICKS(26));
vTaskDelay(pdMS_TO_TICKS(1));
} else {
break;
}
@@ -1015,6 +1016,8 @@ static void player_task(void *pvParameters) {
initialSync = 0;
audio_set_mute(true);
while (1) {
// ESP_LOGW( TAG, "32b f %d b %d", heap_caps_get_free_size
//(MALLOC_CAP_8BIT), heap_caps_get_largest_free_block (MALLOC_CAP_8BIT));
@@ -1058,7 +1061,10 @@ static void player_task(void *pvParameters) {
adjust_apll(0);
i2s_custom_set_clk(I2S_NUM_0, __scSet.sr, __scSet.bits, __scSet.ch);
initialSync = 0;
audio_set_mute(true);
}
if ((__scSet.buf_ms != scSet.buf_ms) ||
@@ -1257,6 +1263,10 @@ static void player_task(void *pvParameters) {
initialSync = 1;
// TODO: use a timer to un-mute non blocking
vTaskDelay(pdMS_TO_TICKS(2));
audio_set_mute(scSet.muted);
ESP_LOGI(TAG, "initial sync age: %lldus, chunk duration: %lldus", age,
chkDur_us);
@@ -1298,6 +1308,8 @@ static void player_task(void *pvParameters) {
initialSync = 0;
audio_set_mute(true);
i2s_custom_stop(I2S_NUM_0);
continue;
@@ -1357,6 +1369,8 @@ static void player_task(void *pvParameters) {
initialSync = 0;
audio_set_mute(true);
continue;
}
@@ -1384,20 +1398,22 @@ static void player_task(void *pvParameters) {
usec = diff2Server - sec * 1000000;
msec = usec / 1000;
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, 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));
// ESP_LOGI (TAG, "%d, %lldus, %lldus %llds, %lld.%lldms",
// dir, age, avg, sec, msec, usec); 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;
@@ -1475,6 +1491,8 @@ static void player_task(void *pvParameters) {
initialSync = 0;
audio_set_mute(true);
i2s_custom_stop(I2S_NUM_0);
}
}

View File

@@ -75,7 +75,7 @@ SemaphoreHandle_t decoderWriteSemaphore = NULL;
const char *VERSION_STRING = "0.0.2";
#define HTTP_TASK_PRIORITY (configMAX_PRIORITIES - 1) // 9
#define HTTP_TASK_PRIORITY (configMAX_PRIORITIES - 2) // 9
#define HTTP_TASK_CORE_ID 1 // 1 // tskNO_AFFINITY
#define OTA_TASK_PRIORITY 6
@@ -628,6 +628,13 @@ void flac_task(void *pvParameters) {
}
}
/**
*
*/
esp_err_t audio_set_mute(bool mute) {
return audio_hal_set_mute(board_handle->audio_hal, mute);
}
/**
*
*/

View File

@@ -529,7 +529,7 @@ 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
CONFIG_ESP32_WIFI_TX_BA_WIN=8
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP32_WIFI_RX_BA_WIN=16
CONFIG_ESP32_WIFI_NVS_ENABLED=y
@@ -761,9 +761,9 @@ 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=65534
CONFIG_LWIP_TCP_WND_DEFAULT=65534
CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=11680
CONFIG_LWIP_TCP_WND_DEFAULT=11680
CONFIG_LWIP_TCP_RECVMBOX_SIZE=10
CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
CONFIG_LWIP_TCP_SACK_OUT=y
# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
@@ -1310,9 +1310,9 @@ CONFIG_TCP_MAXRTX=12
CONFIG_TCP_SYNMAXRTX=12
CONFIG_TCP_MSS=1460
CONFIG_TCP_MSL=60000
CONFIG_TCP_SND_BUF_DEFAULT=65534
CONFIG_TCP_WND_DEFAULT=65534
CONFIG_TCP_RECVMBOX_SIZE=6
CONFIG_TCP_SND_BUF_DEFAULT=11680
CONFIG_TCP_WND_DEFAULT=11680
CONFIG_TCP_RECVMBOX_SIZE=10
CONFIG_TCP_QUEUE_OOSEQ=y
# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
CONFIG_TCP_OVERSIZE_MSS=y

View File

@@ -143,12 +143,7 @@ CONFIG_ESP_LYRAT_V4_3_BOARD=y
#
# ESP32 DSP processor 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=y
# CONFIG_USE_DSP_PROCESSOR is not set
# end of ESP32 DSP processor config
#
@@ -534,7 +529,7 @@ 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
CONFIG_ESP32_WIFI_TX_BA_WIN=8
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP32_WIFI_RX_BA_WIN=16
CONFIG_ESP32_WIFI_NVS_ENABLED=y
@@ -549,7 +544,7 @@ CONFIG_WIFI_LOG_DEFAULT_LEVEL_INFO=y
# CONFIG_WIFI_LOG_DEFAULT_LEVEL_DEBUG is not set
# CONFIG_WIFI_LOG_DEFAULT_LEVEL_VERBOSE 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
@@ -766,9 +761,9 @@ 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=65534
CONFIG_LWIP_TCP_WND_DEFAULT=65534
CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=11680
CONFIG_LWIP_TCP_WND_DEFAULT=11680
CONFIG_LWIP_TCP_RECVMBOX_SIZE=10
CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
CONFIG_LWIP_TCP_SACK_OUT=y
# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
@@ -1315,9 +1310,9 @@ CONFIG_TCP_MAXRTX=12
CONFIG_TCP_SYNMAXRTX=12
CONFIG_TCP_MSS=1460
CONFIG_TCP_MSL=60000
CONFIG_TCP_SND_BUF_DEFAULT=65534
CONFIG_TCP_WND_DEFAULT=65534
CONFIG_TCP_RECVMBOX_SIZE=6
CONFIG_TCP_SND_BUF_DEFAULT=11680
CONFIG_TCP_WND_DEFAULT=11680
CONFIG_TCP_RECVMBOX_SIZE=10
CONFIG_TCP_QUEUE_OOSEQ=y
# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
CONFIG_TCP_OVERSIZE_MSS=y