aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2013-05-16 20:26:48 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2013-05-16 20:26:48 +0000
commit503d272cbda844e3980f1882afd89efd5fb3be15 (patch)
treefa48a05a5528eca9836200800f4ff9ac5ab58116
parent622799a3f78a580e31028c35afb29623101bce44 (diff)
add fonctionality : dump shared memory to arrays without any other argument.
update help file svn path=/trunk/externals/share_mem/; revision=17132
-rw-r--r--shmem-help.pd116
-rw-r--r--shmem.c98
2 files changed, 124 insertions, 90 deletions
diff --git a/shmem-help.pd b/shmem-help.pd
index 8eca76c..dd93ddb 100644
--- a/shmem-help.pd
+++ b/shmem-help.pd
@@ -1,4 +1,4 @@
-#N canvas 532 488 1232 513 10;
+#N canvas 490 352 1176 549 10;
#N canvas 1 89 450 300 (subpatch) 0;
#X array array2 100 float 3;
#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
@@ -7,35 +7,34 @@
0;
#X coords 0 1 99 -1 200 140 1;
#X restore 680 26 graph;
-#X msg 83 358 memset 0 1 1 1 1 1;
-#X text 215 352 write a list (or a float) to the shared memory : 1st
+#X msg 83 418 memset 0 1 1 1 1 1;
+#X text 215 414 write a list (or a float) to the shared memory : 1st
value is index \, other are data to store;
-#X msg 52 283 memset 0 array1;
+#X msg 52 343 memset 0 array1;
#N canvas 0 50 450 300 (subpatch) 0;
#X array array1 100 float 3;
-#A 0 -0.235714 -0.25 -0.264285 -0.278571 -0.292857 -0.292857 -0.292857
--0.307142 -0.321428 -0.335714 -0.335714 -0.349999 -0.349999 -0.349999
--0.364285 -0.371428 -0.378571 -0.378571 -0.378571 -0.378571 -0.385714
--0.392856 -0.399999 -0.407142 -0.414285 -0.421428 -0.421428 -0.421428
--0.421428 -0.421428 -0.42619 -0.430952 -0.435713 -0.445237 -0.454761
--0.464285 -0.464285 -0.464285 -0.464285 -0.464285 -0.464285 -0.464285
--0.471428 -0.47857 -0.47857 -0.47857 -0.47857 -0.47857 -0.47857 -0.47857
--0.492856 -0.507142 -0.507142 -0.507142 -0.507142 -0.507142 -0.507142
--0.507142 -0.507142 -0.521428 -0.535713 -0.535713 -0.535713 -0.535713
--0.535713 -0.535713 -0.535713 -0.549999 -0.549999 -0.549999 -0.549999
--0.549999 -0.549999 -0.549999 -0.549999 -0.549999 -0.549999 -0.549999
--0.549999 -0.549999 -0.549999 -0.564285 -0.564285 -0.57857 -0.57857
--0.57857 -0.57857 -0.57857 -0.592856 -0.592856 -0.592856 -0.592856
--0.592856 -0.592856 -0.592856 -0.592856 -0.592856 -0.592856 -0.592856
--0.607142;
+#A 0 -0.235714 -0.25 -0.264285 -0.278571 -0.292857 -0.292857 -0.25
+-0.235714 -0.192857 -0.164286 -0.121429 -0.1 -0.0785717 -0.0500004
+-0.021429 -4.76837e-07 0.021428 0.0428566 0.0642851 0.0857136 0.107142
+0.121428 0.135714 0.149999 0.164285 0.182142 0.199999 0.217856 0.235713
+0.249999 0.264285 0.27857 0.292856 0.307142 0.321427 0.335713 0.349999
+0.357142 0.364284 0.371427 0.37857 0.383332 0.388094 0.392856 0.40238
+0.411903 0.421427 0.421427 0.421427 0.435713 0.435713 0.435713 0.407142
+0.37857 0.335713 0.307142 0.235713 0.214285 0.192856 0.164285 0.0928565
+0.0499994 -0.00714332 -0.0642861 -0.121429 -0.135714 -0.135714 -0.135714
+-0.107143 -0.1 -0.0928574 -0.0785717 -0.0642861 -0.0642861 -0.0357147
+-0.021429 -0.00714332 0.00714236 0.021428 0.0357137 0.0642851 0.0785708
+0.107142 0.121428 0.135714 0.149999 0.149999 0.164285 0.178571 0.192856
+0.207142 0.221428 0.235713 0.235713 0.249999 0.264285 0.264285 0.27857
+0.292856 0.292856;
#X coords 0 1 99 -1 200 140 1;
#X restore 475 26 graph;
-#X text 166 283 set shared memory from index 0 with array1;
-#X msg 68 305 memset 0 array1 50;
-#X text 196 305 set shared memory from index 0 with array1 from index
+#X text 166 343 set shared memory from index 0 with array1;
+#X msg 68 365 memset 0 array1 50;
+#X text 196 365 set shared memory from index 0 with array1 from index
50;
-#X obj 36 445 shmem 1214 250;
-#X text 162 445 1st argument : Identifiant of the memory segment;
+#X obj 36 505 shmem 1214 250;
+#X text 162 505 1st argument : Identifiant of the memory segment;
#X text 21 15 shmem - shared memory manipulation;
#X text 22 37 The shmem object allow to use shared memory in Pd. It
is useful for example to exchange array between two instances of Pd.
@@ -44,36 +43,47 @@ is identified by its Id.;
#X text 21 95 When you create a shmem object \, it checks its Id. If
the id is not used \, it allows a new segment \, otherwise it address
the exisiting segment.;
-#X floatatom 614 358 5 0 0 0 - - -;
-#X obj 598 411 shmem 1214 250;
-#X text 685 383 read one float of the table send value to the outlet
+#X floatatom 614 418 5 0 0 0 - - -;
+#X obj 598 471 shmem 1214 250;
+#X text 685 443 read one float of the table send value to the outlet
;
-#X msg 598 292 memdump 0 array2;
-#X text 567 204 READING MEMORY;
-#X floatatom 598 435 5 0 0 0 - - -;
-#X text 718 292 dump shared memory from index 0 to array2;
+#X msg 598 352 memdump 0 array2;
+#X text 567 274 READING MEMORY;
+#X floatatom 598 495 5 0 0 0 - - -;
+#X text 718 352 dump shared memory from index 0 to array2;
#X text 21 146 Work only on Linux / and Unix.;
-#X text 162 461 2nd argument : size of the segment (number of float)
+#X text 162 521 2nd argument : size of the segment (number of float)
;
-#X msg 614 383 memread \$1;
-#X msg 106 415 memclear;
-#X text 169 417 reset memory to 0;
+#X msg 614 443 memread \$1;
+#X msg 106 475 memclear;
+#X text 169 477 reset memory to 0;
#X text 475 168 array1 and array 2 are size 100;
-#X msg 99 388 memset 50 5 5 5 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7;
-#X text 21 202 WRITING INTO MEMORY;
-#X msg 608 314 memdump 0 array2 50;
-#X text 728 314 dump shared memory from index 0 to array2 from index
+#X msg 99 448 memset 50 5 5 5 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7;
+#X text 21 272 WRITING INTO MEMORY;
+#X msg 608 374 memdump 0 array2 50;
+#X text 728 374 dump shared memory from index 0 to array2 from index
50;
-#X msg 618 334 memdump 0 array2 50 10;
-#X text 768 334 dump shared memory from index 0 to array2 from index
+#X text 768 394 dump shared memory from index 0 to array2 from index
50 to index 60 (50 + 10);
-#X text 206 329 set shared memory from index 50 with array1 from index
-0;
-#X msg 78 331 memset 50 array1 0;
-#X msg 46 261 memset array1 array1 array1;
-#X msg 36 241 memset array1;
-#X text 149 240 set array in to shared memory;
-#X text 223 261 set diferent array in to shared memory;
+#X msg 46 321 memset array1 array1 array1;
+#X msg 36 301 memset array1;
+#X text 149 300 set array in to shared memory;
+#X text 223 321 set diferent array in to shared memory;
+#X msg 568 301 memdump array2;
+#X msg 584 322 memdump array2 array2 array2;
+#X text 698 298 dump shared memory in an array;
+#X text 769 322 dump shared memory in many array;
+#X msg 78 391 memset 50 array1 0 25;
+#X text 219 388 set shared memory from index 50 with array1 from index
+0 to 25;
+#X msg 53 197 memset array_name [array_name];
+#X msg 71 237 memset src_offset list_of_float;
+#X msg 571 198 memdump array_name [array_name];
+#X msg 61 217 memset src_offset src_array_name [dest_offset [size]]
+;
+#X msg 583 221 memdump src_offset dest_array_name [dest_offset [size]]
+;
+#X msg 618 394 memdump 50 array2 0 10;
#X connect 1 0 8 0;
#X connect 3 0 8 0;
#X connect 6 0 8 0;
@@ -84,7 +94,9 @@ 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;
-#X connect 33 0 8 0;
-#X connect 34 0 8 0;
-#X connect 35 0 8 0;
+#X connect 31 0 8 0;
+#X connect 32 0 8 0;
+#X connect 35 0 14 0;
+#X connect 36 0 14 0;
+#X connect 39 0 8 0;
+#X connect 46 0 14 0;
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);
}
}