X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/architecture/q.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/q.cpp b/interpreter/preprocessor/faust-0.9.47mr3/architecture/q.cpp new file mode 100644 index 0000000..8189c4d --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/architecture/q.cpp @@ -0,0 +1,364 @@ +/************************************************************************ + ************************************************************************ + FAUST Architecture File + Copyright (C) 2006-2011 Albert Graef + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + ************************************************************************ + ************************************************************************/ + +/* Q architecture file. Derived from minimal.cpp included in the Faust + distribution. Please note that this is to be compiled as a shared library, + which is then loaded dynamically by Q's faust module. */ + +#include +#include + +struct Meta +{ + void declare (const char* key, const char* value) { } +}; + +//------------------------------------------------------------------- +// Generic min and max using c++ inline +//------------------------------------------------------------------- + +inline int max (unsigned int a, unsigned int b) { return (a>b) ? a : b; } +inline int max (int a, int b) { return (a>b) ? a : b; } + +inline long max (long a, long b) { return (a>b) ? a : b; } +inline long max (int a, long b) { return (a>b) ? a : b; } +inline long max (long a, int b) { return (a>b) ? a : b; } + +inline float max (float a, float b) { return (a>b) ? a : b; } +inline float max (int a, float b) { return (a>b) ? a : b; } +inline float max (float a, int b) { return (a>b) ? a : b; } +inline float max (long a, float b) { return (a>b) ? a : b; } +inline float max (float a, long b) { return (a>b) ? a : b; } + +inline double max (double a, double b) { return (a>b) ? a : b; } +inline double max (int a, double b) { return (a>b) ? a : b; } +inline double max (double a, int b) { return (a>b) ? a : b; } +inline double max (long a, double b) { return (a>b) ? a : b; } +inline double max (double a, long b) { return (a>b) ? a : b; } +inline double max (float a, double b) { return (a>b) ? a : b; } +inline double max (double a, float b) { return (a>b) ? a : b; } + + +inline int min (int a, int b) { return (a T abs (T a) { return (a> n); } + +/****************************************************************************** +******************************************************************************* + + VECTOR INTRINSICS + +******************************************************************************* +*******************************************************************************/ + +//inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((unsigned)(calloc((nmemb*size)+15,sizeof(char)))+15 & 0xfffffff0); } +//inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((size_t)(calloc((nmemb*size)+15,sizeof(char)))+15 & ~15); } + +<> + +/****************************************************************************** +******************************************************************************* + + ABSTRACT USER INTERFACE + +******************************************************************************* +*******************************************************************************/ + +class UI +{ + bool fStopped; +public: + + UI() : fStopped(false) {} + virtual ~UI() {} + + virtual void addButton(char* label, float* zone) = 0; + virtual void addToggleButton(char* label, float* zone) = 0; + virtual void addCheckButton(char* label, float* zone) = 0; + virtual void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step) = 0; + virtual void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step) = 0; + virtual void addNumEntry(char* label, float* zone, float init, float min, float max, float step) = 0; + + virtual void addNumDisplay(char* label, float* zone, int precision) = 0; + virtual void addTextDisplay(char* label, float* zone, char* names[], float min, float max) = 0; + virtual void addHorizontalBargraph(char* label, float* zone, float min, float max) = 0; + virtual void addVerticalBargraph(char* label, float* zone, float min, float max) = 0; + + virtual void openFrameBox(char* label) = 0; + virtual void openTabBox(char* label) = 0; + virtual void openHorizontalBox(char* label) = 0; + virtual void openVerticalBox(char* label) = 0; + virtual void closeBox() = 0; + + virtual void run() = 0; + + void stop() { fStopped = true; } + bool stopped() { return fStopped; } + + virtual void declare(float* zone, const char* key, const char* value) {} +}; + +/*************************************************************************** + Q UI interface + ***************************************************************************/ + +enum ui_elem_type_t { + UI_BUTTON, UI_TOGGLE_BUTTON, UI_CHECK_BUTTON, + UI_V_SLIDER, UI_H_SLIDER, UI_NUM_ENTRY, + UI_V_BARGRAPH, UI_H_BARGRAPH, + UI_END_GROUP, UI_V_GROUP, UI_H_GROUP, UI_T_GROUP +}; + +struct ui_elem_t { + ui_elem_type_t type; + char *label; + float *zone; + void *ref; + float init, min, max, step; +}; + +class QUI : public UI +{ +public: + int nelems; + ui_elem_t *elems; + + QUI(); + virtual ~QUI(); + +protected: + void add_elem(ui_elem_type_t type, char *label = NULL); + void add_elem(ui_elem_type_t type, char *label, float *zone); + void add_elem(ui_elem_type_t type, char *label, float *zone, + float init, float min, float max, float step); + void add_elem(ui_elem_type_t type, char *label, float *zone, + float min, float max); + +public: + virtual void addButton(char* label, float* zone); + virtual void addToggleButton(char* label, float* zone); + virtual void addCheckButton(char* label, float* zone); + virtual void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step); + virtual void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step); + virtual void addNumEntry(char* label, float* zone, float init, float min, float max, float step); + + virtual void addNumDisplay(char* label, float* zone, int precision); + virtual void addTextDisplay(char* label, float* zone, char* names[], float min, float max); + virtual void addHorizontalBargraph(char* label, float* zone, float min, float max); + virtual void addVerticalBargraph(char* label, float* zone, float min, float max); + + virtual void openFrameBox(char* label); + virtual void openTabBox(char* label); + virtual void openHorizontalBox(char* label); + virtual void openVerticalBox(char* label); + virtual void closeBox(); + + virtual void run(); +}; + +QUI::QUI() +{ + nelems = 0; + elems = NULL; +} + +QUI::~QUI() +{ + if (elems) free(elems); +} + +inline void QUI::add_elem(ui_elem_type_t type, char *label) +{ + ui_elem_t *elems1 = (ui_elem_t*)realloc(elems, (nelems+1)*sizeof(ui_elem_t)); + if (elems1) + elems = elems1; + else + return; + elems[nelems].type = type; + elems[nelems].label = label; + elems[nelems].zone = NULL; + elems[nelems].ref = NULL; + elems[nelems].init = 0.0; + elems[nelems].min = 0.0; + elems[nelems].max = 0.0; + elems[nelems].step = 0.0; + nelems++; +} + +inline void QUI::add_elem(ui_elem_type_t type, char *label, float *zone) +{ + ui_elem_t *elems1 = (ui_elem_t*)realloc(elems, (nelems+1)*sizeof(ui_elem_t)); + if (elems1) + elems = elems1; + else + return; + elems[nelems].type = type; + elems[nelems].label = label; + elems[nelems].zone = zone; + elems[nelems].ref = NULL; + elems[nelems].init = 0.0; + elems[nelems].min = 0.0; + elems[nelems].max = 0.0; + elems[nelems].step = 0.0; + nelems++; +} + +inline void QUI::add_elem(ui_elem_type_t type, char *label, float *zone, + float init, float min, float max, float step) +{ + ui_elem_t *elems1 = (ui_elem_t*)realloc(elems, (nelems+1)*sizeof(ui_elem_t)); + if (elems1) + elems = elems1; + else + return; + elems[nelems].type = type; + elems[nelems].label = label; + elems[nelems].zone = zone; + elems[nelems].ref = NULL; + elems[nelems].init = init; + elems[nelems].min = min; + elems[nelems].max = max; + elems[nelems].step = step; + nelems++; +} + +inline void QUI::add_elem(ui_elem_type_t type, char *label, float *zone, + float min, float max) +{ + ui_elem_t *elems1 = (ui_elem_t*)realloc(elems, (nelems+1)*sizeof(ui_elem_t)); + if (elems1) + elems = elems1; + else + return; + elems[nelems].type = type; + elems[nelems].label = label; + elems[nelems].zone = zone; + elems[nelems].ref = NULL; + elems[nelems].init = 0.0; + elems[nelems].min = min; + elems[nelems].max = max; + elems[nelems].step = 0.0; + nelems++; +} + +void QUI::addButton(char* label, float* zone) +{ add_elem(UI_BUTTON, label, zone); } +void QUI::addToggleButton(char* label, float* zone) +{ add_elem(UI_TOGGLE_BUTTON, label, zone); } +void QUI::addCheckButton(char* label, float* zone) +{ add_elem(UI_CHECK_BUTTON, label, zone); } +void QUI::addVerticalSlider(char* label, float* zone, float init, float min, float max, float step) +{ add_elem(UI_V_SLIDER, label, zone, init, min, max, step); } +void QUI::addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step) +{ add_elem(UI_H_SLIDER, label, zone, init, min, max, step); } +void QUI::addNumEntry(char* label, float* zone, float init, float min, float max, float step) +{ add_elem(UI_NUM_ENTRY, label, zone, init, min, max, step); } + +// FIXME: addNumDisplay and addTextDisplay not implemented in Faust yet? +void QUI::addNumDisplay(char* label, float* zone, int precision) {} +void QUI::addTextDisplay(char* label, float* zone, char* names[], float min, float max) {} +void QUI::addHorizontalBargraph(char* label, float* zone, float min, float max) +{ add_elem(UI_H_BARGRAPH, label, zone, min, max); } +void QUI::addVerticalBargraph(char* label, float* zone, float min, float max) +{ add_elem(UI_V_BARGRAPH, label, zone, min, max); } + +void QUI::openFrameBox(char* label) {} +void QUI::openTabBox(char* label) +{ add_elem(UI_T_GROUP, label); } +void QUI::openHorizontalBox(char* label) +{ add_elem(UI_H_GROUP, label); } +void QUI::openVerticalBox(char* label) +{ add_elem(UI_V_GROUP, label); } +void QUI::closeBox() +{ add_elem(UI_END_GROUP); } + +void QUI::run() {} + +/****************************************************************************** +******************************************************************************* + + FAUST DSP + +******************************************************************************* +*******************************************************************************/ + + + +//---------------------------------------------------------------- +// abstract definition of a signal processor +//---------------------------------------------------------------- + +class dsp { + protected: + int fSamplingFreq; + public: + dsp() {} + virtual ~dsp() {} + virtual int getNumInputs() = 0; + virtual int getNumOutputs() = 0; + virtual void buildUserInterface(UI* interface) = 0; + virtual void init(int samplingRate) = 0; + virtual void compute(int len, float** inputs, float** outputs) = 0; +}; + +//---------------------------------------------------------------------------- +// FAUST generated signal processor +//---------------------------------------------------------------------------- + + +<> + +/* The class factory, used to create and destroy mydsp objects in the + client. Implemented using C linkage to facilitate dlopen access. */ + +extern "C" dsp *newdsp() +{ + mydsp *d = new mydsp(); + return d; +} + +extern "C" void deldsp(dsp* d) +{ + delete d; +}