1 //-----------------------------------------------------
6 // copyright: "(c)GRAME 2006"
8 // Code generated with Faust 0.9.9.5b2 (http://faust.grame.fr)
9 //-----------------------------------------------------
22 #include <sys/ioctl.h>
26 #include <sys/types.h>
41 #include "JackAudioQueueAdapter.h"
45 // On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero)
46 // flags to avoid costly denormals
48 #include <xmmintrin.h>
50 #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8040)
52 #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8000)
55 #define AVOIDDENORMALS
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 *******************************************************************************
78 *******************************************************************************
79 *******************************************************************************/
82 /******************************************************************************
83 *******************************************************************************
87 *******************************************************************************
88 *******************************************************************************/
95 UI() : fStopped(false) {}
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) {}
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
140 stack<string> fPrefix;
141 map<string, param> fKeyParam;
143 void addOption(const char* label, float* zone, float min, float max)
145 string fullname = fPrefix.top() + label;
146 fKeyParam.insert(make_pair(fullname, param(zone, min, max)));
149 void openAnyBox(const char* label)
153 if (label && label[0]) {
154 prefix = fPrefix.top() + "-" + label;
156 prefix = fPrefix.top();
158 fPrefix.push(prefix);
163 CMDUI(int argc, char *argv[]) : UI(), fArgc(argc), fArgv(argv) { fPrefix.push("--"); }
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)
172 addOption(label,zone,min,max);
175 virtual void addHorizontalSlider(const char* label, float* zone, float init, float min, float max, float step)
177 addOption(label,zone,min,max);
180 virtual void addNumEntry(const char* label, float* zone, float init, float min, float max, float step)
182 addOption(label,zone,min,max);
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() {}
203 printf("Type 'q' to quit\n");
204 while ((c = getchar()) != 'q') {
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 <<" ] ";
219 void process_command()
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";
231 *(p->second.fZone) = float(strtod(fArgv[i+1], &end));
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";
248 *(p->second.fZone) = float(strtod(fArgv[i+1], &end));
256 //----------------------------------------------------------------
257 // Signal processor definition
258 //----------------------------------------------------------------
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 {
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");
360 virtual int getNumInputs() { return 2; }
361 virtual int getNumOutputs() { return 2; }
362 static void classInit(int samplingFreq) {
364 virtual void instanceInit(int samplingFreq) {
365 fSamplingFreq = samplingFreq;
367 for (int i=0; i<2; i++) fRec9[i] = 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;
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;
435 virtual void init(int samplingFreq) {
436 classInit(samplingFreq);
437 instanceInit(samplingFreq);
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();
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));
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];
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];
584 /******************************************************************************
585 *******************************************************************************
587 NETJACK AUDIO INTERFACE
589 *******************************************************************************
590 *******************************************************************************/
592 //----------------------------------------------------------------------------
593 // number of input and output channels
594 //----------------------------------------------------------------------------
599 //----------------------------------------------------------------------------
601 //----------------------------------------------------------------------------
603 static void net_shutdown(void *)
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));
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;
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];
639 cout << low << ' ' << tot/(mesure-KSKIP) << ' ' << hi << endl;
643 for (int i = KSKIP+1; i<KMESURE; i++) {
644 unsigned long long int m = stops[i] - starts[i];
649 cout << low << ' ' << tot/(KMESURE-KSKIP) << ' ' << hi << endl;
661 static int net_process(jack_nframes_t buffer_size,
663 float** audio_input_buffer,
665 void** midi_input_buffer,
667 float** audio_output_buffer,
669 void** midi_output_buffer,
674 DSP.compute(buffer_size, audio_input_buffer, audio_output_buffer);
679 /******************************************************************************
680 *******************************************************************************
684 *******************************************************************************
685 *******************************************************************************/
687 //-------------------------------------------------------------------------
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;
710 //if (audio.Open() < 0) {
711 // fprintf(stderr, "Cannot open audio\n");
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");
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");
738 int retVal = UIApplicationMain(argc, argv, nil, nil);
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");