aboutsummaryrefslogtreecommitdiff
path: root/pdoctave_send.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdoctave_send.c')
-rw-r--r--pdoctave_send.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/pdoctave_send.c b/pdoctave_send.c
new file mode 100644
index 0000000..b6a38d4
--- /dev/null
+++ b/pdoctave_send.c
@@ -0,0 +1,150 @@
+#include <string.h>
+#ifndef __pdoctave_send_c_
+#define __pdoctave_send_c_
+#include "pdoctave.h" /* writing a command to octave */
+#include "pdoctave_dataframe.h"
+#include "m_pd.h"
+
+static t_class *pdoctave_send_class;
+
+typedef struct _PDOctaveSend_ PDOctaveSend;
+struct _PDOctaveSend_
+{
+ t_object x_obj;
+ SharedDataFrame *sdf;
+ char oct_command[150];
+ char *oct_name;
+ void *data;
+};
+
+static void *newPDOctaveSend (t_symbol *s, int argc, t_atom *argv)
+{
+ PDOctaveSend *pdoctsnd_obj = (PDOctaveSend *)
+ pd_new (pdoctave_send_class);
+ t_symbol *name;
+
+ if (getPDOctaveInstances()<1) {
+ post("Octave not running, insert a 'pdoctave' object!!");
+ }
+ if (argc>0)
+ name = atom_getsymbol(argv);
+ else
+ name = gensym ("pdm1");
+
+ pdoctsnd_obj->sdf = newSharedDataFrame ();
+ pdoctsnd_obj->data = 0;
+ pdoctsnd_obj->oct_name = name->s_name;
+
+ return ((void *) pdoctsnd_obj);
+}
+
+static void pDOctaveSendBang (PDOctaveSend *pdoctsnd_obj)
+{
+ char *cmd;
+ strcpy(pdoctsnd_obj->oct_command, pdoctsnd_obj->oct_name);
+ cmd = pdoctsnd_obj->oct_command + strlen(pdoctsnd_obj->oct_name);
+ strcpy(cmd, "=read_shared_mem(");
+ cmd += 17;
+ sprintf(cmd, "%d", getSharedDataFrameId(pdoctsnd_obj->sdf));
+ cmd = cmd+strlen(cmd);
+ strcpy (cmd, ");\n");
+
+ writeToOctaveStdIN (pdoctsnd_obj->oct_command);
+ freeSharedData (pdoctsnd_obj->sdf, &(pdoctsnd_obj->data));
+ //removeSharedData (pdoctsnd_obj->sdf, &(pdoctsnd_obj->data));
+}
+
+static void copyFloats (float *f, t_atom *a, int n)
+{
+ for (;n--;a++,f++)
+ *f = atom_getfloat(a);
+}
+
+static DatTyp pdSelectorClassify (char *selector)
+{
+ DatTyp pdtyp;
+ if (!strcmp (selector, "matrix"))
+ pdtyp = MATRIX;
+ else if (!strcmp (selector, "float"))
+ pdtyp = FLOAT;
+ else if (!strcmp (selector, "list"))
+ pdtyp = LIST;
+ else if (!strcmp (selector, "symbol"))
+ pdtyp = SYMBOL;
+ else
+ pdtyp = UNKNOWN;
+ return pdtyp;
+}
+
+static void pDOctaveSend (PDOctaveSend *pdoctsnd_obj,
+ t_symbol *s, int argc, t_atom *argv)
+{
+ DatTyp pdtyp;
+ SharedDataFrame *sdf;
+
+ char *selector = s->s_name;
+ t_symbol *symptr;
+ float *f;
+ char *c;
+ int count = argc;
+
+ pdtyp = pdSelectorClassify (selector);
+
+ sdf = pdoctsnd_obj->sdf;
+
+ sleepUntilWriteUnBlocked (sdf, STD_USLEEP_TIME);
+ blockForWriting (sdf);
+
+ if (pdoctsnd_obj->data)
+ removeSharedData (sdf, &(pdoctsnd_obj->data));
+
+ if (pdtyp != SYMBOL) {
+ if (pdoctsnd_obj->data = newSharedData (sdf, argc, sizeof(float), pdtyp)) {
+ f = (float *) pdoctsnd_obj->data;
+ copyFloats (f, argv, argc);
+ }
+ else {
+ post("pdoctave_send: allocation of shared memory size %d bytes failed!",
+ sizeof(float) * argc);
+ return;
+ }
+ }
+ else {
+ symptr = atom_getsymbol (argv);
+ if (pdoctsnd_obj->data = newSharedData (sdf, strlen(symptr->s_name)+1, sizeof(char), pdtyp)) {
+ c = (char *) pdoctsnd_obj->data;
+ strcpy (c, symptr->s_name);
+ }
+ else {
+ post("pdoctave_send: allocation of shared memory size %d bytes failed!",
+ sizeof(char) * (strlen(symptr->s_name)+1));
+ return;
+ }
+ }
+ blockForReading (sdf);
+ freeSharedData (sdf, &(pdoctsnd_obj->data));
+ pDOctaveSendBang (pdoctsnd_obj);
+ sleepUntilReadUnBlocked (sdf,STD_USLEEP_TIME);
+ unBlockForWriting (sdf);
+}
+
+static void deletePDOctaveSend (PDOctaveSend *pdoctsnd_obj)
+{
+ removeSharedData (pdoctsnd_obj->sdf, &(pdoctsnd_obj->data));
+ removeSharedDataFrame (&(pdoctsnd_obj->sdf));
+}
+
+void pdoctave_send_setup (void)
+{
+ pdoctave_send_class = class_new
+ (gensym("pdoctave_send"),
+ (t_newmethod) newPDOctaveSend,
+ (t_method) deletePDOctaveSend,
+ sizeof (PDOctaveSend),
+ CLASS_DEFAULT, A_GIMME, 0);
+ class_addbang (pdoctave_send_class, (t_method) pDOctaveSendBang);
+ class_addanything (pdoctave_send_class, (t_method) pDOctaveSend);
+ post("pdoctave_send successfully loaded");
+}
+#endif
+