aboutsummaryrefslogtreecommitdiff
path: root/src/mtx_pack~.c
diff options
context:
space:
mode:
authorFranz Zotter <fzotter@users.sourceforge.net>2008-10-22 12:38:10 +0000
committerFranz Zotter <fzotter@users.sourceforge.net>2008-10-22 12:38:10 +0000
commitc91acb086ab4c95cef4feb0da4265a09f73a1201 (patch)
tree8f9ecbb0837fb046b48678283488d6c7cf02bbbc /src/mtx_pack~.c
parent95e71c35ba7c54f9c6cd248714195cefe17c77cb (diff)
added [mtx_sndfile] which reads blocks of an audiofile
and [mtx_pack~] which packs the sample vectors of its signal inputs into a matrix. svn path=/trunk/externals/iem/iemmatrix/; revision=10336
Diffstat (limited to 'src/mtx_pack~.c')
-rw-r--r--src/mtx_pack~.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/mtx_pack~.c b/src/mtx_pack~.c
new file mode 100644
index 0000000..c935d10
--- /dev/null
+++ b/src/mtx_pack~.c
@@ -0,0 +1,80 @@
+#include "m_pd.h"
+#define MTX_PACK_MAXCHANNELS 200
+
+static t_class *mtx_pack_tilde_class;
+
+typedef struct _mtx_pack_tilde {
+ t_object x_obj;
+ int block_size;
+ int num_chan;
+ t_float **sig_in;
+ t_atom *list_out;
+ t_outlet *message_outlet;
+} mtx_pack_tilde;
+
+void *newMtxPackTilde (t_floatarg f)
+{
+ int num_chan=1;
+ mtx_pack_tilde *x = (mtx_pack_tilde*) pd_new(mtx_pack_tilde_class);
+ num_chan=(int)f;
+ if ((num_chan<0) || (num_chan>MTX_PACK_MAXCHANNELS)) {
+ num_chan=1;
+ }
+ x->num_chan=num_chan;
+ x->sig_in=0;
+ x->list_out=0;
+ while (num_chan--) {
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+ }
+ x->sig_in = (t_float**)getbytes(sizeof(t_float*)*x->num_chan);
+ x->message_outlet=(t_outlet*)outlet_new(&x->x_obj,&s_list);
+
+ return (void *) x;
+}
+void deleteMtxPackTilde (mtx_pack_tilde *x)
+{
+ if (x->sig_in)
+ freebytes (x->sig_in, x->num_chan * sizeof (t_float));
+ if (x->list_out)
+ freebytes (x->list_out, (x->num_chan * x->block_size + 2)*sizeof(t_atom));
+}
+static t_int *mTxPackTildePerform (t_int *arg)
+{
+ mtx_pack_tilde *x = (mtx_pack_tilde *) (arg[1]);
+ int chan;
+ int samp;
+ t_atom *lptr=x->list_out+2;
+ SETFLOAT(x->list_out,(t_float)x->num_chan);
+ SETFLOAT(x->list_out+1,(t_float)x->block_size);
+
+ for (chan=0; chan<x->num_chan; chan++) {
+ for (samp=0; samp<x->block_size; samp++,lptr++) {
+ SETFLOAT(lptr, x->sig_in[chan][samp]);
+ }
+ }
+
+ outlet_anything(x->message_outlet,gensym("matrix"),
+ x->block_size*x->num_chan+2,x->list_out);
+
+ return(arg+2);
+
+}
+
+static void mTxPackTildeDsp (mtx_pack_tilde *x, t_signal **sp)
+{
+ int chan;
+ for (chan=0; chan<x->num_chan; chan++)
+ x->sig_in[chan]=sp[chan]->s_vec;
+
+ x->block_size=sp[0]->s_n;
+ x->list_out = (t_atom*) getbytes ((x->num_chan * x->block_size + 2) *sizeof(t_atom));
+ dsp_add(mTxPackTildePerform,1,x);
+}
+
+void mtx_pack_tilde_setup (void)
+{
+ mtx_pack_tilde_class = class_new(gensym("mtx_pack~"), (t_newmethod)newMtxPackTilde, (t_method) deleteMtxPackTilde, sizeof(mtx_pack_tilde), CLASS_NOINLET, A_DEFFLOAT, 0);
+ class_addmethod (mtx_pack_tilde_class, (t_method) mTxPackTildeDsp, gensym("dsp"),0);
+}
+
+