- double *inbuf_old = old;
- for(k = 0; 1; k++)
- {
- double time0;
- int joff;
-
- time0 = k * resample_ratio;
- j = (int)floor(time0 - itime);
-
-// if(j + filter_l / 2 >= input_size) break;
- if(j + filter_l / 2 >= in_len) break;
-
-/* blackman filter. by default, window centered at j+.5(filter_l%2) */
-/* but we want a window centered at time0. */
- offset = (time0 - itime - (j + .5 * (filter_l % 2)));
- joff = (int)floor((offset * 2 * BPC) + BPC + .5);
- xvalue = 0;
-
-
- for(i = 0; i <= filter_l; i++)
- {
- int j2 = i + j - filter_l / 2;
-//printf("j2=%d\n", j2);
- double y = ((j2 < 0) ? inbuf_old[BLACKSIZE + j2] : input[j2]);
-
- xvalue += y * blackfilt[joff][i];
- }
-
-
- if(output_allocation <= output_size)
- {
- double *new_output = 0;
- int64_t new_allocation = output_allocation ? (output_allocation * 2) : 16384;
- new_output = new double[new_allocation];
- if(output_temp)
- {
- bcopy(output_temp, new_output, output_allocation * sizeof(double));
- delete [] output_temp;
- }
-
- output_temp = new_output;
- output_allocation = new_allocation;
- }
-
+ double *old_data = old.get_data();
+ double ctr_pos = 0;
+ int otime = 0, last_used = 0;
+ while( output_size < output_allocation ) {
+ double in_pos = otime * resample_ratio;
+// window centered at ctr_pos
+ ctr_pos = in_pos + itime;
+ double pos = ctr_pos - filter_l2;
+ int ipos = floor(pos);
+ last_used = ipos + filter_l;
+ if( last_used >= in_len ) break;
+ double fraction = pos - ipos;
+ int phase = floor(fraction * 2*BPC + .5);
+ int i = ipos, j = filter_l; // fir filter
+ double xvalue = 0, *filt = blackfilt[phase];
+ for( ; j>=0 && i<0; ++i,--j ) xvalue += *filt++ * old_data[BLACKSIZE + i];
+ for( ; j>=0; ++i,--j ) xvalue += *filt++ * input[i];