- remove bug in i2s driver resulting in overwriting DMA descriptor while initialization leading to wrong initial sync

- change some function return values from int8_t to int32_t
- improve syncing
  o try to mimic original algorithm used by badaix
- latency_buffer_full() call in player sporadically returns negative value
  which led to a unnecessary vTaskDelay --> resolved
- use esp_timer_get_time() instead of gettimeofday() for timestamping
- enable IRAM optimazations for WIFI
- decrease WIFI RX buffers

Signed-off-by: Karl Osterseher <karli_o@gmx.at>
This commit is contained in:
Karl Osterseher
2022-10-21 19:30:51 +02:00
Unverified
parent 4a82967fec
commit 76a9b9acce
8 changed files with 525 additions and 450 deletions

View File

@@ -338,37 +338,35 @@ esp_err_t i2s_custom_init_dma_tx_queues(i2s_port_t i2s_num, uint8_t *data,
memcpy(buf, &data[offset], maxDmaBufBytes);
offset += maxDmaBufBytes;
// ESP_LOGW(I2S_TAG, "wrote %d",
// maxDmaBufBytes);
// ESP_LOGW(I2S_TAG, "wrote %d to desc[%d]", maxDmaBufBytes, i);
tmpSize -= maxDmaBufBytes;
} else {
memcpy(buf, &data[offset], tmpSize);
offset += tmpSize;
// ESP_LOGW(I2S_TAG, "wrote %d",
// tmpSize);
// ESP_LOGW(I2S_TAG, "wrote %d to desc[%d]", tmpSize, i);
tmpSize = 0;
}
if (tmpSize == 0) {
if (currentDescriptor) {
*currentDescriptor = i;
}
if (currentDescriptorOffset) {
if (offset == size) {
*currentDescriptorOffset = 0;
} else {
*currentDescriptorOffset = offset;
}
}
break;
}
}
if (currentDescriptor) {
*currentDescriptor = i + 1;
}
if (currentDescriptorOffset) {
if (offset == size) {
*currentDescriptorOffset = 0;
} else {
*currentDescriptorOffset = offset;
}
}
*written = offset;
}

View File

@@ -61,8 +61,8 @@ int64_t MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int64_t sample) {
}
if ((medianFilter->ageHead == medianFilter->medianHead) ||
(medianFilter->ageHead->value >
medianFilter->medianHead->value)) { // prepare for median correction
(medianFilter->ageHead->value > medianFilter->medianHead->value)) {
// prepare for median correction
medianFilter->medianHead = medianFilter->medianHead->prevValue;
}
@@ -111,10 +111,10 @@ int64_t MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int64_t sample) {
/**
*
*/
uint8_t MEDIANFILTER_isFull(sMedianFilter_t *medianFilter) {
if (medianFilter->bufferCnt < medianFilter->numNodes) {
return 0;
} else {
uint32_t MEDIANFILTER_isFull(sMedianFilter_t *medianFilter) {
if (medianFilter->bufferCnt >= medianFilter->numNodes) {
return 1;
} else {
return 0;
}
}

View File

@@ -36,7 +36,7 @@ typedef struct {
int MEDIANFILTER_Init(sMedianFilter_t *medianFilter);
int64_t MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int64_t sample);
uint8_t MEDIANFILTER_isFull(sMedianFilter_t *medianFilter);
uint32_t MEDIANFILTER_isFull(sMedianFilter_t *medianFilter);
#ifdef __cplusplus
}

View File

@@ -9,13 +9,14 @@
#define I2S_PORT I2S_NUM_0
#define CHNK_CTRL_CNT \
3 // TODO: maybe calculate this dynamically based on chunk duration and
// buffer size?!
// TODO: maybe calculate this dynamically based on chunk duration and buffer
// size?!
#define CHNK_CTRL_CNT 2
#define LATENCY_MEDIAN_FILTER_LEN 199 // 29 // 99
#define LATENCY_MEDIAN_FILTER_LEN 199 // 199 // 29 // 99
#define SHORT_BUFFER_LEN 9
#define SHORT_BUFFER_LEN 99
#define MINI_BUFFER_LEN 19
typedef struct pcm_chunk_fragment pcm_chunk_fragment_t;
struct pcm_chunk_fragment {
@@ -52,18 +53,18 @@ typedef struct snapcastSetting_s {
int init_player(void);
int deinit_player(void);
int8_t allocate_pcm_chunk_memory(pcm_chunk_message_t **pcmChunk, size_t bytes);
int8_t insert_pcm_chunk(pcm_chunk_message_t *pcmChunk);
int32_t allocate_pcm_chunk_memory(pcm_chunk_message_t **pcmChunk, size_t bytes);
int32_t insert_pcm_chunk(pcm_chunk_message_t *pcmChunk);
// 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_send_snapcast_setting(snapcastSetting_t *setting);
int32_t player_latency_insert(int64_t newValue);
int32_t player_send_snapcast_setting(snapcastSetting_t *setting);
int8_t reset_latency_buffer(void);
int8_t latency_buffer_full(void);
int8_t get_diff_to_server(int64_t *tDiff);
int8_t server_now(int64_t *sNow);
int32_t reset_latency_buffer(void);
int32_t latency_buffer_full(bool *is_full, TickType_t wait);
int32_t get_diff_to_server(int64_t *tDiff);
int32_t server_now(int64_t *sNow, int64_t *diff2Server);
#endif // __PLAYER_H__

File diff suppressed because it is too large Load Diff