From 503d272cbda844e3980f1882afd89efd5fb3be15 Mon Sep 17 00:00:00 2001 From: Cyrille Henry Date: Thu, 16 May 2013 20:26:48 +0000 Subject: add fonctionality : dump shared memory to arrays without any other argument. update help file svn path=/trunk/externals/share_mem/; revision=17132 --- shmem.c | 98 ++++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 38 deletions(-) (limited to 'shmem.c') diff --git a/shmem.c b/shmem.c index 836c991..b6ac1d8 100644 --- a/shmem.c +++ b/shmem.c @@ -20,7 +20,7 @@ static inline t_float min(t_float x1,t_float x2) } } -int shmem_set_tab(t_shmem *x, t_symbol *table, int src_offset, int dest_offset) +int shmem_set_tab(t_shmem *x, t_symbol *table, int src_offset, int dest_offset, int size) { int npoints, i, index_max; t_garray *a; @@ -34,6 +34,7 @@ int shmem_set_tab(t_shmem *x, t_symbol *table, int src_offset, int dest_offset) pd_error(x, "%s: bad template for tabread", s->s_name); else { index_max = min(x->segment_size-dest_offset, npoints-src_offset); + index_max = min(index_max, size); for (i=0; i < index_max; i++) x->share_memory[i+dest_offset] = vec[i+src_offset].w_float; } @@ -43,7 +44,7 @@ int shmem_set_tab(t_shmem *x, t_symbol *table, int src_offset, int dest_offset) void shmem_set(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) { - int i, j, index_max, shmem_offset, array_offset; + int i, j, index_max, shmem_offset, array_offset, size; if (argc < 1) { pd_error(x, "shmem usage : [memset table_name [table_name []]< or [memset src_offset data [dest_offset]< (data can be a float, a list, or a table name)"); @@ -54,7 +55,7 @@ void shmem_set(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) i = 0; j = 0; while (argv[i].a_type == A_SYMBOL) { - j += shmem_set_tab(x, atom_getsymbolarg(i,argc,argv), 0, j); + j += shmem_set_tab(x, atom_getsymbolarg(i,argc,argv), 0, j, x->segment_size); i++; } } @@ -64,11 +65,13 @@ void shmem_set(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) if (argv[1].a_type == A_SYMBOL) { // argument is an arrayname array_offset = 0; + size = x->segment_size; if ((argc > 2) && (argv[2].a_type == A_FLOAT)) array_offset = atom_getfloatarg(2,argc,argv); if (array_offset < 0) array_offset=0; - - shmem_set_tab(x, atom_getsymbolarg(1,argc,argv), array_offset, shmem_offset); + if ((argc > 3) && (argv[2].a_type == A_FLOAT)) + size = atom_getfloatarg(3,argc,argv); + shmem_set_tab(x, atom_getsymbolarg(1,argc,argv), array_offset, shmem_offset, size); } else if (argv[1].a_type == A_FLOAT) { // argument is a float index_max = x->segment_size - shmem_offset; @@ -79,46 +82,65 @@ void shmem_set(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) } } -void shmem_dump(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) +int shmem_dump_tab(t_shmem *x, t_symbol *table, int src_offset, int dest_offset, int size) { - int i, vecsize, index_max, shmem_offset, dest_offset, size; - t_garray *a; + t_garray *a; t_word *vec; - - if ((argc < 2) || (argv[0].a_type != A_FLOAT) || (argv[1].a_type != A_SYMBOL)){ - pd_error(x, "shmem usage : [memdump offset dest [offset_dest [size]]( "); - return; - } - - shmem_offset = atom_getfloatarg(0,argc,argv); - if (shmem_offset < 0) shmem_offset = 0; - if (shmem_offset > x->segment_size-1) i = x->segment_size-1; - // post("i=%d", offset); - - t_symbol *s = atom_getsymbolarg(1,argc,argv); + int i, index_max, vecsize; + + t_symbol *s = table; + i=0; + if (!(a = (t_garray *)pd_findbyclass(s, garray_class))) pd_error(x, "%s: no such array", s->s_name); else if (!garray_getfloatwords(a, &vecsize, &vec)) pd_error(x, "%s: bad template for tabwrite", s->s_name); else { - dest_offset = 0; - size = vecsize; - if ((argc >= 3) && ( argv[2].a_type == A_FLOAT )){ - dest_offset = atom_getfloatarg(2,argc,argv); - } - if ((argc >= 4) && ( argv[3].a_type == A_FLOAT )){ - size = atom_getfloatarg(3,argc,argv); - } - - int index_max_shmem = min(shmem_offset+size, x->segment_size); - int index_max_vec = min(dest_offset+size, vecsize); - index_max = min(index_max_shmem, index_max_vec); - // index_max = min(x->segment_size-shmem_offset,vecsize-dest_offset); - // post("shmem_offset : %d\tdestoffset %d\tsize=%d\tindex_max %d",shmem_offset,dest_offset, size, index_max); - for (i=0; ishare_memory[i+shmem_offset]; - - garray_redraw(a); + + index_max = min(x->segment_size-src_offset, vecsize-dest_offset); + index_max=min(index_max, size); + for (i=0; ishare_memory[i+src_offset]; + } + garray_redraw(a); + + // post("copied=%d", i); + return(i); +} + +void shmem_dump(t_shmem *x, t_symbol *unused, int argc, t_atom *argv) +{ + int i, j, shmem_offset, dest_offset, size; + + if (argc < 1) { + pd_error(x, "shmem usage : [memdump table_name [table_name []]< or [memset src_offset table_name [dest_offset [size]]<"); + return; + } + + if (argv[0].a_type == A_SYMBOL) { + i = 0; + j = 0; + while (argv[i].a_type == A_SYMBOL) { + j += shmem_dump_tab(x, atom_getsymbolarg(i,argc,argv), j, 0, x->segment_size); + i++; + } + } + else if ((argc > 1) && (argv[0].a_type == A_FLOAT) ) { + shmem_offset = atom_getfloatarg(0,argc,argv); + if (shmem_offset < 0) shmem_offset = 0; + // if (shmem_offset > x->segment_size-1) i = x->segment_size-1; + // post("i=%d", offset); + + t_symbol *s = atom_getsymbolarg(1,argc,argv); + dest_offset = 0; + size = x->segment_size; + if ((argc >= 3) && ( argv[2].a_type == A_FLOAT )){ + dest_offset = atom_getfloatarg(2,argc,argv); + } + if ((argc >= 4) && ( argv[3].a_type == A_FLOAT )){ + size = atom_getfloatarg(3,argc,argv); + } + shmem_dump_tab(x, s, shmem_offset, dest_offset, size); } } -- cgit v1.2.1