static void final(const short *i1, const short *i2,
void *out, int *statbuf, int len)
{
- int x, sum, i;
- int buffer[10];
- short *ptr;
- short *ptr2;
+ int x, i;
unsigned short int work[50];
+ short *ptr = work;
memcpy(work, statbuf,20);
memcpy(work + 10, i2, len * 2);
- for(i=0; i<10; i++)
- buffer[9-i] = i1[i];
-
- ptr2 = (ptr = work) + len;
+ for (i=0; i<len; i++) {
+ int sum = 0;
- while (ptr < ptr2) {
- for(sum=0, x=0; x<=9; x++)
- sum += buffer[x] * (ptr[x]);
+ for(x=0; x<10; x++)
+ sum += i1[9-x] * ptr[x];
- sum = sum >> 12;
- x = ptr[10] - sum;
+ sum >>= 12;
- if (x<-32768 || x>32767) {
+ if (ptr[10] - sum < -32768 || ptr[10] - sum > 32767) {
memset(out, 0, len * 2);
memset(statbuf, 0, 20);
return;
}
- ptr[10] = x;
+ ptr[10] -= sum;
ptr++;
}
- memcpy(out, ptr+10 - len, len * 2);
- memcpy(statbuf, ptr, 20);
+
+ memcpy(out, work+10, len * 2);
+ memcpy(statbuf, work + 40, 20);
}
static unsigned int rms(const int *data, int f)