aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2013-03-26 22:17:19 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2013-03-26 22:17:19 +0000
commit9973e13610585d3f6a5b5d733caa1d15c74a3051 (patch)
treec71842d6b3f254b0ef7913e5bdecaa273b1e3bea
parent74323141d6cf23e23c104925ccc1e73cb92a76e1 (diff)
code simplificatoin and "size" parametter addition.
svn path=/trunk/externals/share_mem/; revision=17067
-rw-r--r--shmem-help.pd12
-rw-r--r--shmem.c70
2 files changed, 37 insertions, 45 deletions
diff --git a/shmem-help.pd b/shmem-help.pd
index d8d3572..7999463 100644
--- a/shmem-help.pd
+++ b/shmem-help.pd
@@ -1,4 +1,4 @@
-#N canvas 122 50 1064 468 10;
+#N canvas 120 82 1232 469 10;
#N canvas 1 89 450 300 (subpatch) 0;
#X array array2 100 float 3;
#A 0 -0.857141 -0.799998 -0.72857 -0.657141 -0.585713 -0.542856 -0.499999
@@ -21,7 +21,7 @@
#X text 185 282 write a list (or a float) to the shared memory : 1st
value is index \, other are data to store;
#X msg 22 223 memset 0 array1;
-#N canvas 0 22 450 300 (subpatch) 0;
+#N canvas 0 50 450 300 (subpatch) 0;
#X array array1 100 float 3;
#A 0 -0.87857 -0.864284 -0.849998 -0.835713 -0.835713 -0.807141 -0.792856
-0.77857 -0.749998 -0.749998 -0.735713 -0.707141 -0.692856 -0.67857
@@ -70,9 +70,12 @@ the exisiting segment.;
#X text 475 168 array1 and array 2 are size 100;
#X msg 69 318 memset 50 5 5 5 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7;
#X text 21 192 WRITING INTO MEMORY;
-#X msg 588 282 memdump 0 array2 50;
-#X text 708 282 dump shared memory from index 0 to array2 from index
+#X msg 578 274 memdump 0 array2 50;
+#X text 698 274 dump shared memory from index 0 to array2 from index
50;
+#X msg 588 294 memdump 0 array2 50 10;
+#X text 738 294 dump shared memory from index 0 to array2 from index
+50 to index 60 (50 + 10);
#X connect 1 0 8 0;
#X connect 3 0 8 0;
#X connect 6 0 8 0;
@@ -83,3 +86,4 @@ the exisiting segment.;
#X connect 23 0 8 0;
#X connect 26 0 8 0;
#X connect 28 0 14 0;
+#X connect 30 0 14 0;
diff --git a/shmem.c b/shmem.c
index dfc24bb..f4c01b8 100644
--- a/shmem.c
+++ b/shmem.c
@@ -29,11 +29,7 @@ void shmem_set(t_shmem *x, t_symbol *unused, int argc, t_atom *argv)
t_word *vec;
int i, index_max, shmem_offset;
- if (argc <= 1) {
- pd_error(x, "shmem usage : [memset offset data [offset_data]( (data can be a float, a list, or a table name)");
- return;
- }
- if (argv[0].a_type != A_FLOAT) {
+ if ((argc <= 1) || (argv[0].a_type != A_FLOAT) ){
pd_error(x, "shmem usage : [memset offset data [offset_data]( (data can be a float, a list, or a table name)");
return;
}
@@ -75,53 +71,45 @@ 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 i, vecsize, index_max, shmem_offset, dest_offset;
+ int i, vecsize, index_max, shmem_offset, dest_offset, size;
t_garray *a;
t_word *vec;
- if (argc < 2) {
- pd_error(x, "shmem usage : [memdump offset dest [offset_dest]( ");
- return;
- }
- if (argv[0].a_type != A_FLOAT) {
- pd_error(x, "shmem usage : [memdump offset dest [offset_dest]( ");
+ 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);
- if (argv[1].a_type == A_SYMBOL) { // [memdump offset dest
- t_symbol *s = atom_getsymbolarg(1,argc,argv);
- 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 {
- if (argc == 2) {
- index_max = x->segment_size-shmem_offset;
- if (index_max > vecsize)
- index_max = vecsize;
- // post("i=%d", index_max);
- for (i=0; i<index_max; i++)
- vec[i].w_float = x->share_memory[i+shmem_offset];
- }
- else if (argc == 3) {
+ t_symbol *s = atom_getsymbolarg(1,argc,argv);
+ 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);
- index_max = min(x->segment_size-shmem_offset,vecsize-dest_offset);
- // post("i=%d", index_max);
- for (i=0; i<index_max; i++)
- vec[i+dest_offset].w_float = x->share_memory[i+shmem_offset];
- }
- garray_redraw(a);
- }
- }
- else {
- pd_error(x, "shmem usage : [memdump offset dest [offset_dest]( ");
- return;
- }
-
+ }
+ 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);
+ }
}
void shmem_read(t_shmem *x, t_float index)