25#define ADPCM_LOOP_START 4
27#define ADPCM_LOOP_END 1
29#define PACKED __attribute__((packed))
33 unsigned shift: 4 PACKED;
34 unsigned predict: 4 PACKED;
43AdpcmSetup *AdpcmCreate(AdpcmGetPCMfunc get,
void *getpriv, AdpcmPutADPCMfunc put,
void *putpriv,
int loopstart)
51 set->s_1 = set->s_2 = 0.0;
52 set->ps_1 = set->ps_2 = 0.0;
59 set->loopstart = loopstart;
62 set->getpriv = getpriv;
65 set->putpriv = putpriv;
82 for (procblocks=0;procblocks<blocks;procblocks++)
87 for (
int j=0;j<28;j++)
90 ret = set->GetPCM(set->getpriv, samples, 28);
95 printf(
"loop end!\n");
96 adpcm.flags = ADPCM_LOOP_END;
99 if (set->loopstart>=0)
101 adpcm.flags |= ADPCM_LOOP;
102 if (set->curblock == set->loopstart)
104 printf(
"loop start!\n");
105 adpcm.flags |= ADPCM_LOOP_START;
110 find_predict(set, &adpcm, samples);
111 pack(set, &adpcm, samples);
113 if (set->PutADPCM(set->putpriv, &adpcm, 16)<0)
121 if (set->loopstart<0 && procblocks<blocks)
126 adpcm.flags = ADPCM_LOOP_START | ADPCM_LOOP | ADPCM_LOOP_END;
128 for (
int i=0;i<14;i++)
130 if (set->PutADPCM(set->putpriv, &adpcm, 16)<0)
135 if (procblocks<blocks && set->pad)
137 int padblocks = blocks-(set->curblock%blocks);
141 adpcm.flags = ADPCM_LOOP_START | ADPCM_LOOP | ADPCM_LOOP_END;
142 for (
int i=0;i<14;i++)
146 for (
int i=0;i<padblocks;i++)
148 if (set->PutADPCM(set->putpriv, &adpcm, 16)<0)
157static double f[5][2] =
160 { -60.0 / 64.0, 0.0},
161 { -115.0 / 64.0, 52.0 / 64.0},
162 { -98.0 / 64.0, 55.0 / 64.0},
163 { -122.0 / 64.0, 60.0 / 64.0}
165#define MAX(_a,_b) ((_a)>(_b) ? (_a):(_b))
166#define MIN(_a,_b) ((_a)<(_b) ? (_a):(_b))
167#define CLAMP(_v,_min,_max) MIN(MAX(_v,_min),_max);
171 double buffer[28][5];
177 double s_0, s_1, s_2;
179 for (
int i=0;i<5;i++)
185 for (
int j=0;j<28;j++)
187 s_0 = CLAMP(samples[j],-30720.0,30719.0);
189 ds = s_0 + s_1 * f[i][0] + s_2 * f[i][1];
191 if (fabs(ds) > max[i])
213 for (
int i=0;i<28;i++ )
214 samples[i] = buffer[i][adpcm->predict];
220 while(adpcm->shift < 12)
222 if (shift_mask & ( min2 + (shift_mask>>3) ))
225 shift_mask = shift_mask >> 1;
237 for (
int i=0;i<28;i++)
243 s_0 = samples[i] + s_1 * f[adpcm->predict][0] + s_2 * f[adpcm->predict][1];
244 ds = s_0 * (double) (1<<adpcm->shift);
246 di = ((int)ds+0x800) & 0xfffff000;
247 di = CLAMP(di,-32768,32767);
249 four_bit[i] = (short)di;
251 di = di >> adpcm->shift;
253 s_1 = (double) di - s_0;
256 for (
int i=0;i<14;i++)
257 adpcm->sample[i] = ( ( four_bit[(i*2)+1] >> 8 ) & 0xf0 ) | ( ( four_bit[i*2] >> 12 ) & 0xf );