- 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
This commit is contained in:
Carlos
2021-08-29 21:16:52 +02:00
Unverified
parent 0ea47690fa
commit e2fc307451
5 changed files with 385 additions and 371 deletions

View File

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

View File

@@ -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, &currentSnapcastSetting);
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 (&currentSnapcastSetting, 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, &currentSnapcastSetting, 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 (&currentSnapcastSetting, &setting, sizeof (snapcastSetting_t));
ret = xQueueSend (snapcastSettingQueueHandle, &currentSnapcastSetting,
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;

View File

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

View File

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

View File

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