#include #include #include #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; }