aboutsummaryrefslogtreecommitdiff
path: root/shmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'shmem.c')
-rw-r--r--shmem.c98
1 files changed, 60 insertions, 38 deletions
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; i<index_max; i++)
- vec[i+dest_offset].w_float = x->share_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; i<index_max; i++)
+ vec[i+dest_offset].w_float = x->share_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);
}
}