From d8dfb24efb0f899e565b99b81c7a723e15776b95 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Tue, 25 Jul 2017 00:53:49 -0400 Subject: [PATCH] triage iem16's lack of shared lib with statically declared copy/pasta functions It appears iem16 is supposed to be built as a single binary. Unfortunately Pd-extended broke these up into separate binaries without setting up a sensible cross-platform shared library. Thus Pd-extended had creation-order problems where, for example, the tab16 classes depended on a table16 to already exist so that the relevant symbols could resolve properly. We have no way of knowing how people were using these classes in the wild with Pd-extended. To support old Pd-extended patches we just use copy/pasta for a few functions so that any of the classes can get their objects instantiated without depending on any of the other classes already existing. --- externals/iem16/src/del16read~.c | 13 ++++++++ externals/iem16/src/del16write~.c | 2 +- externals/iem16/src/iem16_delay.h | 51 +++++++++++++++++++++++++++++ externals/iem16/src/iem16_table.h | 4 +-- externals/iem16/src/tab16play~.c | 11 +++++++ externals/iem16/src/tab16read.c | 8 +++++ externals/iem16/src/tab16read4.c | 8 +++++ externals/iem16/src/tab16read4~.c | 11 +++++++ externals/iem16/src/tab16read~.c | 11 +++++++ externals/iem16/src/tab16receive~.c | 12 +++++++ externals/iem16/src/tab16send~.c | 11 +++++++ externals/iem16/src/tab16write~.c | 13 ++++++++ externals/iem16/src/vd16~.c | 14 ++++++++ 13 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 externals/iem16/src/iem16_delay.h diff --git a/externals/iem16/src/del16read~.c b/externals/iem16/src/del16read~.c index 99f71b8eb..cc148a9d5 100644 --- a/externals/iem16/src/del16read~.c +++ b/externals/iem16/src/del16read~.c @@ -21,6 +21,19 @@ typedef struct _sigdel16read{ int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_sigdel16read; +/* routine to check that all del16writes/del16reads/vds have same vecsize */ +/* copied from del16write~.c so that there's no dependency on del16write~ + existing before we instantiate an object from this class. (Also because + I don't feel like adding and bugfixing a shared library across platforms */ +static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ + if (x->x_rsortno != ugen_getsortno()) { + x->x_vecsize = vecsize; + x->x_rsortno = ugen_getsortno(); + } + else if (vecsize != x->x_vecsize) + pd_error(x, "del16read/del16write/vd vector size mismatch"); +} + static void sigdel16read_16bit(t_sigdel16read *x, t_float f); static void *sigdel16read_new(t_symbol *s, t_floatarg f){ diff --git a/externals/iem16/src/del16write~.c b/externals/iem16/src/del16write~.c index f3b447ef2..56f63237b 100644 --- a/externals/iem16/src/del16write~.c +++ b/externals/iem16/src/del16write~.c @@ -13,7 +13,7 @@ /* ----------------------------- del16write~ ----------------------------- */ /* routine to check that all del16writes/del16reads/vds have same vecsize */ -void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ +static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ if (x->x_rsortno != ugen_getsortno()) { x->x_vecsize = vecsize; x->x_rsortno = ugen_getsortno(); diff --git a/externals/iem16/src/iem16_delay.h b/externals/iem16/src/iem16_delay.h new file mode 100644 index 000000000..acb58b3e6 --- /dev/null +++ b/externals/iem16/src/iem16_delay.h @@ -0,0 +1,51 @@ +/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM + * based on d_array.c from pd: + * Copyright (c) 1997-1999 Miller Puckette and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +#ifndef INCLUDE_IEM16_DELAY_H__ +#define INCLUDE_IEM16_DELAY_H__ + +/* sampling */ + +#include "iem16.h" +#include <string.h> + + +#if defined __WIN32 || defined __WIN32__ +static int ugen_getsortno(void){return 0;} +#else +extern int ugen_getsortno(void); +#endif + + +t_class *sigdel16write_class; + +typedef struct del16writectl{ + int c_n; + t_iem16_16bit *c_vec; + int c_phase; +} t_del16writectl; + +typedef struct _sigdel16write{ + t_object x_obj; + t_symbol *x_sym; + t_del16writectl x_cspace; + int x_sortno; /* DSP sort number at which this was last put on chain */ + int x_rsortno; /* DSP sort # for first del16read or write in chain */ + int x_vecsize; /* vector size for del16read~ to use */ + float x_f; +} t_sigdel16write; + + +//void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize); + + +# define XTRASAMPS 4 +# define SAMPBLK 4 + + +#define DEFDELVS 64 /* LATER get this from canvas at DSP time */ + +#endif diff --git a/externals/iem16/src/iem16_table.h b/externals/iem16/src/iem16_table.h index 506fd8ae3..fb3d179c3 100644 --- a/externals/iem16/src/iem16_table.h +++ b/externals/iem16/src/iem16_table.h @@ -27,8 +27,8 @@ typedef struct _table16 { } t_table16; -EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec); -EXTERN void table16_usedindsp(t_table16*x); +//EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec); +//EXTERN void table16_usedindsp(t_table16*x); diff --git a/externals/iem16/src/tab16play~.c b/externals/iem16/src/tab16play~.c index 0fd1049bd..4af5df75d 100644 --- a/externals/iem16/src/tab16play~.c +++ b/externals/iem16/src/tab16play~.c @@ -8,6 +8,17 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} /* ------------ tab16play~ - non-transposing sample playback --------------- */ diff --git a/externals/iem16/src/tab16read.c b/externals/iem16/src/tab16read.c index 17b6c5c84..20a2e865f 100644 --- a/externals/iem16/src/tab16read.c +++ b/externals/iem16/src/tab16read.c @@ -8,6 +8,14 @@ #include "iem16_table.h" +/* the following function is copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + /* ---------- tab16read: control, non-interpolating ------------------------ */ static t_class *tab16read_class; diff --git a/externals/iem16/src/tab16read4.c b/externals/iem16/src/tab16read4.c index 0d379791a..cebcf8413 100644 --- a/externals/iem16/src/tab16read4.c +++ b/externals/iem16/src/tab16read4.c @@ -8,6 +8,14 @@ #include "iem16_table.h" +/* the following function is copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + /* ---------- tab16read4: control, non-interpolating ------------------------ */ static t_class *tab16read4_class; diff --git a/externals/iem16/src/tab16read4~.c b/externals/iem16/src/tab16read4~.c index 7f2ed85f6..c85ea0e55 100644 --- a/externals/iem16/src/tab16read4~.c +++ b/externals/iem16/src/tab16read4~.c @@ -8,6 +8,17 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} /******************** tab16read4~ ***********************/ diff --git a/externals/iem16/src/tab16read~.c b/externals/iem16/src/tab16read~.c index 9f5657587..e384bb806 100644 --- a/externals/iem16/src/tab16read~.c +++ b/externals/iem16/src/tab16read~.c @@ -8,6 +8,17 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} /******************** tab16read~ ***********************/ diff --git a/externals/iem16/src/tab16receive~.c b/externals/iem16/src/tab16receive~.c index 2aaf0a8ef..6eaa8d698 100644 --- a/externals/iem16/src/tab16receive~.c +++ b/externals/iem16/src/tab16receive~.c @@ -8,6 +8,18 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} + /* ------------------------ tab16receive~ ------------------------- */ static t_class *tab16receive_class; diff --git a/externals/iem16/src/tab16send~.c b/externals/iem16/src/tab16send~.c index 50105a06f..9e8ede542 100644 --- a/externals/iem16/src/tab16send~.c +++ b/externals/iem16/src/tab16send~.c @@ -8,6 +8,17 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} /* ------------------------ tab16send~ ------------------------- */ diff --git a/externals/iem16/src/tab16write~.c b/externals/iem16/src/tab16write~.c index dc3f47018..f88574311 100644 --- a/externals/iem16/src/tab16write~.c +++ b/externals/iem16/src/tab16write~.c @@ -8,6 +8,19 @@ #include "iem16_table.h" +/* the following two functions are copied from table16.c so that each class can + be instantiated without a dependency on table16 already existing */ +static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} + +static void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} + + /* ------------------------- tab16write~ -------------------------- */ static t_class *tab16write_tilde_class; diff --git a/externals/iem16/src/vd16~.c b/externals/iem16/src/vd16~.c index c3387fec5..7a85eefb0 100644 --- a/externals/iem16/src/vd16~.c +++ b/externals/iem16/src/vd16~.c @@ -19,6 +19,20 @@ typedef struct _sig16vd{ float x_f; } t_sig16vd; + +/* routine to check that all del16writes/del16reads/vds have same vecsize */ +/* copied from del16write~.c so that there's no dependency on del16write~ + existing before we instantiate an object from this class. (Also because + I don't feel like adding and bugfixing a shared library across platforms */ +static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ + if (x->x_rsortno != ugen_getsortno()) { + x->x_vecsize = vecsize; + x->x_rsortno = ugen_getsortno(); + } + else if (vecsize != x->x_vecsize) + pd_error(x, "del16read/del16write/vd vector size mismatch"); +} + static void *sig16vd_new(t_symbol *s){ t_sig16vd *x = (t_sig16vd *)pd_new(sig16vd_class); if (!*s->s_name) s = gensym("vd~"); -- GitLab