[PD-cvs] externals/tb/volctl~ volctl~.c,1.2,1.3

Tim Blechmann timblech at users.sourceforge.net
Sat Jan 8 23:13:56 CET 2005


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;
  }
  





More information about the Pd-cvs mailing list