- add function to calculate average of n samples around median
- increase wifi rx buffer size - change wifi tx buffer to dynamic and increase allowed size Signed-off-by: Karl Osterseher <karli_o@gmx.at>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user