qipp
2025-09-16 e7ac407a6aa40e94a34a772dee14e8d5fb55c45b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jitter.h"
#include "./drv/hmem.h"
/*
*/
struct tag_jitter_mem {
    int size;
    int elem_count;
    int w_offset;
    int r_offset;
    float dataf[4];
};
 
#define _UPPER_LIMIT 0.75
#define _LOWER_LIMIT 0.25
 
jitter_mem* jitter_create(int size)
{
    jitter_mem* pjitter = mymalloc(SRAM_AUTO, size+16);
    if (pjitter == NULL) return NULL;
 
    memset(pjitter, 0 ,sizeof(jitter_mem));
    pjitter->size = size;
    return pjitter;
}
 
int jitter_write(jitter_mem* pjitter, const float* data, int num)
{
    if (pjitter == NULL) return 0;
    memcpy(pjitter->dataf+ pjitter->w_offset, data, num);
    pjitter->w_offset += num;
    if (pjitter->w_offset >= pjitter->size) {
        pjitter->w_offset = 0;
    }
    pjitter->elem_count += num;
    return num;
}
 
int jitter_read(jitter_mem* pjitter,  float* data, int num)
{
    float percent = pjitter->elem_count*1.0 / pjitter->size;
    float pcm[128];
    int i, size =0;
    int flag = 0;
    int delta;
 
    if (pjitter == NULL) return 0;
 
    if (percent >= _UPPER_LIMIT) {
        //x2
        size = num * 2;
        flag = 1;
    }
    else if (percent <= _LOWER_LIMIT) {
        //1/2
        size = num / 2;
        flag = 2;
    }
    else {
        size = num ;
        flag = 0;
    }
 
    delta = pjitter->size - pjitter->r_offset;
    if (delta >= size) {
        memcpy(pcm, pjitter->dataf + pjitter->r_offset, size);
        pjitter->r_offset += size;
        if (pjitter->r_offset >= pjitter->size) {
            pjitter->r_offset = 0;
        }
    }
    else {
        memcpy(pcm, pjitter->dataf + pjitter->r_offset, delta);
        memcpy(pcm + delta, pjitter->dataf, size - delta);
        pjitter->r_offset = size - delta;
    }
    pjitter->elem_count -= size;
    if (flag == 1) {
        for (i = 0; i < size/2; i++) {//128
            data[i] = pcm[2*i];
        }
    }
    else if (flag == 2) {
        for (i = 0; i < size; i++) {//32
            data[2 * i] = pcm[i];
            data[2 * i+1] = pcm[i];
        }
    }
    else {
        memcpy(data, pcm, size);
    }
 
    return num;
}