[PD] How to submit patches to to maxlib and other externals?

Ivica Ico Bukvic ico at vt.edu
Sun Sep 7 17:22:08 CEST 2014


I have a fix that allows average object to accept arbitrary amount of 
arguments to average against, rather than being hardwired to 128. Also, 
does checks against negative values passed into the right inlet...

So, where do I submit this?

-- 
Ivica Ico Bukvic, D.M.A.
Associate Professor
Computer Music
ICAT Senior Fellow
DISIS, L2Ork
Virginia Tech
School of Performing Arts - 0141
Blacksburg, VA 24061
(540) 231-6139
ico at vt.edu
www.performingarts.vt.edu
disis.music.vt.edu
l2ork.music.vt.edu

-------------- next part --------------
--- ../../../pd-extended/externals/maxlib/average.c	2013-10-27 15:48:21.866606276 -0400
+++ average.c	2014-09-07 11:20:51.069292145 -0400
@@ -24,10 +24,10 @@
 
 #include "m_pd.h"
 #include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
 
-#define MAX_ARG  128                /* maximum number of items to average */
-
-static char *version = "average v0.1, written by Olaf Matthes <olaf.matthes at gmx.de>";
+static char *version = "average v0.2, written by Olaf Matthes <olaf.matthes at gmx.de>, revised by Ivica Ico Bukvic <ico at vt.edu>";
  
 typedef struct average
 {
@@ -38,7 +38,7 @@
   t_outlet *x_outtendency;          /* outputs the tendency of the average */
   t_int    x_limit;                 /* indicates if input is 'blocked' (1) */
   t_int    x_index;                 /* the number of elements to average */
-  t_float  x_input[MAX_ARG];        /* stores the input values we need for averaging */
+  t_float  *x_input;        		/* stores the input values we need for averaging */
   t_int    x_inpointer;             /* actual position in above array */
   t_float  x_average;               /* what do you guess ? */
   t_float  x_lastaverage;
@@ -91,7 +91,7 @@
 				x->x_average = x->x_average / (float)normalise(x->x_index - 1);
 		} else post("average: internal error!");
 	}
-	if(++x->x_inpointer > x->x_index)
+	if(++x->x_inpointer >= x->x_index)
 	{
 		x->x_inpointer = 0;
 		if(x->x_lastaverage < x->x_average)
@@ -111,15 +111,35 @@
 
 static void average_index(t_average *x, t_floatarg f)
 {
-	x->x_index = (t_int)f;
-	if(x->x_index > MAX_ARG)x->x_index = MAX_ARG;
+	if ((t_int)f > 0 && (t_int)f != x->x_index)
+	{
+		int zero_out_new = 0;
+		int i = 0;
+
+		if ((t_int)f > x->x_index)
+			zero_out_new = x->x_index;
+		x->x_index = (t_int)f;		
+		x->x_input = (t_float *)realloc(x->x_input, x->x_index * sizeof(t_float));
+		if (zero_out_new)
+		{
+			for (i = zero_out_new; i < x->x_index; i++)
+				x->x_input[i] = 0;			
+		}
+		
+		/* DEBUG:
+		printf("%d %d: ", (int)x->x_index, zero_out_new);
+		for (i=0; i<x->x_index; i++)
+			printf("%g ", x->x_input[i]);
+		printf("\n");
+		*/
+	}
 }
 
 static void average_reset(t_average *x)
 {
 	int i;
-		/* zeroe out the array */
-	for(i = 0; i < MAX_ARG; i++)x->x_input[i] = 0.0;
+		/* zero out the array */
+	for(i = 0; i < x->x_index; i++)x->x_input[i] = 0.0;
 	x->x_inpointer = 0;
 	x->x_average = 0;
 	x->x_lastaverage = 0;
@@ -146,28 +166,24 @@
 
 static void average_free(t_average *x)
 {
-	/* nothing to do */
+	free(x->x_input);
 }
 
 static t_class *average_class;
 
 static void *average_new(t_floatarg f)
 {
-	int i;
-
-    t_average *x = (t_average *)pd_new(average_class);
+	t_average *x = (t_average *)pd_new(average_class);
 	x->x_inindex = inlet_new(&x->x_ob, &x->x_ob.ob_pd, gensym("float"), gensym("index"));
 	x->x_outfloat = outlet_new(&x->x_ob, gensym("float"));
 	x->x_outtendency = outlet_new(&x->x_ob, gensym("float"));
 
-		/* zeroe out the array */
-	for(i = 0; i < MAX_ARG; i++)x->x_input[i] = 0.0;
+		/* zero out the array */
 	x->x_index = (t_int)f;
-	if(x->x_index > MAX_ARG)
-	{
-		x->x_index = MAX_ARG;
-		post("average: set number of items to %d", x->x_index);
-	}
+	if (x->x_index < 1)
+		x->x_index = 1;
+	x->x_input = (t_float *)calloc(x->x_index,sizeof(t_float));
+
 	x->x_inpointer = 0;
 	x->x_average = 0;
 	x->x_mode = 0;


More information about the Pd-list mailing list