New directory tree, with preprocessor/ inside interpretor/.
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / architecture / audio / oscdsp.h
diff --git a/interpretor/preprocessor/faust-0.9.47mr3/architecture/audio/oscdsp.h b/interpretor/preprocessor/faust-0.9.47mr3/architecture/audio/oscdsp.h
new file mode 100644 (file)
index 0000000..4521d53
--- /dev/null
@@ -0,0 +1,71 @@
+
+#ifndef __osc_dsp__
+#define __osc_dsp__
+
+#include <stdio.h>
+#include "audio/audio.h"
+#include "audio/dsp.h"
+#include "OSCIO.h"
+
+/******************************************************************************
+*******************************************************************************
+
+                                                       OSC AUDIO INTERFACE
+
+*******************************************************************************
+*******************************************************************************/
+
+#define kMaxBuffer 4096
+
+class oscdsp : public audio, public oscfaust::OSCIO {
+       dsp*     fDsp;
+       float ** fInBuffers, **fOutBuffers;
+
+ public:
+                        oscdsp(const char * dst, int argc, char *argv[]) : OSCIO(dst), fDsp(0), fInBuffers(0), fOutBuffers(0)
+                        {
+                               for (int i = 1; i < argc-1; i++)
+                                       if (!strcmp(argv[i], "-iodst")) setDest (argv[i+1]);
+                        }
+       virtual ~oscdsp() { stop(); }
+
+       virtual bool init(const char*name, dsp* DSP) {
+               fDsp = DSP;
+               fDsp->init(44100);
+               fInBuffers  = new float*[numInputs()];
+               fOutBuffers = new float*[numOutputs()];
+               for (int i= 0; i < numInputs(); i++)
+                       fInBuffers[i] = new float[kMaxBuffer];
+               for (int i= 0; i < numOutputs(); i++)
+                       fOutBuffers [i] = new float[kMaxBuffer];
+               return true;
+       }
+
+       virtual bool start()    { return true; }
+       virtual void stop()             {}
+
+       void compute( int nframes ) {
+               fDsp->compute(nframes, fInBuffers, fOutBuffers);
+               for (int i= 0; i < numOutputs(); i++)
+                       send( nframes, fOutBuffers [i], i);
+       }
+
+       void receive( int nvalues, float * val ) {
+               int inChans = numInputs();
+               if (!inChans) {
+                       compute(nvalues);
+                       return;
+               }
+
+               for (int i=0; i < nvalues; i++) {
+                       int c = i % inChans;
+                       int frame = i / inChans;
+                       fInBuffers[c][frame] = val[i];
+               }
+               compute (nvalues / inChans);
+       }
+       int             numOutputs() const      { return fDsp ? fDsp->getNumOutputs() : 0; }
+       int             numInputs() const       { return fDsp ? fDsp->getNumInputs() : 0; }
+};
+
+#endif