diff options
Diffstat (limited to 'pdoctave_get.c')
-rw-r--r-- | pdoctave_get.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/pdoctave_get.c b/pdoctave_get.c new file mode 100644 index 0000000..1c7df7b --- /dev/null +++ b/pdoctave_get.c @@ -0,0 +1,183 @@ +#include <string.h> +#ifndef __pdoctave_get_c_ +#define __pdoctave_get_c_ +#include "pdoctave.h" /* writing a command to octave */ +#include "pdoctave_dataframe.h" +#include "m_pd.h" + +static t_class *pdoctave_get_class; + +typedef struct _PDOctaveGet_ PDOctaveGet; +struct _PDOctaveGet_ +{ + t_object x_obj; + t_outlet *outlet; + SharedDataFrame *sdf; + char oct_command[150]; + char *oct_name; + void *data; + int list_length; + t_atom *list; +}; + +static void *newPDOctaveGet (t_symbol *s, int argc, t_atom *argv) +{ + PDOctaveGet *pdoctget_obj = (PDOctaveGet *) + pd_new (pdoctave_get_class); + t_symbol *name; + + post("getpdoctaveinstances returned %d", getPDOctaveInstances()); + if (getPDOctaveInstances()<1) { + post("Octave not running, insert a 'pdoctave' object!!"); + } + if (argc>0) + name = atom_getsymbol(argv); + else + name = gensym ("pdm1"); + + pdoctget_obj->sdf = newSharedDataFrame (); + pdoctget_obj->data = 0; + pdoctget_obj->oct_name = name->s_name; + pdoctget_obj->outlet = outlet_new (&pdoctget_obj->x_obj, 0); + + return ((void *) pdoctget_obj); +} + +static void pDOctaveGetCommand (PDOctaveGet *pdoctget_obj) +{ + char *cmd; + cmd = pdoctget_obj->oct_command; + strcpy(cmd, "write_shared_mem("); + cmd += 17; + strcpy(cmd, pdoctget_obj->oct_name); + cmd += strlen (cmd); + *cmd++ = ','; + sprintf(cmd, "%d", getSharedDataFrameId(pdoctget_obj->sdf)); + cmd += strlen(cmd); + strcpy (cmd, ")\n"); + + writeToOctaveStdIN (pdoctget_obj->oct_command); +} + +static void copyFloats (float *f, t_atom *a, int n) +{ + for (;n--;a++,f++) + SETFLOAT (a, *f); +} + +static void outletListAllocation (PDOctaveGet *pdoctget_obj, int newsize) +{ + if (newsize != pdoctget_obj->list_length) { + if (newsize > 0) { + if (pdoctget_obj->list_length > 0) { + pdoctget_obj->list = (t_atom *) + resizebytes (pdoctget_obj->list, + sizeof(t_atom) * pdoctget_obj->list_length, + sizeof(t_atom) * newsize); + pdoctget_obj->list_length = newsize; + } + else { + pdoctget_obj->list = (t_atom *) getbytes (sizeof(t_atom) * newsize); + pdoctget_obj->list_length = newsize; + } + } + else if (newsize == 0) { + freebytes (pdoctget_obj->list, sizeof(t_atom) * pdoctget_obj->list_length); + pdoctget_obj->list = 0; + pdoctget_obj->list_length = 0; + } + } +} + +static void pdoctaveConvertData (PDOctaveGet *pdoctget_obj) +{ + int size = getSharedDataVecLength(pdoctget_obj->sdf); + t_symbol *s; + switch (getSharedDataType (pdoctget_obj->sdf)) { + case FLOAT: + case MATRIX: + case LIST: + outletListAllocation (pdoctget_obj, size); + copyFloats ((float *) pdoctget_obj->data, pdoctget_obj->list, size); + break; + case SYMBOL: + size = 1; + outletListAllocation (pdoctget_obj, 1); + s = gensym((char*)pdoctget_obj->data); + SETSYMBOL (pdoctget_obj->list, s); + break; + case UNKNOWN: + post("pdoctave_get: unknown return value"); + } + removeSharedData (pdoctget_obj->sdf, &(pdoctget_obj->data)); +} + +static void pdoctaveOutletList (PDOctaveGet *pdoctget_obj) +{ + t_symbol *s; + switch (getSharedDataType (pdoctget_obj->sdf)) { + case FLOAT: + s = gensym("float"); + break; + case LIST: + s = gensym("list"); + break; + case MATRIX: + s = gensym("matrix"); + break; + case SYMBOL: + s = gensym("symbol"); + break; + case UNKNOWN: + post("pdoctave_get: unknown return value"); + return; + } + outlet_anything (pdoctget_obj->outlet, + s, pdoctget_obj->list_length, pdoctget_obj->list); +} + +static void pDOctaveGetBang (PDOctaveGet *pdoctget_obj) +{ + SharedDataFrame *sdf; + + sdf = pdoctget_obj->sdf; + + sleepUntilReadUnBlocked (sdf,STD_USLEEP_TIME); + blockForReading (sdf); + + // sending read command + blockForWriting (sdf); + pDOctaveGetCommand (pdoctget_obj); + sleepUntilWriteUnBlocked (sdf,STD_USLEEP_TIME); + + // waiting for results + pdoctget_obj->data = getSharedData (sdf); + + // converting incoming data + pdoctaveConvertData (pdoctget_obj); + unBlockForReading (sdf); + + // outletting data + pdoctaveOutletList (pdoctget_obj); +} + + +static void deletePDOctaveGet (PDOctaveGet *pdoctget_obj) +{ + removeSharedData (pdoctget_obj->sdf, &(pdoctget_obj->data)); + removeSharedDataFrame (&(pdoctget_obj->sdf)); +} + +void pdoctave_get_setup (void) +{ + pdoctave_get_class = class_new + (gensym("pdoctave_get"), + (t_newmethod) newPDOctaveGet, + (t_method) deletePDOctaveGet, + sizeof (PDOctaveGet), + CLASS_DEFAULT, A_GIMME, 0); + class_addbang (pdoctave_get_class, (t_method) pDOctaveGetBang); + post("pdoctave_get successfully loaded"); +} +#endif + |