jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

888 lines
27KB

  1. /* link with */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <limits.h>
  6. #include <math.h>
  7. #include <errno.h>
  8. #include <time.h>
  9. #include <vector>
  10. #include <stack>
  11. #include <string>
  12. #include <map>
  13. #include <iostream>
  14. //#include <libgen.h>
  15. #include "jack.h"
  16. #include <windows.h>
  17. // g++ -O3 -lm -lsndfile myfx.cpp
  18. using namespace std;
  19. #define max(x,y) (((x)>(y)) ? (x) : (y))
  20. #define min(x,y) (((x)<(y)) ? (x) : (y))
  21. // abs is now predefined
  22. //template<typename T> T abs (T a) { return (a<T(0)) ? -a : a; }
  23. inline int lsr (int x, int n)
  24. {
  25. return int(((unsigned int)x) >> n);
  26. }
  27. /******************************************************************************
  28. *******************************************************************************
  29. VECTOR INTRINSICS
  30. *******************************************************************************
  31. *******************************************************************************/
  32. inline void *aligned_calloc(size_t nmemb, size_t size)
  33. {
  34. return (void*)((unsigned)(calloc((nmemb*size) + 15, sizeof(char))) + 15 & 0xfffffff0);
  35. }
  36. /******************************************************************************
  37. *******************************************************************************
  38. USER INTERFACE
  39. *******************************************************************************
  40. *******************************************************************************/
  41. class UI
  42. {
  43. bool fStopped;
  44. public:
  45. UI() : fStopped(false)
  46. {}
  47. virtual ~UI()
  48. {}
  49. // -- active widgets
  50. virtual void addButton(char* label, float* zone) = 0;
  51. virtual void addToggleButton(char* label, float* zone) = 0;
  52. virtual void addCheckButton(char* label, float* zone) = 0;
  53. virtual void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step) = 0;
  54. virtual void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step) = 0;
  55. virtual void addNumEntry(char* label, float* zone, float init, float min, float max, float step) = 0;
  56. // -- passive widgets
  57. virtual void addNumDisplay(char* label, float* zone, int precision) = 0;
  58. virtual void addTextDisplay(char* label, float* zone, char* names[], float min, float max) = 0;
  59. virtual void addHorizontalBargraph(char* label, float* zone, float min, float max) = 0;
  60. virtual void addVerticalBargraph(char* label, float* zone, float min, float max) = 0;
  61. // -- frames and labels
  62. virtual void openFrameBox(char* label) = 0;
  63. virtual void openTabBox(char* label) = 0;
  64. virtual void openHorizontalBox(char* label) = 0;
  65. virtual void openVerticalBox(char* label) = 0;
  66. virtual void closeBox() = 0;
  67. virtual void show() = 0;
  68. virtual void run() = 0;
  69. void stop()
  70. {
  71. fStopped = true;
  72. }
  73. bool stopped()
  74. {
  75. return fStopped;
  76. }
  77. };
  78. struct param
  79. {
  80. float* fZone;
  81. float fMin;
  82. float fMax;
  83. param(float* z, float a, float b) : fZone(z), fMin(a), fMax(b)
  84. {}
  85. };
  86. class CMDUI : public UI
  87. {
  88. int fArgc;
  89. char** fArgv;
  90. stack<string> fPrefix;
  91. map<string, param> fKeyParam;
  92. void addOption(char* label, float* zone, float min, float max)
  93. {
  94. string fullname = fPrefix.top() + label;
  95. fKeyParam.insert(make_pair(fullname, param(zone, min, max)));
  96. }
  97. void openAnyBox(char* label)
  98. {
  99. string prefix;
  100. if (label && label[0]) {
  101. prefix = fPrefix.top() + "-" + label;
  102. } else {
  103. prefix = fPrefix.top();
  104. }
  105. fPrefix.push(prefix);
  106. }
  107. public:
  108. CMDUI(int argc, char *argv[]) : UI(), fArgc(argc), fArgv(argv)
  109. {
  110. fPrefix.push("--");
  111. }
  112. virtual ~CMDUI()
  113. {}
  114. virtual void addButton(char* label, float* zone)
  115. {}
  116. ;
  117. virtual void addToggleButton(char* label, float* zone)
  118. {}
  119. ;
  120. virtual void addCheckButton(char* label, float* zone)
  121. {}
  122. ;
  123. virtual void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step)
  124. {
  125. addOption(label, zone, min, max);
  126. }
  127. virtual void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step)
  128. {
  129. addOption(label, zone, min, max);
  130. }
  131. virtual void addNumEntry(char* label, float* zone, float init, float min, float max, float step)
  132. {
  133. addOption(label, zone, min, max);
  134. }
  135. // -- passive widgets
  136. virtual void addNumDisplay(char* label, float* zone, int precision)
  137. {}
  138. virtual void addTextDisplay(char* label, float* zone, char* names[], float min, float max)
  139. {}
  140. virtual void addHorizontalBargraph(char* label, float* zone, float min, float max)
  141. {}
  142. virtual void addVerticalBargraph(char* label, float* zone, float min, float max)
  143. {}
  144. virtual void openFrameBox(char* label)
  145. {
  146. openAnyBox(label);
  147. }
  148. virtual void openTabBox(char* label)
  149. {
  150. openAnyBox(label);
  151. }
  152. virtual void openHorizontalBox(char* label)
  153. {
  154. openAnyBox(label);
  155. }
  156. virtual void openVerticalBox(char* label)
  157. {
  158. openAnyBox(label);
  159. }
  160. virtual void closeBox()
  161. {
  162. fPrefix.pop();
  163. }
  164. virtual void show()
  165. {}
  166. virtual void run()
  167. {
  168. char c;
  169. printf("Type 'q' to quit\n");
  170. while ((c = getchar()) != 'q') {
  171. //sleep(1);
  172. Sleep(1000);
  173. }
  174. }
  175. void print()
  176. {
  177. map<string, param>::iterator i;
  178. cout << fArgc << "\n";
  179. cout << fArgv[0] << " option list : ";
  180. for (i = fKeyParam.begin(); i != fKeyParam.end(); i++) {
  181. cout << "[ " << i->first << " " << i->second.fMin << ".." << i->second.fMax << " ] ";
  182. }
  183. //cout << " infile outfile\n";
  184. }
  185. void process_command()
  186. {
  187. map<string, param>::iterator p;
  188. for (int i = 1; i < fArgc; i++) {
  189. if (fArgv[i][0] == '-') {
  190. p = fKeyParam.find(fArgv[i]);
  191. if (p == fKeyParam.end()) {
  192. cout << fArgv[0] << " : unrecognized option " << fArgv[i] << "\n";
  193. print();
  194. exit(1);
  195. }
  196. char* end;
  197. *(p->second.fZone) = float(strtod(fArgv[i + 1], &end));
  198. i++;
  199. }
  200. }
  201. }
  202. void process_init()
  203. {
  204. map<string, param>::iterator p;
  205. for (int i = 1; i < fArgc; i++) {
  206. if (fArgv[i][0] == '-') {
  207. p = fKeyParam.find(fArgv[i]);
  208. if (p == fKeyParam.end()) {
  209. cout << fArgv[0] << " : unrecognized option " << fArgv[i] << "\n";
  210. exit(1);
  211. }
  212. char* end;
  213. *(p->second.fZone) = float(strtod(fArgv[i + 1], &end));
  214. i++;
  215. }
  216. }
  217. }
  218. };
  219. //----------------------------------------------------------------
  220. // d�inition du processeur de signal
  221. //----------------------------------------------------------------
  222. class dsp
  223. {
  224. protected:
  225. int fSamplingFreq;
  226. public:
  227. dsp()
  228. {}
  229. virtual ~dsp()
  230. {}
  231. virtual int getNumInputs() = 0;
  232. virtual int getNumOutputs() = 0;
  233. virtual void buildUserInterface(UI* interface) = 0;
  234. virtual void init(int samplingRate) = 0;
  235. virtual void compute(int len, float** inputs, float** outputs) = 0;
  236. virtual void conclude()
  237. {}
  238. };
  239. //----------------------------------------------------------------------------
  240. // FAUST generated code
  241. //----------------------------------------------------------------------------
  242. class mydsp : public dsp
  243. {
  244. private:
  245. float fslider0;
  246. float R0_0;
  247. int iota0;
  248. float dline0[225];
  249. float R1_0;
  250. int iota1;
  251. float dline1[341];
  252. float R2_0;
  253. int iota2;
  254. float dline2[441];
  255. float R3_0;
  256. int iota3;
  257. float dline3[556];
  258. float R4_0;
  259. int iota4;
  260. float dline4[1617];
  261. float fslider1;
  262. float R5_0;
  263. float fslider2;
  264. float R6_0;
  265. int iota5;
  266. float dline5[1557];
  267. float R7_0;
  268. float R8_0;
  269. int iota6;
  270. float dline6[1491];
  271. float R9_0;
  272. float R10_0;
  273. int iota7;
  274. float dline7[1422];
  275. float R11_0;
  276. float R12_0;
  277. int iota8;
  278. float dline8[1277];
  279. float R13_0;
  280. float R14_0;
  281. int iota9;
  282. float dline9[1116];
  283. float R15_0;
  284. float R16_0;
  285. int iota10;
  286. float dline10[1188];
  287. float R17_0;
  288. float R18_0;
  289. int iota11;
  290. float dline11[1356];
  291. float R19_0;
  292. float R3_1;
  293. float R2_1;
  294. float R1_1;
  295. float R0_1;
  296. float R20_0;
  297. int iota12;
  298. float dline12[248];
  299. float R21_0;
  300. int iota13;
  301. float dline13[364];
  302. float R22_0;
  303. int iota14;
  304. float dline14[464];
  305. float R23_0;
  306. int iota15;
  307. float dline15[579];
  308. float R24_0;
  309. int iota16;
  310. float dline16[1640];
  311. float R25_0;
  312. float R26_0;
  313. int iota17;
  314. float dline17[1580];
  315. float R27_0;
  316. float R28_0;
  317. int iota18;
  318. float dline18[1514];
  319. float R29_0;
  320. float R30_0;
  321. int iota19;
  322. float dline19[1445];
  323. float R31_0;
  324. float R32_0;
  325. int iota20;
  326. float dline20[1300];
  327. float R33_0;
  328. float R34_0;
  329. int iota21;
  330. float dline21[1139];
  331. float R35_0;
  332. float R36_0;
  333. int iota22;
  334. float dline22[1211];
  335. float R37_0;
  336. float R38_0;
  337. int iota23;
  338. float dline23[1379];
  339. float R39_0;
  340. float R23_1;
  341. float R22_1;
  342. float R21_1;
  343. float R20_1;
  344. public:
  345. virtual int getNumInputs()
  346. {
  347. return 2;
  348. }
  349. virtual int getNumOutputs()
  350. {
  351. return 2;
  352. }
  353. virtual void init(int samplingFreq)
  354. {
  355. int i;
  356. fSamplingFreq = samplingFreq;
  357. fslider0 = 0.333300f;
  358. R0_0 = 0.0;
  359. iota0 = 0;
  360. for (i = 0; i < 225; i++)
  361. dline0[i] = 0.0;
  362. R1_0 = 0.0;
  363. iota1 = 0;
  364. for (i = 0; i < 341; i++)
  365. dline1[i] = 0.0;
  366. R2_0 = 0.0;
  367. iota2 = 0;
  368. for (i = 0; i < 441; i++)
  369. dline2[i] = 0.0;
  370. R3_0 = 0.0;
  371. iota3 = 0;
  372. for (i = 0; i < 556; i++)
  373. dline3[i] = 0.0;
  374. R4_0 = 0.0;
  375. iota4 = 0;
  376. for (i = 0; i < 1617; i++)
  377. dline4[i] = 0.0;
  378. fslider1 = 0.9500000f;
  379. R5_0 = 0.0;
  380. fslider2 = 0.9500000f;
  381. R6_0 = 0.0;
  382. iota5 = 0;
  383. for (i = 0; i < 1557; i++)
  384. dline5[i] = 0.0;
  385. R7_0 = 0.0;
  386. R8_0 = 0.0;
  387. iota6 = 0;
  388. for (i = 0; i < 1491; i++)
  389. dline6[i] = 0.0;
  390. R9_0 = 0.0;
  391. R10_0 = 0.0;
  392. iota7 = 0;
  393. for (i = 0; i < 1422; i++)
  394. dline7[i] = 0.0;
  395. R11_0 = 0.0;
  396. R12_0 = 0.0;
  397. iota8 = 0;
  398. for (i = 0; i < 1277; i++)
  399. dline8[i] = 0.0;
  400. R13_0 = 0.0;
  401. R14_0 = 0.0;
  402. iota9 = 0;
  403. for (i = 0; i < 1116; i++)
  404. dline9[i] = 0.0;
  405. R15_0 = 0.0;
  406. R16_0 = 0.0;
  407. iota10 = 0;
  408. for (i = 0; i < 1188; i++)
  409. dline10[i] = 0.0;
  410. R17_0 = 0.0;
  411. R18_0 = 0.0;
  412. iota11 = 0;
  413. for (i = 0; i < 1356; i++)
  414. dline11[i] = 0.0;
  415. R19_0 = 0.0;
  416. R3_1 = 0.0;
  417. R2_1 = 0.0;
  418. R1_1 = 0.0;
  419. R0_1 = 0.0;
  420. R20_0 = 0.0;
  421. iota12 = 0;
  422. for (i = 0; i < 248; i++)
  423. dline12[i] = 0.0;
  424. R21_0 = 0.0;
  425. iota13 = 0;
  426. for (i = 0; i < 364; i++)
  427. dline13[i] = 0.0;
  428. R22_0 = 0.0;
  429. iota14 = 0;
  430. for (i = 0; i < 464; i++)
  431. dline14[i] = 0.0;
  432. R23_0 = 0.0;
  433. iota15 = 0;
  434. for (i = 0; i < 579; i++)
  435. dline15[i] = 0.0;
  436. R24_0 = 0.0;
  437. iota16 = 0;
  438. for (i = 0; i < 1640; i++)
  439. dline16[i] = 0.0;
  440. R25_0 = 0.0;
  441. R26_0 = 0.0;
  442. iota17 = 0;
  443. for (i = 0; i < 1580; i++)
  444. dline17[i] = 0.0;
  445. R27_0 = 0.0;
  446. R28_0 = 0.0;
  447. iota18 = 0;
  448. for (i = 0; i < 1514; i++)
  449. dline18[i] = 0.0;
  450. R29_0 = 0.0;
  451. R30_0 = 0.0;
  452. iota19 = 0;
  453. for (i = 0; i < 1445; i++)
  454. dline19[i] = 0.0;
  455. R31_0 = 0.0;
  456. R32_0 = 0.0;
  457. iota20 = 0;
  458. for (i = 0; i < 1300; i++)
  459. dline20[i] = 0.0;
  460. R33_0 = 0.0;
  461. R34_0 = 0.0;
  462. iota21 = 0;
  463. for (i = 0; i < 1139; i++)
  464. dline21[i] = 0.0;
  465. R35_0 = 0.0;
  466. R36_0 = 0.0;
  467. iota22 = 0;
  468. for (i = 0; i < 1211; i++)
  469. dline22[i] = 0.0;
  470. R37_0 = 0.0;
  471. R38_0 = 0.0;
  472. iota23 = 0;
  473. for (i = 0; i < 1379; i++)
  474. dline23[i] = 0.0;
  475. R39_0 = 0.0;
  476. R23_1 = 0.0;
  477. R22_1 = 0.0;
  478. R21_1 = 0.0;
  479. R20_1 = 0.0;
  480. }
  481. virtual void buildUserInterface(UI* inter)
  482. {
  483. inter->openVerticalBox("Freeverb");
  484. inter->addHorizontalSlider("Damp", &fslider2, 0.500000f, 0.000000f, 1.000000f, 2.500000e-02f);
  485. inter->addHorizontalSlider("RoomSize", &fslider1, 0.500000f, 0.000000f, 1.000000f, 2.500000e-02f);
  486. inter->addHorizontalSlider("Wet", &fslider0, 0.333300f, 0.000000f, 1.000000f, 2.500000e-02f);
  487. inter->closeBox();
  488. }
  489. virtual void compute (int count, float** input, float** output)
  490. {
  491. float* input0;
  492. input0 = input[0];
  493. float* input1;
  494. input1 = input[1];
  495. float* output0;
  496. output0 = output[0];
  497. float* output1;
  498. output1 = output[1];
  499. float ftemp0 = fslider0;
  500. float ftemp1 = (1 - ftemp0);
  501. float ftemp5 = (0.700000f + (0.280000f * fslider1));
  502. float ftemp6 = (0.400000f * fslider2);
  503. float ftemp7 = (1 - ftemp6);
  504. for (int i = 0; i < count; i++) {
  505. float ftemp2 = input0[i];
  506. if (++iota0 == 225)
  507. iota0 = 0;
  508. float T0 = dline0[iota0];
  509. if (++iota1 == 341)
  510. iota1 = 0;
  511. float T1 = dline1[iota1];
  512. if (++iota2 == 441)
  513. iota2 = 0;
  514. float T2 = dline2[iota2];
  515. if (++iota3 == 556)
  516. iota3 = 0;
  517. float T3 = dline3[iota3];
  518. if (++iota4 == 1617)
  519. iota4 = 0;
  520. float T4 = dline4[iota4];
  521. float ftemp3 = input1[i];
  522. float ftemp4 = (1.500000e-02f * (ftemp2 + ftemp3));
  523. R5_0 = ((ftemp7 * R4_0) + (ftemp6 * R5_0));
  524. dline4[iota4] = (ftemp4 + (ftemp5 * R5_0));
  525. R4_0 = T4;
  526. if (++iota5 == 1557)
  527. iota5 = 0;
  528. float T5 = dline5[iota5];
  529. R7_0 = ((ftemp7 * R6_0) + (ftemp6 * R7_0));
  530. dline5[iota5] = (ftemp4 + (ftemp5 * R7_0));
  531. R6_0 = T5;
  532. if (++iota6 == 1491)
  533. iota6 = 0;
  534. float T6 = dline6[iota6];
  535. R9_0 = ((ftemp7 * R8_0) + (ftemp6 * R9_0));
  536. dline6[iota6] = (ftemp4 + (ftemp5 * R9_0));
  537. R8_0 = T6;
  538. if (++iota7 == 1422)
  539. iota7 = 0;
  540. float T7 = dline7[iota7];
  541. R11_0 = ((ftemp7 * R10_0) + (ftemp6 * R11_0));
  542. dline7[iota7] = (ftemp4 + (ftemp5 * R11_0));
  543. R10_0 = T7;
  544. if (++iota8 == 1277)
  545. iota8 = 0;
  546. float T8 = dline8[iota8];
  547. R13_0 = ((ftemp7 * R12_0) + (ftemp6 * R13_0));
  548. dline8[iota8] = (ftemp4 + (ftemp5 * R13_0));
  549. R12_0 = T8;
  550. if (++iota9 == 1116)
  551. iota9 = 0;
  552. float T9 = dline9[iota9];
  553. R15_0 = ((ftemp7 * R14_0) + (ftemp6 * R15_0));
  554. dline9[iota9] = (ftemp4 + (ftemp5 * R15_0));
  555. R14_0 = T9;
  556. if (++iota10 == 1188)
  557. iota10 = 0;
  558. float T10 = dline10[iota10];
  559. R17_0 = ((ftemp7 * R16_0) + (ftemp6 * R17_0));
  560. dline10[iota10] = (ftemp4 + (ftemp5 * R17_0));
  561. R16_0 = T10;
  562. if (++iota11 == 1356)
  563. iota11 = 0;
  564. float T11 = dline11[iota11];
  565. R19_0 = ((ftemp7 * R18_0) + (ftemp6 * R19_0));
  566. dline11[iota11] = (ftemp4 + (ftemp5 * R19_0));
  567. R18_0 = T11;
  568. float ftemp8 = (R16_0 + R18_0);
  569. dline3[iota3] = ((((0.500000f * R3_0) + R4_0) + (R6_0 + R8_0)) + ((R10_0 + R12_0) + (R14_0 + ftemp8)));
  570. float R3temp0 = T3;
  571. float R3temp1 = (R3_0 - (((R4_0 + R6_0) + (R8_0 + R10_0)) + ((R12_0 + R14_0) + ftemp8)));
  572. R3_0 = R3temp0;
  573. R3_1 = R3temp1;
  574. dline2[iota2] = ((0.500000f * R2_0) + R3_1);
  575. float R2temp0 = T2;
  576. float R2temp1 = (R2_0 - R3_1);
  577. R2_0 = R2temp0;
  578. R2_1 = R2temp1;
  579. dline1[iota1] = ((0.500000f * R1_0) + R2_1);
  580. float R1temp0 = T1;
  581. float R1temp1 = (R1_0 - R2_1);
  582. R1_0 = R1temp0;
  583. R1_1 = R1temp1;
  584. dline0[iota0] = ((0.500000f * R0_0) + R1_1);
  585. float R0temp0 = T0;
  586. float R0temp1 = (R0_0 - R1_1);
  587. R0_0 = R0temp0;
  588. R0_1 = R0temp1;
  589. output0[i] = ((ftemp1 * ftemp2) + (ftemp0 * R0_1));
  590. if (++iota12 == 248)
  591. iota12 = 0;
  592. float T12 = dline12[iota12];
  593. if (++iota13 == 364)
  594. iota13 = 0;
  595. float T13 = dline13[iota13];
  596. if (++iota14 == 464)
  597. iota14 = 0;
  598. float T14 = dline14[iota14];
  599. if (++iota15 == 579)
  600. iota15 = 0;
  601. float T15 = dline15[iota15];
  602. if (++iota16 == 1640)
  603. iota16 = 0;
  604. float T16 = dline16[iota16];
  605. R25_0 = ((ftemp7 * R24_0) + (ftemp6 * R25_0));
  606. dline16[iota16] = (ftemp4 + (ftemp5 * R25_0));
  607. R24_0 = T16;
  608. if (++iota17 == 1580)
  609. iota17 = 0;
  610. float T17 = dline17[iota17];
  611. R27_0 = ((ftemp7 * R26_0) + (ftemp6 * R27_0));
  612. dline17[iota17] = (ftemp4 + (ftemp5 * R27_0));
  613. R26_0 = T17;
  614. if (++iota18 == 1514)
  615. iota18 = 0;
  616. float T18 = dline18[iota18];
  617. R29_0 = ((ftemp7 * R28_0) + (ftemp6 * R29_0));
  618. dline18[iota18] = (ftemp4 + (ftemp5 * R29_0));
  619. R28_0 = T18;
  620. if (++iota19 == 1445)
  621. iota19 = 0;
  622. float T19 = dline19[iota19];
  623. R31_0 = ((ftemp7 * R30_0) + (ftemp6 * R31_0));
  624. dline19[iota19] = (ftemp4 + (ftemp5 * R31_0));
  625. R30_0 = T19;
  626. if (++iota20 == 1300)
  627. iota20 = 0;
  628. float T20 = dline20[iota20];
  629. R33_0 = ((ftemp7 * R32_0) + (ftemp6 * R33_0));
  630. dline20[iota20] = (ftemp4 + (ftemp5 * R33_0));
  631. R32_0 = T20;
  632. if (++iota21 == 1139)
  633. iota21 = 0;
  634. float T21 = dline21[iota21];
  635. R35_0 = ((ftemp7 * R34_0) + (ftemp6 * R35_0));
  636. dline21[iota21] = (ftemp4 + (ftemp5 * R35_0));
  637. R34_0 = T21;
  638. if (++iota22 == 1211)
  639. iota22 = 0;
  640. float T22 = dline22[iota22];
  641. R37_0 = ((ftemp7 * R36_0) + (ftemp6 * R37_0));
  642. dline22[iota22] = (ftemp4 + (ftemp5 * R37_0));
  643. R36_0 = T22;
  644. if (++iota23 == 1379)
  645. iota23 = 0;
  646. float T23 = dline23[iota23];
  647. R39_0 = ((ftemp7 * R38_0) + (ftemp6 * R39_0));
  648. dline23[iota23] = (ftemp4 + (ftemp5 * R39_0));
  649. R38_0 = T23;
  650. float ftemp9 = (R36_0 + R38_0);
  651. dline15[iota15] = ((((0.500000f * R23_0) + R24_0) + (R26_0 + R28_0)) + ((R30_0 + R32_0) + (R34_0 + ftemp9)));
  652. float R23temp0 = T15;
  653. float R23temp1 = (R23_0 - (((R24_0 + R26_0) + (R28_0 + R30_0)) + ((R32_0 + R34_0) + ftemp9)));
  654. R23_0 = R23temp0;
  655. R23_1 = R23temp1;
  656. dline14[iota14] = ((0.500000f * R22_0) + R23_1);
  657. float R22temp0 = T14;
  658. float R22temp1 = (R22_0 - R23_1);
  659. R22_0 = R22temp0;
  660. R22_1 = R22temp1;
  661. dline13[iota13] = ((0.500000f * R21_0) + R22_1);
  662. float R21temp0 = T13;
  663. float R21temp1 = (R21_0 - R22_1);
  664. R21_0 = R21temp0;
  665. R21_1 = R21temp1;
  666. dline12[iota12] = ((0.500000f * R20_0) + R21_1);
  667. float R20temp0 = T12;
  668. float R20temp1 = (R20_0 - R21_1);
  669. R20_0 = R20temp0;
  670. R20_1 = R20temp1;
  671. output1[i] = ((ftemp1 * ftemp3) + (ftemp0 * R20_1));
  672. }
  673. }
  674. };
  675. mydsp DSP;
  676. /******************************************************************************
  677. *******************************************************************************
  678. JACK AUDIO INTERFACE
  679. *******************************************************************************
  680. *******************************************************************************/
  681. //----------------------------------------------------------------------------
  682. // number of input and output channels
  683. //----------------------------------------------------------------------------
  684. int gNumInChans;
  685. int gNumOutChans;
  686. //----------------------------------------------------------------------------
  687. // Jack ports
  688. //----------------------------------------------------------------------------
  689. jack_port_t *input_ports[256];
  690. jack_port_t *output_ports[256];
  691. //----------------------------------------------------------------------------
  692. // tables of noninterleaved input and output channels for FAUST
  693. //----------------------------------------------------------------------------
  694. float* gInChannel[256];
  695. float* gOutChannel[256];
  696. //----------------------------------------------------------------------------
  697. // Jack Callbacks
  698. //----------------------------------------------------------------------------
  699. int srate(jack_nframes_t nframes, void *arg)
  700. {
  701. printf("the sample rate is now %u/sec\n", nframes);
  702. return 0;
  703. }
  704. void jack_shutdown(void *arg)
  705. {
  706. exit(1);
  707. }
  708. int process (jack_nframes_t nframes, void *arg)
  709. {
  710. int i;
  711. for (i = 0; i < gNumInChans; i++) {
  712. gInChannel[i] = (float *)jack_port_get_buffer(input_ports[i], nframes);
  713. }
  714. for (i = 0; i < gNumOutChans; i++) {
  715. gOutChannel[i] = (float *)jack_port_get_buffer(output_ports[i], nframes);
  716. }
  717. DSP.compute(nframes, gInChannel, gOutChannel);
  718. return 0;
  719. }
  720. //-------------------------------------------------------------------------
  721. // MAIN
  722. //-------------------------------------------------------------------------
  723. int main(int argc, char *argv[] )
  724. {
  725. char jackname[256];
  726. char** physicalInPorts;
  727. char** physicalOutPorts;
  728. jack_client_t* client;
  729. int i;
  730. CMDUI* inter = new CMDUI(argc, argv);
  731. DSP.buildUserInterface(inter);
  732. //_snprintf(jackname, 255, "%s", basename(argv[0]));
  733. _snprintf(jackname, 255, "%s", "freeverb");
  734. if ((client = jack_client_new(jackname)) == 0) {
  735. fprintf(stderr, "jack server not running?\n");
  736. return 1;
  737. }
  738. jack_set_process_callback(client, process, 0);
  739. jack_set_sample_rate_callback(client, srate, 0);
  740. jack_on_shutdown(client, jack_shutdown, 0);
  741. gNumInChans = DSP.getNumInputs();
  742. gNumOutChans = DSP.getNumOutputs();
  743. for (i = 0; i < gNumInChans; i++) {
  744. char buf[256];
  745. _snprintf(buf, 256, "in_%d", i);
  746. input_ports[i] = jack_port_register(client, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  747. }
  748. for (i = 0; i < gNumOutChans; i++) {
  749. char buf[256];
  750. _snprintf(buf, 256, "out_%d", i);
  751. output_ports[i] = jack_port_register(client, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  752. }
  753. DSP.init(jack_get_sample_rate(client));
  754. DSP.buildUserInterface(inter);
  755. inter->process_command();
  756. physicalInPorts = (char **)jack_get_ports(client, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
  757. physicalOutPorts = (char **)jack_get_ports(client, NULL, NULL, JackPortIsPhysical | JackPortIsOutput);
  758. if (jack_activate(client)) {
  759. fprintf(stderr, "cannot activate client");
  760. return 1;
  761. }
  762. /*
  763. if (physicalOutPorts != NULL) {
  764. for (int i = 0; i < gNumInChans && physicalOutPorts[i]; i++) {
  765. jack_connect(client, physicalOutPorts[i], jack_port_name(input_ports[i]));
  766. }
  767. }
  768. */
  769. if (physicalInPorts != NULL) {
  770. for (int i = 0; i < gNumOutChans && physicalInPorts[i]; i++) {
  771. jack_connect(client, jack_port_name(output_ports[i]), physicalInPorts[i]);
  772. }
  773. }
  774. /*
  775. jack_connect(client, "AudioPlayer:out1", jack_port_name(input_ports[0]));
  776. jack_connect(client, "AudioPlayer:out1", jack_port_name(input_ports[1]));
  777. jack_connect(client, "AudioPlayer:out2", jack_port_name(input_ports[0]));
  778. jack_connect(client, "AudioPlayer:out2", jack_port_name(input_ports[1]));
  779. */
  780. jack_connect(client, "JackRouter:out1", jack_port_name(input_ports[0]));
  781. jack_connect(client, "JackRouter:out2", jack_port_name(input_ports[1]));
  782. inter->run();
  783. jack_deactivate(client);
  784. for (i = 0; i < gNumInChans; i++) {
  785. jack_port_unregister(client, input_ports[i]);
  786. }
  787. for (i = 0; i < gNumOutChans; i++) {
  788. jack_port_unregister(client, output_ports[i]);
  789. }
  790. jack_client_close(client);
  791. return 0;
  792. }