diff --git a/libs/resample/dtos.c b/libs/resample/dtos.c index c02d0ef157..7762595fae 100644 --- a/libs/resample/dtos.c +++ b/libs/resample/dtos.c @@ -95,6 +95,7 @@ void conv_double_short_ref(double *dest, short *src, int n) } #ifdef HAVE_CPU_PPC +#if 0 static union { int i[4]; float f[4]; } av_tmp __attribute__ ((__aligned__ (16))); void conv_double_short_altivec(double *dest, short *src, int n) @@ -123,6 +124,7 @@ void conv_double_short_altivec(double *dest, short *src, int n) } } #endif +#endif @@ -172,3 +174,28 @@ void conv_short_double_ppcasm(short *dest, double *src, int n) #endif +void conv_double_short_dstr(double *dest, short *src, int n, int dstr) +{ + int i; + void *d = dest; + for(i=0;i32767.0)x=32767.0; + *dest++ = rint(x); + s += sstr; + } +} + diff --git a/libs/resample/resample.c b/libs/resample/resample.c index 019858bb21..cedb874e2f 100644 --- a/libs/resample/resample.c +++ b/libs/resample/resample.c @@ -145,9 +145,8 @@ void resample_scale(resample_t * r, void *i_buf, unsigned int i_size) r->i_start, r->i_end, r->o_start); } - if ((r->filter_length + r->i_samples)*2*r->channels > r->buffer_len) { - //int size = taps * 2 * r->channels; - int size = (r->filter_length + r->i_samples) * sizeof(double) * r->channels; + if ((r->filter_length + r->i_samples)*2*2 > r->buffer_len) { + int size = (r->filter_length + r->i_samples) * sizeof(double) * 2; if(r->verbose){ printf("resample temp buffer size=%d\n",size); @@ -158,15 +157,21 @@ void resample_scale(resample_t * r, void *i_buf, unsigned int i_size) memset(r->buffer, 0, size); } - conv_double_short( - r->buffer + r->filter_length * sizeof(double) * r->channels, - r->i_buf, r->i_samples * r->channels); + if(r->channels==2){ + conv_double_short( + r->buffer + r->filter_length * sizeof(double) * 2, + r->i_buf, r->i_samples * 2); + }else{ + conv_double_short_dstr( + r->buffer + r->filter_length * sizeof(double) * 2, + r->i_buf, r->i_samples, sizeof(double) * 2); + } r->scale(r); memcpy(r->buffer, - r->buffer + r->i_samples * sizeof(double) * r->channels, - r->filter_length * sizeof(double) * r->channels); + r->buffer + r->i_samples * sizeof(double) * 2, + r->filter_length * sizeof(double) * 2); /* updating times */ r->i_start += r->i_samples * r->i_inc; @@ -516,8 +521,10 @@ static void resample_sinc_ft(resample_t * r) } } - conv_short_double(r->o_buf,out_tmp,2 * r->o_samples); - //o_ptr[0] = double_to_s16(c0); - //o_ptr[1] = double_to_s16(c1); + if(r->channels==2){ + conv_short_double(r->o_buf,out_tmp,2 * r->o_samples); + }else{ + conv_short_double_sstr(r->o_buf,out_tmp,r->o_samples,2 * sizeof(double)); + } } diff --git a/libs/resample/resample.h b/libs/resample/resample.h index 4c1b2a5297..1cc36eddc8 100644 --- a/libs/resample/resample.h +++ b/libs/resample/resample.h @@ -21,6 +21,8 @@ #ifndef __RESAMPLE_H__ #define __RESAMPLE_H__ +#include + typedef struct resample_s resample_t; struct resample_s { @@ -150,5 +152,8 @@ void conv_short_double_ppcasm(short *dest, double *src, int n); #define conv_short_double conv_short_double_ref #endif +void conv_double_short_dstr(double *dest, short *src, int n, int dstr); +void conv_short_double_sstr(short *dest, double *src, int n, int dstr); + #endif /* __RESAMPLE_H__ */ diff --git a/libs/resample/test.c b/libs/resample/test.c index b6f8d7b7b2..44d19a6517 100644 --- a/libs/resample/test.c +++ b/libs/resample/test.c @@ -30,12 +30,13 @@ void test_res3(void); void test_res4(void); void test_res5(void); void test_res6(void); +void test_res7(void); int main(int argc,char *argv[]) { out = fopen("out","w"); - test_res1(); + test_res7(); return 0; } @@ -278,3 +279,74 @@ void test_res6(void) } } +void test_res7(void) +{ + resample_t *r; + int i; + double sum10k,sum22k; + double f; + int n10k,n22k; + double x; + + for(i=0;ii_rate = I_RATE; + r->o_rate = O_RATE; + //r->method = RESAMPLE_SINC_SLOW; + r->method = RESAMPLE_SINC; + r->channels = 1; + //r->verbose = 1; + r->filter_length = 64; + r->get_buffer = get_buffer; + + resample_init(r); + + start_timer(); +#define blocked +#ifdef blocked + for(i=0;i+256