Update of /cvsroot/pure-data/externals/tb/volctl~
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25349
Modified Files:
volctl~.c
Log Message:
improvement for zero factor ... x * 0 = 0
Index: volctl~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/tb/volctl~/volctl~.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** volctl~.c 28 Dec 2004 15:48:19 -0000 1.2
--- volctl~.c 8 Jan 2005 22:13:53 -0000 1.3
***************
*** 40,45 ****
t_float x_h; //interpolation time
t_float x_value; //current factor
! int x_ticksleft; //ticks to go
t_float x_samples_per_ms; //ms per sample
t_float x_slope; //slope
--- 40,46 ----
t_float x_h; //interpolation time
t_float x_value; //current factor
+ t_float x_target; //target factor
! int x_ticksleft; //dsp ticks to go
t_float x_samples_per_ms; //ms per sample
t_float x_slope; //slope
***************
*** 47,51 ****
t_float x_slope_step;
int x_line;
!
} t_volctl;
--- 48,53 ----
t_float x_slope_step;
int x_line;
! int x_blocksize;
! t_float x_1overblocksize;
} t_volctl;
***************
*** 64,67 ****
--- 66,71 ----
x->x_samples_per_ms = 44100.f / 1000.f; // assume default samplerate
+ x->x_blocksize = 64;
+ x->x_1overblocksize = 1.f/64.f;
outlet_new(&x->x_obj, &s_signal);
***************
*** 78,83 ****
}
!
! t_int *volctl_perform(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
--- 82,86 ----
}
! static t_int *volctl_perform(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
***************
*** 86,123 ****
int n = (int)(w[4]);
- t_float f = x->x_value;
if (x->x_ticksleft)
{
t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
{
! x->x_ticksleft -=n;
! while (n--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! x->x_value = f;
}
}
else
while (n--) *out++ = *in++ * f;
return (w+5);
--- 89,111 ----
int n = (int)(w[4]);
if (x->x_ticksleft)
{
+ t_float f = x->x_value;
t_float x_slope = x->x_slope;
!
! x->x_ticksleft--;
! while (n--)
{
! f+=x_slope;
! *out++ = *in++ * f;
}
+ x->x_value = f;
}
else
+ {
+ t_float f = x->x_target;
while (n--) *out++ = *in++ * f;
+ }
return (w+5);
***************
*** 125,129 ****
! t_int *volctl_perf8(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
--- 113,117 ----
! static t_int *volctl_perf8(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
***************
*** 132,197 ****
int n = (int)(w[4]);
- t_float f = x->x_value;
-
if (x->x_ticksleft)
{
t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
{
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
{
! *out++ = *in++ * f;
}
- x->x_value = f;
- x->x_ticksleft = 0;
- }
else
! {
! x->x_ticksleft -= n;
! n = n>>3;
! while (n--)
{
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
}
! x->x_value = f;
! }
! }
! else
! {
! for (; n; n -= 8, in += 8, out += 8)
! {
! t_float f0 = in[0], f1 = in[1], f2 = in[2], f3 = in[3];
! t_float f4 = in[4], f5 = in[5], f6 = in[6], f7 = in[7];
!
! out[0] = f0 * f; out[1] = f1 * f; out[2] = f2 * f; out[3] = f3 * f;
! out[4] = f4 * f; out[5] = f5 * f; out[6] = f6 * f; out[7] = f7 * f;
! }
}
return (w+5);
}
! t_int *volctl_perf_simd(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
--- 120,176 ----
int n = (int)(w[4]);
if (x->x_ticksleft)
{
+ t_float f = x->x_value;
+
t_float x_slope = x->x_slope;
! x->x_ticksleft--;
! n = n>>3;
! while (n--)
{
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! }
! x->x_value = f;
! }
! else
! {
! t_float f = x->x_target;
!
! if (f)
! for (; n; n -= 8, in += 8, out += 8)
{
! t_float f0 = in[0], f1 = in[1], f2 = in[2], f3 = in[3];
! t_float f4 = in[4], f5 = in[5], f6 = in[6], f7 = in[7];
!
! out[0] = f0 * f; out[1] = f1 * f; out[2] = f2 * f; out[3] = f3 * f;
! out[4] = f4 * f; out[5] = f5 * f; out[6] = f6 * f; out[7] = f7 * f;
}
else
! for (; n; n -= 8, in += 8, out += 8)
{
! out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0;
! out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0;
}
!
}
return (w+5);
}
! static t_int *volctl_perf_simd(t_int *w)
{
t_volctl * x = (t_volctl *)(w[1]);
***************
*** 203,304 ****
int n = (int)(w[4]);
! t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! t_float f = x->x_value;
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -= n;
asm(
".set T_FLOAT,4 \n"
! "movss (%3),%%xmm0 \n" /* value */
"shufps $0, %%xmm0, %%xmm0 \n"
! "movaps (%4), %%xmm1 \n" /* x_slopes */
! "addps %%xmm0, %%xmm1 \n"
!
! "movss (%5), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n" /* x_slope_step */
!
! "shrl $4, %2 \n" /* n>>4 */
!
"1: \n"
! "movaps (%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, (%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
"movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
"movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 8*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 8*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 12*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 12*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n" /* one instr. obsolete */
!
"addl $16*T_FLOAT, %0 \n"
"addl $16*T_FLOAT, %1 \n"
"loop 1b \n"
-
:
! :"r"(in), "r"(out), "c"(n), "r"(&(t_float)(x->x_value)),
! "r"((t_float*)x->x_slopes), "r"(&(t_float)(x->x_slope_step))
! :"%xmm0", "%xmm1", "%xmm2");
! /* post("value %f", x->x_value); */
! x->x_value += n*(x->x_slope);
! }
! }
! else
! {
! asm(
! ".set T_FLOAT,4 \n"
! "movss (%3), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n"
! "shrl $4, %2 \n"
- "volctl_loop: \n"
- "movaps (%0), %%xmm1 \n"
- "mulps %%xmm0, %%xmm1 \n"
- "movaps %%xmm1, (%1) \n"
- "movaps 4*T_FLOAT(%0), %%xmm2 \n"
- "mulps %%xmm0, %%xmm2 \n"
- "movaps %%xmm2, 4*T_FLOAT(%1) \n"
- "movaps 8*T_FLOAT(%0), %%xmm3 \n"
- "mulps %%xmm0, %%xmm3 \n"
- "movaps %%xmm3, 8*T_FLOAT(%1) \n"
- "movaps 12*T_FLOAT(%0), %%xmm4 \n"
- "mulps %%xmm0, %%xmm4 \n"
- "movaps %%xmm4, 12*T_FLOAT(%1) \n"
- "addl $16*T_FLOAT, %0 \n"
- "addl $16*T_FLOAT, %1 \n"
- "loop volctl_loop \n"
- :
- : "r"(in), "r"(out),
- "c"(w[4]),"r"(&(t_float)(x->x_value))
- : "%xmm0", "%xmm1","%xmm2","%xmm3","%xmm4");
}
return (w+5);
--- 182,280 ----
int n = (int)(w[4]);
! x->x_ticksleft--;
!
! asm(
! ".set T_FLOAT,4 \n"
! "movss (%3),%%xmm0 \n" /* value */
! "shufps $0, %%xmm0, %%xmm0 \n"
! "movaps (%4), %%xmm1 \n" /* x_slopes */
! "addps %%xmm0, %%xmm1 \n"
! "movss (%5), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n" /* x_slope_step */
!
! "shrl $4, %2 \n" /* n>>4 */
!
! "1: \n"
! "movaps (%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, (%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 8*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 8*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 12*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 12*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n" /* one instr. obsolete */
!
! "addl $16*T_FLOAT, %0 \n"
! "addl $16*T_FLOAT, %1 \n"
! "loop 1b \n"
+ :
+ :"r"(in), "r"(out), "c"(n), "r"(&(t_float)(x->x_value)),
+ "r"((t_float*)x->x_slopes), "r"(&(t_float)(x->x_slope_step))
+ :"%xmm0", "%xmm1", "%xmm2");
+
+ x->x_value += n*(x->x_slope);
+ }
+ else
+ {
+ if(x->x_target)
asm(
".set T_FLOAT,4 \n"
!
! "movss (%3), %%xmm0 \n"
"shufps $0, %%xmm0, %%xmm0 \n"
! "shrl $4, %2 \n"
!
"1: \n"
! "movaps (%0), %%xmm1 \n"
! "mulps %%xmm0, %%xmm1 \n"
! "movaps %%xmm1, (%1) \n"
"movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm0, %%xmm2 \n"
"movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "movaps 8*T_FLOAT(%0), %%xmm3 \n"
! "mulps %%xmm0, %%xmm3 \n"
! "movaps %%xmm3, 8*T_FLOAT(%1) \n"
! "movaps 12*T_FLOAT(%0), %%xmm4 \n"
! "mulps %%xmm0, %%xmm4 \n"
! "movaps %%xmm4, 12*T_FLOAT(%1) \n"
"addl $16*T_FLOAT, %0 \n"
"addl $16*T_FLOAT, %1 \n"
"loop 1b \n"
:
! : "r"(in), "r"(out),
! "c"(w[4]),"r"(&(t_float)(x->x_target))
! : "%xmm0", "%xmm1","%xmm2","%xmm3","%xmm4");
! else
! asm(
! ".set T_FLOAT,4 \n"
! "xorps %%xmm0, %%xmm0 \n"
! "shrl $4, %1 \n"
! "1: \n"
! "movaps %%xmm0, (%0) \n"
! "movaps %%xmm0, 4*T_FLOAT(%0) \n"
! "movaps %%xmm0, 8*T_FLOAT(%0) \n"
! "movaps %%xmm0, 12*T_FLOAT(%0) \n"
! "addl $16*T_FLOAT, %0 \n"
! "loop 1b \n"
! :
! :"r"(out),
! "c"(w[4])
! : "%xmm0");
}
return (w+5);
***************
*** 306,316 ****
! void volctl_set(t_volctl *x, t_float f)
{
t_float slope;
int i;
!
! x->x_ticksleft = x->x_h * x->x_samples_per_ms;
! slope = (f - x->x_value) / x->x_ticksleft;
x->x_slope = slope;
--- 282,294 ----
! static void volctl_set(t_volctl *x, t_float f)
{
t_float slope;
int i;
! int samplesleft = x->x_h * x->x_samples_per_ms;
! samplesleft += x->x_blocksize - ( samplesleft & (x->x_blocksize - 1));
! x->x_ticksleft = (int) (t_float)samplesleft * x->x_1overblocksize;
!
! slope = (f - x->x_value) / samplesleft;
x->x_slope = slope;
***************
*** 320,326 ****
}
x->x_slope_step = 4*slope;
}
! void volctl_dsp(t_volctl *x, t_signal **sp)
{
const int n = sp[0]->s_n;
--- 298,306 ----
}
x->x_slope_step = 4*slope;
+
+ x->x_target = f;
}
! static void volctl_dsp(t_volctl *x, t_signal **sp)
{
const int n = sp[0]->s_n;
***************
*** 334,338 ****
dsp_add(volctl_perf8, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
}
! x->x_samples_per_ms = sp[0]->s_sr / 1000.f;
}
--- 314,321 ----
dsp_add(volctl_perf8, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
}
!
! x->x_blocksize = n;
! x->x_1overblocksize = 1./n;
! x->x_samples_per_ms = sp[0]->s_sr / 1000.f;
}