FIx doxygen and user facing and non-facing typos
[jack2.git] / macosx / iphone / freeverb.mm
blob4eb3f6ceaa9b957883bad8a42af3ce579ab67cab
1 //-----------------------------------------------------
2 // name: "freeverb"
3 // version: "1.0"
4 // author: "Grame"
5 // license: "BSD"
6 // copyright: "(c)GRAME 2006"
7 //
8 // Code generated with Faust 0.9.9.5b2 (http://faust.grame.fr)
9 //-----------------------------------------------------
10 /* link with  */
12 /* link with  */
13 #include <math.h>
14 /* link with  */
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include <limits.h>
19 #include <math.h>
20 #include <errno.h>
21 #include <time.h>
22 #include <sys/ioctl.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <pwd.h>
26 #include <sys/types.h>
27 #include <assert.h>
28 #include <pthread.h>
29 #include <sys/wait.h>
30 #include <libgen.h>
31 #include <jack/net.h>
33 #include <list>
34 #include <vector>
35 #include <iostream>
36 #include <fstream>
37 #include <stack>
38 #include <list>
39 #include <map>
41 #include "JackAudioQueueAdapter.h"
43 using namespace std;
45 // On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero)
46 // flags to avoid costly denormals
47 #ifdef __SSE__
48     #include <xmmintrin.h>
49     #ifdef __SSE2__
50         #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8040)
51     #else
52         #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8000)
53     #endif
54 #else
55     #define AVOIDDENORMALS
56 #endif
58 //#define BENCHMARKMODE
60 struct Meta : map<const char*, const char*>
62     void declare (const char* key, const char* value) { (*this)[key]=value; }
66 #define max(x,y) (((x)>(y)) ? (x) : (y))
67 #define min(x,y) (((x)<(y)) ? (x) : (y))
69 inline int              lsr (int x, int n)      { return int(((unsigned int)x) >> n); }
70 inline int              int2pow2 (int x)        { int r = 0; while ((1<<r)<x) r++; return r; }
73 /******************************************************************************
74 *******************************************************************************
76                                                                VECTOR INTRINSICS
78 *******************************************************************************
79 *******************************************************************************/
82 /******************************************************************************
83 *******************************************************************************
85                                                                 USER INTERFACE
87 *******************************************************************************
88 *******************************************************************************/
90 class UI
92         bool    fStopped;
93 public:
95         UI() : fStopped(false) {}
96         virtual ~UI() {}
98         // -- active widgets
100         virtual void addButton(const char* label, float* zone) = 0;
101         virtual void addToggleButton(const char* label, float* zone) = 0;
102         virtual void addCheckButton(const char* label, float* zone) = 0;
103         virtual void addVerticalSlider(const char* label, float* zone, float init, float min, float max, float step) = 0;
104         virtual void addHorizontalSlider(const char* label, float* zone, float init, float min, float max, float step) = 0;
105         virtual void addNumEntry(const char* label, float* zone, float init, float min, float max, float step) = 0;
107         // -- passive widgets
109         virtual void addNumDisplay(const char* label, float* zone, int precision) = 0;
110         virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) = 0;
111         virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) = 0;
112         virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) = 0;
114         // -- frames and labels
116         virtual void openFrameBox(const char* label) = 0;
117         virtual void openTabBox(const char* label) = 0;
118         virtual void openHorizontalBox(const char* label) = 0;
119         virtual void openVerticalBox(const char* label) = 0;
120         virtual void closeBox() = 0;
122         virtual void show() = 0;
123         virtual void run() = 0;
125         void stop()             { fStopped = true; }
126         bool stopped()  { return fStopped; }
128     virtual void declare(float* zone, const char* key, const char* value) {}
131 struct param {
132         float* fZone; float fMin; float fMax;
133         param(float* z, float a, float b) : fZone(z), fMin(a), fMax(b) {}
136 class CMDUI : public UI
138         int                                     fArgc;
139         char**                          fArgv;
140         stack<string>           fPrefix;
141         map<string, param>      fKeyParam;
143         void addOption(const char* label, float* zone, float min, float max)
144         {
145                 string fullname = fPrefix.top() + label;
146                 fKeyParam.insert(make_pair(fullname, param(zone, min, max)));
147         }
149         void openAnyBox(const char* label)
150         {
151                 string prefix;
153                 if (label && label[0]) {
154                         prefix = fPrefix.top() + "-" + label;
155                 } else {
156                         prefix = fPrefix.top();
157                 }
158                 fPrefix.push(prefix);
159         }
161 public:
163         CMDUI(int argc, char *argv[]) : UI(), fArgc(argc), fArgv(argv) { fPrefix.push("--"); }
164         virtual ~CMDUI() {}
166         virtual void addButton(const char* label, float* zone)          {};
167         virtual void addToggleButton(const char* label, float* zone)    {};
168         virtual void addCheckButton(const char* label, float* zone)     {};
170         virtual void addVerticalSlider(const char* label, float* zone, float init, float min, float max, float step)
171         {
172                 addOption(label,zone,min,max);
173         }
175         virtual void addHorizontalSlider(const char* label, float* zone, float init, float min, float max, float step)
176         {
177                 addOption(label,zone,min,max);
178         }
180         virtual void addNumEntry(const char* label, float* zone, float init, float min, float max, float step)
181         {
182                 addOption(label,zone,min,max);
183         }
185         // -- passive widgets
187         virtual void addNumDisplay(const char* label, float* zone, int precision)                                               {}
188         virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max)        {}
189         virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max)                        {}
190         virtual void addVerticalBargraph(const char* label, float* zone, float min, float max)                  {}
192         virtual void openFrameBox(const char* label)            { openAnyBox(label); }
193         virtual void openTabBox(const char* label)              { openAnyBox(label); }
194         virtual void openHorizontalBox(const char* label)       { openAnyBox(label); }
195         virtual void openVerticalBox(const char* label) { openAnyBox(label); }
197         virtual void closeBox()                                         { fPrefix.pop(); }
199         virtual void show() {}
200         virtual void run()
201         {
202                 char c;
203                 printf("Type 'q' to quit\n");
204                 while ((c = getchar()) != 'q') {
205                         sleep(1);
206                 }
207         }
209         void print()
210         {
211                 map<string, param>::iterator i;
212                 cout << fArgc << "\n";
213                 cout << fArgv[0] << " option list : ";
214                 for (i = fKeyParam.begin(); i != fKeyParam.end(); i++) {
215                         cout << "[ " << i->first << " " << i->second.fMin << ".." << i->second.fMax <<" ] ";
216                 }
217         }
219         void process_command()
220         {
221                 map<string, param>::iterator p;
222                 for (int i = 1; i < fArgc; i++) {
223                         if (fArgv[i][0] == '-') {
224                                 p = fKeyParam.find(fArgv[i]);
225                                 if (p == fKeyParam.end()) {
226                                         cout << fArgv[0] << " : unrecognized option " << fArgv[i] << "\n";
227                                         print();
228                                         exit(1);
229                                 }
230                                 char*   end;
231                                 *(p->second.fZone) = float(strtod(fArgv[i+1], &end));
232                                 i++;
233                         }
234                 }
235         }
237         void process_init()
238         {
239                 map<string, param>::iterator p;
240                 for (int i = 1; i < fArgc; i++) {
241                         if (fArgv[i][0] == '-') {
242                                 p = fKeyParam.find(fArgv[i]);
243                                 if (p == fKeyParam.end()) {
244                                         cout << fArgv[0] << " : unrecognized option " << fArgv[i] << "\n";
245                                         exit(1);
246                                 }
247                                 char*   end;
248                                 *(p->second.fZone) = float(strtod(fArgv[i+1], &end));
249                                 i++;
250                         }
251                 }
252         }
256 //----------------------------------------------------------------
257 //  Signal processor definition
258 //----------------------------------------------------------------
260 class dsp {
261  protected:
262         int fSamplingFreq;
263  public:
264         dsp() {}
265         virtual ~dsp() {}
267         virtual int getNumInputs()                                                                              = 0;
268         virtual int getNumOutputs()                                                                     = 0;
269         virtual void buildUserInterface(UI* interface)                                  = 0;
270         virtual void init(int samplingRate)                                                     = 0;
271         virtual void compute(int len, float** inputs, float** outputs)  = 0;
272         virtual void conclude()                                                                                 {}
276 //----------------------------------------------------------------------------
277 //      FAUST generated code
278 //----------------------------------------------------------------------------
281 class mydsp : public dsp {
282   private:
283         float   fslider0;
284         float   fRec9[2];
285         float   fslider1;
286         int     IOTA;
287         float   fVec0[2048];
288         float   fRec8[2];
289         float   fRec11[2];
290         float   fVec1[2048];
291         float   fRec10[2];
292         float   fRec13[2];
293         float   fVec2[2048];
294         float   fRec12[2];
295         float   fRec15[2];
296         float   fVec3[2048];
297         float   fRec14[2];
298         float   fRec17[2];
299         float   fVec4[2048];
300         float   fRec16[2];
301         float   fRec19[2];
302         float   fVec5[2048];
303         float   fRec18[2];
304         float   fRec21[2];
305         float   fVec6[2048];
306         float   fRec20[2];
307         float   fRec23[2];
308         float   fVec7[2048];
309         float   fRec22[2];
310         float   fVec8[1024];
311         float   fRec6[2];
312         float   fVec9[512];
313         float   fRec4[2];
314         float   fVec10[512];
315         float   fRec2[2];
316         float   fVec11[256];
317         float   fRec0[2];
318         float   fslider2;
319         float   fRec33[2];
320         float   fVec12[2048];
321         float   fRec32[2];
322         float   fRec35[2];
323         float   fVec13[2048];
324         float   fRec34[2];
325         float   fRec37[2];
326         float   fVec14[2048];
327         float   fRec36[2];
328         float   fRec39[2];
329         float   fVec15[2048];
330         float   fRec38[2];
331         float   fRec41[2];
332         float   fVec16[2048];
333         float   fRec40[2];
334         float   fRec43[2];
335         float   fVec17[2048];
336         float   fRec42[2];
337         float   fRec45[2];
338         float   fVec18[2048];
339         float   fRec44[2];
340         float   fRec47[2];
341         float   fVec19[2048];
342         float   fRec46[2];
343         float   fVec20[1024];
344         float   fRec30[2];
345         float   fVec21[512];
346         float   fRec28[2];
347         float   fVec22[512];
348         float   fRec26[2];
349         float   fVec23[256];
350         float   fRec24[2];
351   public:
352         static void metadata(Meta* m)   {
353                 m->declare("name", "freeverb");
354                 m->declare("version", "1.0");
355                 m->declare("author", "Grame");
356                 m->declare("license", "BSD");
357                 m->declare("copyright", "(c)GRAME 2006");
358         }
360         virtual int getNumInputs()      { return 2; }
361         virtual int getNumOutputs()     { return 2; }
362         static void classInit(int samplingFreq) {
363         }
364         virtual void instanceInit(int samplingFreq) {
365                 fSamplingFreq = samplingFreq;
366                 fslider0 = 0.5f;
367                 for (int i=0; i<2; i++) fRec9[i] = 0;
368                 fslider1 = 0.8f;
369                 IOTA = 0;
370                 for (int i=0; i<2048; i++) fVec0[i] = 0;
371                 for (int i=0; i<2; i++) fRec8[i] = 0;
372                 for (int i=0; i<2; i++) fRec11[i] = 0;
373                 for (int i=0; i<2048; i++) fVec1[i] = 0;
374                 for (int i=0; i<2; i++) fRec10[i] = 0;
375                 for (int i=0; i<2; i++) fRec13[i] = 0;
376                 for (int i=0; i<2048; i++) fVec2[i] = 0;
377                 for (int i=0; i<2; i++) fRec12[i] = 0;
378                 for (int i=0; i<2; i++) fRec15[i] = 0;
379                 for (int i=0; i<2048; i++) fVec3[i] = 0;
380                 for (int i=0; i<2; i++) fRec14[i] = 0;
381                 for (int i=0; i<2; i++) fRec17[i] = 0;
382                 for (int i=0; i<2048; i++) fVec4[i] = 0;
383                 for (int i=0; i<2; i++) fRec16[i] = 0;
384                 for (int i=0; i<2; i++) fRec19[i] = 0;
385                 for (int i=0; i<2048; i++) fVec5[i] = 0;
386                 for (int i=0; i<2; i++) fRec18[i] = 0;
387                 for (int i=0; i<2; i++) fRec21[i] = 0;
388                 for (int i=0; i<2048; i++) fVec6[i] = 0;
389                 for (int i=0; i<2; i++) fRec20[i] = 0;
390                 for (int i=0; i<2; i++) fRec23[i] = 0;
391                 for (int i=0; i<2048; i++) fVec7[i] = 0;
392                 for (int i=0; i<2; i++) fRec22[i] = 0;
393                 for (int i=0; i<1024; i++) fVec8[i] = 0;
394                 for (int i=0; i<2; i++) fRec6[i] = 0;
395                 for (int i=0; i<512; i++) fVec9[i] = 0;
396                 for (int i=0; i<2; i++) fRec4[i] = 0;
397                 for (int i=0; i<512; i++) fVec10[i] = 0;
398                 for (int i=0; i<2; i++) fRec2[i] = 0;
399                 for (int i=0; i<256; i++) fVec11[i] = 0;
400                 for (int i=0; i<2; i++) fRec0[i] = 0;
401                 fslider2 = 0.8f;
402                 for (int i=0; i<2; i++) fRec33[i] = 0;
403                 for (int i=0; i<2048; i++) fVec12[i] = 0;
404                 for (int i=0; i<2; i++) fRec32[i] = 0;
405                 for (int i=0; i<2; i++) fRec35[i] = 0;
406                 for (int i=0; i<2048; i++) fVec13[i] = 0;
407                 for (int i=0; i<2; i++) fRec34[i] = 0;
408                 for (int i=0; i<2; i++) fRec37[i] = 0;
409                 for (int i=0; i<2048; i++) fVec14[i] = 0;
410                 for (int i=0; i<2; i++) fRec36[i] = 0;
411                 for (int i=0; i<2; i++) fRec39[i] = 0;
412                 for (int i=0; i<2048; i++) fVec15[i] = 0;
413                 for (int i=0; i<2; i++) fRec38[i] = 0;
414                 for (int i=0; i<2; i++) fRec41[i] = 0;
415                 for (int i=0; i<2048; i++) fVec16[i] = 0;
416                 for (int i=0; i<2; i++) fRec40[i] = 0;
417                 for (int i=0; i<2; i++) fRec43[i] = 0;
418                 for (int i=0; i<2048; i++) fVec17[i] = 0;
419                 for (int i=0; i<2; i++) fRec42[i] = 0;
420                 for (int i=0; i<2; i++) fRec45[i] = 0;
421                 for (int i=0; i<2048; i++) fVec18[i] = 0;
422                 for (int i=0; i<2; i++) fRec44[i] = 0;
423                 for (int i=0; i<2; i++) fRec47[i] = 0;
424                 for (int i=0; i<2048; i++) fVec19[i] = 0;
425                 for (int i=0; i<2; i++) fRec46[i] = 0;
426                 for (int i=0; i<1024; i++) fVec20[i] = 0;
427                 for (int i=0; i<2; i++) fRec30[i] = 0;
428                 for (int i=0; i<512; i++) fVec21[i] = 0;
429                 for (int i=0; i<2; i++) fRec28[i] = 0;
430                 for (int i=0; i<512; i++) fVec22[i] = 0;
431                 for (int i=0; i<2; i++) fRec26[i] = 0;
432                 for (int i=0; i<256; i++) fVec23[i] = 0;
433                 for (int i=0; i<2; i++) fRec24[i] = 0;
434         }
435         virtual void init(int samplingFreq) {
436                 classInit(samplingFreq);
437                 instanceInit(samplingFreq);
438         }
439         virtual void buildUserInterface(UI* interface) {
440                 interface->openVerticalBox("Freeverb");
441                 interface->addHorizontalSlider("Damp", &fslider0, 0.5f, 0.0f, 1.0f, 2.500000e-02f);
442                 interface->addHorizontalSlider("RoomSize", &fslider1, 0.8f, 0.0f, 1.0f, 2.500000e-02f);
443                 interface->addHorizontalSlider("Wet", &fslider2, 0.8f, 0.0f, 1.0f, 2.500000e-02f);
444                 interface->closeBox();
445         }
446         virtual void compute (int count, float** input, float** output) {
447                 float   fSlow0 = (0.4f * fslider0);
448                 float   fSlow1 = (1 - fSlow0);
449                 float   fSlow2 = (0.7f + (0.28f * fslider1));
450                 float   fSlow3 = fslider2;
451                 float   fSlow4 = (1 - fSlow3);
452                 float* input0 = input[0];
453                 float* input1 = input[1];
454                 float* output0 = output[0];
455                 float* output1 = output[1];
456                 for (int i=0; i<count; i++) {
457                         fRec9[0] = ((fSlow1 * fRec8[1]) + (fSlow0 * fRec9[1]));
458                         float fTemp0 = input1[i];
459                         float fTemp1 = input0[i];
460                         float fTemp2 = (1.500000e-02f * (fTemp1 + fTemp0));
461                         fVec0[IOTA&2047] = (fTemp2 + (fSlow2 * fRec9[0]));
462                         fRec8[0] = fVec0[(IOTA-1617)&2047];
463                         fRec11[0] = ((fSlow1 * fRec10[1]) + (fSlow0 * fRec11[1]));
464                         fVec1[IOTA&2047] = (fTemp2 + (fSlow2 * fRec11[0]));
465                         fRec10[0] = fVec1[(IOTA-1557)&2047];
466                         fRec13[0] = ((fSlow1 * fRec12[1]) + (fSlow0 * fRec13[1]));
467                         fVec2[IOTA&2047] = (fTemp2 + (fSlow2 * fRec13[0]));
468                         fRec12[0] = fVec2[(IOTA-1491)&2047];
469                         fRec15[0] = ((fSlow1 * fRec14[1]) + (fSlow0 * fRec15[1]));
470                         fVec3[IOTA&2047] = (fTemp2 + (fSlow2 * fRec15[0]));
471                         fRec14[0] = fVec3[(IOTA-1422)&2047];
472                         fRec17[0] = ((fSlow1 * fRec16[1]) + (fSlow0 * fRec17[1]));
473                         fVec4[IOTA&2047] = (fTemp2 + (fSlow2 * fRec17[0]));
474                         fRec16[0] = fVec4[(IOTA-1356)&2047];
475                         fRec19[0] = ((fSlow1 * fRec18[1]) + (fSlow0 * fRec19[1]));
476                         fVec5[IOTA&2047] = (fTemp2 + (fSlow2 * fRec19[0]));
477                         fRec18[0] = fVec5[(IOTA-1277)&2047];
478                         fRec21[0] = ((fSlow1 * fRec20[1]) + (fSlow0 * fRec21[1]));
479                         fVec6[IOTA&2047] = (fTemp2 + (fSlow2 * fRec21[0]));
480                         fRec20[0] = fVec6[(IOTA-1188)&2047];
481                         fRec23[0] = ((fSlow1 * fRec22[1]) + (fSlow0 * fRec23[1]));
482                         fVec7[IOTA&2047] = (fTemp2 + (fSlow2 * fRec23[0]));
483                         fRec22[0] = fVec7[(IOTA-1116)&2047];
484                         float fTemp3 = (((((((fRec22[0] + fRec20[0]) + fRec18[0]) + fRec16[0]) + fRec14[0]) + fRec12[0]) + fRec10[0]) + fRec8[0]);
485                         fVec8[IOTA&1023] = (fTemp3 + (0.5f * fRec6[1]));
486                         fRec6[0] = fVec8[(IOTA-556)&1023];
487                         float   fRec7 = (0 - (fTemp3 - fRec6[1]));
488                         fVec9[IOTA&511] = (fRec7 + (0.5f * fRec4[1]));
489                         fRec4[0] = fVec9[(IOTA-441)&511];
490                         float   fRec5 = (fRec4[1] - fRec7);
491                         fVec10[IOTA&511] = (fRec5 + (0.5f * fRec2[1]));
492                         fRec2[0] = fVec10[(IOTA-341)&511];
493                         float   fRec3 = (fRec2[1] - fRec5);
494                         fVec11[IOTA&255] = (fRec3 + (0.5f * fRec0[1]));
495                         fRec0[0] = fVec11[(IOTA-225)&255];
496                         float   fRec1 = (fRec0[1] - fRec3);
497                         output0[i] = ((fSlow4 * fTemp1) + (fSlow3 * fRec1));
498                         fRec33[0] = ((fSlow1 * fRec32[1]) + (fSlow0 * fRec33[1]));
499                         fVec12[IOTA&2047] = (fTemp2 + (fSlow2 * fRec33[0]));
500                         fRec32[0] = fVec12[(IOTA-1640)&2047];
501                         fRec35[0] = ((fSlow1 * fRec34[1]) + (fSlow0 * fRec35[1]));
502                         fVec13[IOTA&2047] = (fTemp2 + (fSlow2 * fRec35[0]));
503                         fRec34[0] = fVec13[(IOTA-1580)&2047];
504                         fRec37[0] = ((fSlow1 * fRec36[1]) + (fSlow0 * fRec37[1]));
505                         fVec14[IOTA&2047] = (fTemp2 + (fSlow2 * fRec37[0]));
506                         fRec36[0] = fVec14[(IOTA-1514)&2047];
507                         fRec39[0] = ((fSlow1 * fRec38[1]) + (fSlow0 * fRec39[1]));
508                         fVec15[IOTA&2047] = (fTemp2 + (fSlow2 * fRec39[0]));
509                         fRec38[0] = fVec15[(IOTA-1445)&2047];
510                         fRec41[0] = ((fSlow1 * fRec40[1]) + (fSlow0 * fRec41[1]));
511                         fVec16[IOTA&2047] = (fTemp2 + (fSlow2 * fRec41[0]));
512                         fRec40[0] = fVec16[(IOTA-1379)&2047];
513                         fRec43[0] = ((fSlow1 * fRec42[1]) + (fSlow0 * fRec43[1]));
514                         fVec17[IOTA&2047] = (fTemp2 + (fSlow2 * fRec43[0]));
515                         fRec42[0] = fVec17[(IOTA-1300)&2047];
516                         fRec45[0] = ((fSlow1 * fRec44[1]) + (fSlow0 * fRec45[1]));
517                         fVec18[IOTA&2047] = (fTemp2 + (fSlow2 * fRec45[0]));
518                         fRec44[0] = fVec18[(IOTA-1211)&2047];
519                         fRec47[0] = ((fSlow1 * fRec46[1]) + (fSlow0 * fRec47[1]));
520                         fVec19[IOTA&2047] = (fTemp2 + (fSlow2 * fRec47[0]));
521                         fRec46[0] = fVec19[(IOTA-1139)&2047];
522                         float fTemp4 = (((((((fRec46[0] + fRec44[0]) + fRec42[0]) + fRec40[0]) + fRec38[0]) + fRec36[0]) + fRec34[0]) + fRec32[0]);
523                         fVec20[IOTA&1023] = (fTemp4 + (0.5f * fRec30[1]));
524                         fRec30[0] = fVec20[(IOTA-579)&1023];
525                         float   fRec31 = (0 - (fTemp4 - fRec30[1]));
526                         fVec21[IOTA&511] = (fRec31 + (0.5f * fRec28[1]));
527                         fRec28[0] = fVec21[(IOTA-464)&511];
528                         float   fRec29 = (fRec28[1] - fRec31);
529                         fVec22[IOTA&511] = (fRec29 + (0.5f * fRec26[1]));
530                         fRec26[0] = fVec22[(IOTA-364)&511];
531                         float   fRec27 = (fRec26[1] - fRec29);
532                         fVec23[IOTA&255] = (fRec27 + (0.5f * fRec24[1]));
533                         fRec24[0] = fVec23[(IOTA-248)&255];
534                         float   fRec25 = (fRec24[1] - fRec27);
535                         output1[i] = ((fSlow4 * fTemp0) + (fSlow3 * fRec25));
536                         // post processing
537                         fRec24[1] = fRec24[0];
538                         fRec26[1] = fRec26[0];
539                         fRec28[1] = fRec28[0];
540                         fRec30[1] = fRec30[0];
541                         fRec46[1] = fRec46[0];
542                         fRec47[1] = fRec47[0];
543                         fRec44[1] = fRec44[0];
544                         fRec45[1] = fRec45[0];
545                         fRec42[1] = fRec42[0];
546                         fRec43[1] = fRec43[0];
547                         fRec40[1] = fRec40[0];
548                         fRec41[1] = fRec41[0];
549                         fRec38[1] = fRec38[0];
550                         fRec39[1] = fRec39[0];
551                         fRec36[1] = fRec36[0];
552                         fRec37[1] = fRec37[0];
553                         fRec34[1] = fRec34[0];
554                         fRec35[1] = fRec35[0];
555                         fRec32[1] = fRec32[0];
556                         fRec33[1] = fRec33[0];
557                         fRec0[1] = fRec0[0];
558                         fRec2[1] = fRec2[0];
559                         fRec4[1] = fRec4[0];
560                         fRec6[1] = fRec6[0];
561                         fRec22[1] = fRec22[0];
562                         fRec23[1] = fRec23[0];
563                         fRec20[1] = fRec20[0];
564                         fRec21[1] = fRec21[0];
565                         fRec18[1] = fRec18[0];
566                         fRec19[1] = fRec19[0];
567                         fRec16[1] = fRec16[0];
568                         fRec17[1] = fRec17[0];
569                         fRec14[1] = fRec14[0];
570                         fRec15[1] = fRec15[0];
571                         fRec12[1] = fRec12[0];
572                         fRec13[1] = fRec13[0];
573                         fRec10[1] = fRec10[0];
574                         fRec11[1] = fRec11[0];
575                         fRec8[1] = fRec8[0];
576                         IOTA = IOTA+1;
577                         fRec9[1] = fRec9[0];
578                 }
579         }
582 mydsp   DSP;
584 /******************************************************************************
585 *******************************************************************************
587                                                         NETJACK AUDIO INTERFACE
589 *******************************************************************************
590 *******************************************************************************/
592 //----------------------------------------------------------------------------
593 //      number of input and output channels
594 //----------------------------------------------------------------------------
596 int             gNumInChans;
597 int             gNumOutChans;
599 //----------------------------------------------------------------------------
600 // Jack Callbacks
601 //----------------------------------------------------------------------------
603 static void net_shutdown(void *)
605         exit(1);
608 #ifdef BENCHMARKMODE
609 // measuring jack performances
610 static __inline__ unsigned long long int rdtsc(void)
612   unsigned long long int x;
613      __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
614      return x;
617 #define KSKIP 10
618 #define KMESURE 1024
619 int mesure = 0;
620 unsigned long long int starts[KMESURE];
621 unsigned long long int stops [KMESURE];
623 #define STARTMESURE starts[mesure%KMESURE] = rdtsc();
624 #define STOPMESURE stops[mesure%KMESURE] = rdtsc(); mesure = mesure+1;
626 void printstats()
628     unsigned long long int low, hi, tot;
629     low = hi = tot = (stops[KSKIP] - starts[KSKIP]);
631     if (mesure < KMESURE) {
633         for (int i = KSKIP+1; i<mesure; i++) {
634             unsigned long long int m = stops[i] - starts[i];
635             if (m<low) low = m;
636             if (m>hi) hi = m;
637             tot += m;
638         }
639         cout << low << ' ' << tot/(mesure-KSKIP) << ' ' << hi << endl;
641     } else {
643         for (int i = KSKIP+1; i<KMESURE; i++) {
644             unsigned long long int m = stops[i] - starts[i];
645             if (m<low) low = m;
646             if (m>hi) hi = m;
647             tot += m;
648         }
649         cout << low << ' ' << tot/(KMESURE-KSKIP) << ' ' << hi << endl;
651     }
654 #else
656 #define STARTMESURE
657 #define STOPMESURE
659 #endif
661 static int net_process(jack_nframes_t buffer_size,
662             int audio_input,
663             float** audio_input_buffer,
664             int midi_input,
665             void** midi_input_buffer,
666             int audio_output,
667             float** audio_output_buffer,
668             int midi_output,
669             void** midi_output_buffer,
670             void* data)
672     AVOIDDENORMALS;
673     STARTMESURE
674     DSP.compute(buffer_size, audio_input_buffer, audio_output_buffer);
675     STOPMESURE
676         return 0;
679 /******************************************************************************
680 *******************************************************************************
682                                                                 MAIN PLAY THREAD
684 *******************************************************************************
685 *******************************************************************************/
687 //-------------------------------------------------------------------------
688 //                                                                      MAIN
689 //-------------------------------------------------------------------------
692 #define TEST_MASTER "194.5.49.5"
694 int main(int argc, char *argv[]) {
696     UI* interface = new CMDUI(argc, argv);
697     jack_net_slave_t* net;
698     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
700     //Jack::JackAudioQueueAdapter audio(2, 2, 1024, 44100, NULL);
702     gNumInChans = DSP.getNumInputs();
703         gNumOutChans = DSP.getNumOutputs();
705     jack_slave_t request = { gNumInChans, gNumOutChans, 0, 0, DEFAULT_MTU, -1, 2 };
706     jack_master_t result;
708     printf("Network\n");
710     //if (audio.Open() < 0) {
711     //    fprintf(stderr, "Cannot open audio\n");
712     //    return 1;
713     //}
715      //audio.Start();
717     // Hang around forever...
718          //while(1) CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.25, false);
720     if ((net = jack_net_slave_open(TEST_MASTER, DEFAULT_PORT, "iPhone", &request, &result)) == 0) {
721             fprintf(stderr, "jack remote server not running ?\n");
722             return 1;
723         }
725     jack_set_net_slave_process_callback(net, net_process, NULL);
727     // We want to restart (that is "wait for available master" again)
728     //jack_set_net_shutdown_callback(net, net_shutdown, 0);
730     DSP.init(result.sample_rate);
731         DSP.buildUserInterface(interface);
733     if (jack_net_slave_activate(net) != 0) {
734             fprintf(stderr, "cannot activate net");
735             return 1;
736         }
738     int retVal = UIApplicationMain(argc, argv, nil, nil);
739     [pool release];
741     // Wait for application end
742     jack_net_slave_deactivate(net);
743     jack_net_slave_close(net);
745     //if (audio.Close() < 0) {
746     //    fprintf(stderr, "Cannot close audio\n");
747     //}
749     return retVal;