+++ /dev/null
-/************************************************************************
-
- IMPORTANT NOTE : this file contains two clearly delimited sections :
- the ARCHITECTURE section (in two parts) and the USER section. Each section
- is governed by its own copyright and license. Please check individually
- each section for license and copyright information.
-*************************************************************************/
-
-/*******************BEGIN ARCHITECTURE SECTION (part 1/2)****************/
-
-/************************************************************************
- FAUST Architecture File
- Copyright (C) 2010-2011 V. Lazzarini and GRAME
- ---------------------------------------------------------------------
- This Architecture section is free software; you can redistribute it
- and/or modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 3 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; If not, see <http://www.gnu.org/licenses/>.
-
- EXCEPTION : As a special exception, you may create a larger work
- that contains this FAUST architecture section and distribute
- that work under terms of your choice, so long as this FAUST
- architecture section is not modified.
-
-
- ************************************************************************
- ************************************************************************/
-
-//==============================================================================
-//
-// CSOUND architecture file for FAUST
-// Y. Orlarey & V. Lazzarini
-//
-// Usage : faust -uim -a csound.cpp <myfx>.dsp -o <myfx>.cpp
-// g++ -O3 -DOPCODE_NAME=<myfx> -c <myfx>.cpp -o <myfx>.o
-// ld -E --shared <myfx>.o -o <myfx>.so
-//
-// History :
-// - 28/04/09 : first version
-// - 29/04/09 : dynamic allocation
-//
-//==============================================================================
-
-#include <new>
-#include <vector>
-#include "csdl.h" /* CSOUND plugin API header */
-
-// used to transform a symbol in a string
-#define sym(name) xsym(name)
-#define xsym(name) #name
-
-// make sure we use csound floats
-#define FAUSTFLOAT MYFLT
-
-// we require macro declarations
-#define FAUST_UIMACROS
-
-// but we will ignore most of them
-#define FAUST_ADDBUTTON(l,f)
-#define FAUST_ADDCHECKBOX(l,f)
-#define FAUST_ADDVERTICALSLIDER(l,f,i,a,b,s)
-#define FAUST_ADDHORIZONTALSLIDER(l,f,i,a,b,s)
-#define FAUST_ADDNUMENTRY(l,f,i,a,b,s)
-#define FAUST_ADDVERTICALBARGRAPH(l,f,a,b)
-#define FAUST_ADDHORIZONTALBARGRAPH(l,f,a,b)
-
-#define max(x,y) (((x)>(y)) ? (x) : (y))
-#define min(x,y) (((x)<(y)) ? (x) : (y))
-
-using namespace std;
-
-// On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero)
-// flags to avoid costly denormals
-#ifdef __SSE__
- #include <xmmintrin.h>
- #ifdef __SSE2__
- #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8040)
- #else
- #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8000)
- #endif
-#else
- #define AVOIDDENORMALS
-#endif
-
-
-
-
-/******************************************************************************
-*******************************************************************************
-
- VECTOR INTRINSICS
-
-*******************************************************************************
-*******************************************************************************/
-
-
-<<includeIntrinsic>>
-
-
-
-/**
- * We will ignore metadata declarations
- */
-struct Meta
-{
- void declare (const char* key, const char* value) { }
-};
-
-/**
- * Abstract Definition of a user interface
- */
-class UI
-{
- public:
-
- virtual ~UI() {}
-
- // -- active widgets
-
- virtual void addButton(const char* label, FAUSTFLOAT* zone) = 0;
- virtual void addToggleButton(const char* label, FAUSTFLOAT* zone) = 0;
- virtual void addCheckButton(const char* label, FAUSTFLOAT* zone) = 0;
- virtual void addVerticalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0;
- virtual void addHorizontalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0;
- virtual void addNumEntry(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0;
-
- // -- passive widgets
-
- virtual void addNumDisplay(const char* label, FAUSTFLOAT* zone, int precision) {}
- virtual void addTextDisplay(const char* label, FAUSTFLOAT* zone, char* names[], FAUSTFLOAT min, FAUSTFLOAT max) {}
- virtual void addHorizontalBargraph(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) {}
- virtual void addVerticalBargraph(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) {}
-
- // -- widget's layouts
-
- virtual void openFrameBox(const char* label) {}
- virtual void openTabBox(const char* label) {}
- virtual void openHorizontalBox(const char* label) {}
- virtual void openVerticalBox(const char* label) {}
- virtual void closeBox() {}
-
- virtual void declare(FAUSTFLOAT* zone, const char* key, const char* value) {}
-};
-
-/**
- * A UI that simply collects the active zones in a vector
- * and provides a method to copy the csound controls
- */
-class CSUI : public UI
-{
- vector<FAUSTFLOAT*> vZone;
-
- public:
- // -- active widgets
-
- virtual void addButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); }
- virtual void addToggleButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); }
- virtual void addCheckButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); }
- virtual void addVerticalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); }
- virtual void addHorizontalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); }
- virtual void addNumEntry(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); }
-
- void copyfrom(MYFLT* mem[]) {
- for (unsigned int i=0; i<vZone.size(); i++) { *vZone[i] = *(mem[i]); }
- }
-
- int size() { return vZone.size(); }
-};
-
-
-
-/**
- * Abstract Definition of a DSP
- */
-
-class dsp {
- protected:
- int fSamplingFreq;
- public:
- virtual int getNumInputs() = 0;
- virtual int getNumOutputs() = 0;
- virtual void instanceInit(int samplingFreq) = 0;
- virtual void init(int samplingFreq)= 0;
- virtual void buildUserInterface(UI* interface) = 0;
- virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT** output) = 0;
-};
-
-
-/********************END ARCHITECTURE SECTION (part 1/2)****************/
-
-/**************************BEGIN USER SECTION **************************/
-
-<<includeclass>>
-
-/***************************END USER SECTION ***************************/
-
-/*******************BEGIN ARCHITECTURE SECTION (part 2/2)***************/
-
-
-
-struct dataspace {
- OPDS h; /* basic attributes */
- MYFLT* aout[FAUST_OUTPUTS]; /* output buffers */
- MYFLT* ain[FAUST_INPUTS]; /* input buffers */
- MYFLT* ktl[FAUST_ACTIVES]; /* controls */
- dsp* DSP; /* the Faust generated object */
- CSUI* interface; /* do the mapping between CSound controls and DSP fields */
- AUXCH dspmem; /* aux memory allocated once to store the DSP object */
- AUXCH intmem; /* aux memory allocated once to store the interface object */
-};
-
-
-/**
- * Creates a "aaakkkk" CSound description string. Note that
- * these string will never be released. Potential memory leak
- */
-static char* makeDescription(int numa, int numk=0)
-{
- char* str = (char*)malloc(numa+numk+1); // NEED TO BE CHANGED ?
- if (str) {
- for (int i=0; i<numa; i++) str[i] = 'a';
- for (int i=0; i<numk; i++) str[numa+i] = 'k';
- str[numa+numk] = 0;
- }
- return str;
-}
-
-
-/**
- * CSOUND callback that allocates and initializes
- * the FAUST generated DSP object and it's CSound interface
- */
-static int init(CSOUND *csound, dataspace *p)
-{
- if (p->dspmem.auxp == NULL)
- csound->AuxAlloc(csound, sizeof(mydsp), &p->dspmem);
-
- if(p->intmem.auxp == NULL)
- csound->AuxAlloc(csound, sizeof(CSUI), &p->intmem);
-
-
- p->DSP = new (p->dspmem.auxp) mydsp;
- p->interface = new (p->intmem.auxp) CSUI;
-
- if ((p->DSP == 0) | (p->interface == 0)) return NOTOK;
-
- p->DSP->init((int)csound->GetSr(csound));
- p->DSP->buildUserInterface(p->interface);
-
- return OK;
-}
-
-
-/**
- * CSound callback that process the samples by updating
- * the controls values and calling the compute() method
- * of the DSP object. (Assume MYFLT = FAUSTFLOAT)
- */
-static int process32bits(CSOUND *csound, dataspace *p)
-{
- AVOIDDENORMALS;
-
- // update all the control values
- p->interface->copyfrom(p->ktl);
-
- p->DSP->compute(csound->GetKsmps(csound), p->ain, p->aout);
- return OK;
-}
-
-extern "C" {
-
-static OENTRY localops[] = {
- {(char*)sym(OPCODE_NAME), sizeof(dataspace),5,makeDescription(FAUST_OUTPUTS), makeDescription(FAUST_INPUTS,FAUST_ACTIVES),
- (SUBR)init, NULL,(SUBR)process32bits }
-};
-LINKAGE
-}
-
-
-/********************END ARCHITECTURE SECTION (part 2/2)****************/
-
-
-