- 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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user