home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / ZynAddFX / Setup_ZynAddSubFX-2.1.1.exe / main.C < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-30  |  15.8 KB  |  681 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   main.c  -  Main file of the synthesizer
  5.   Copyright (C) 2002-2004 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <math.h>
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <time.h>
  27.  
  28. #include <unistd.h>
  29. #include <pthread.h>
  30.  
  31. #ifdef OS_LINUX
  32. #include <getopt.h>
  33. #elif OS_WINDOIWS
  34. #include <winbase.h>
  35. #include <windows.h>
  36. #endif
  37.  
  38. #include "Misc/Master.h"
  39. #include "Misc/Util.h"
  40. #include "Misc/Dump.h"
  41. extern Dump dump;
  42.  
  43. #ifdef ALSAMIDIIN
  44. #include "Input/ALSAMidiIn.h"
  45. #endif
  46.  
  47. #ifdef OSSMIDIIN
  48. #include "Input/OSSMidiIn.h"
  49. #endif
  50.  
  51. #if (defined(NONEMIDIIN)||defined(VSTMIDIIN))
  52. #include "Input/NULLMidiIn.h"
  53. #endif
  54.  
  55. #ifdef WINMIDIIN
  56. #include "Input/WINMidiIn.h"
  57. #endif
  58.  
  59.  
  60. #include "UI/MasterUI.h"
  61.  
  62. MasterUI *ui;
  63. pthread_t thr1,thr2,thr3,thr4;
  64. Master *master;
  65. int swaplr=0;//1 for left-right swapping
  66. bool usejackit=false;
  67.  
  68. #ifdef JACKAUDIOOUT
  69. #include "Output/JACKaudiooutput.h"
  70. #endif
  71.  
  72. #ifdef JACK_RTAUDIOOUT
  73. #include "Output/JACKaudiooutput.h"
  74. #endif
  75.  
  76. #ifdef PAAUDIOOUT
  77. #include "Output/PAaudiooutput.h"
  78. #endif
  79.  
  80. #ifdef OSSAUDIOOUT
  81. #include "Output/OSSaudiooutput.h"
  82. OSSaudiooutput *audioout;
  83. #endif
  84.  
  85. MidiIn *Midi;
  86. int Pexitprogram=0;//if the UI set this to 1, the program will exit
  87.  
  88. /*
  89.  * Try to get the realtime priority
  90.  */
  91. void set_realtime(){
  92. #ifdef OS_LINUX
  93.     sched_param sc;
  94.     
  95.     sc.sched_priority=50;
  96.     sched_setscheduler(0,SCHED_FIFO,&sc);
  97. //    if (err==0) printf("Real-time");
  98. #endif
  99. };
  100.  
  101. /*
  102.  * Midi input thread
  103.  */
  104. #if !(defined(WINMIDIIN)||defined(VSTMIDIIN))
  105. void *thread1(void *arg){
  106.     MidiCmdType cmdtype;
  107.     unsigned char cmdchan,note,vel;
  108.     int cmdparams[MP_MAX_BYTES];
  109.  
  110.     set_realtime();
  111.     while (Pexitprogram==0){
  112.     Midi->getmidicmd(cmdtype,cmdchan,cmdparams);
  113.         note=cmdparams[0];
  114.     vel=cmdparams[1];
  115.     
  116.     pthread_mutex_lock(&master->mutex);
  117.  
  118.     if (cmdtype==MidiNoteON) master->NoteOn(cmdchan,note,vel);
  119.     if (cmdtype==MidiNoteOFF) master->NoteOff(cmdchan,note);
  120.     if (cmdtype==MidiController) master->SetController(cmdchan,cmdparams[0],cmdparams[1]);
  121.  
  122.     pthread_mutex_unlock(&master->mutex);
  123.     };
  124.     
  125.     return(0);
  126. };
  127. #endif
  128.  
  129. /*
  130.  * Wave output thread (for OSS AUDIO out)
  131.  */
  132. #if defined(OSSAUDIOOUT)
  133. //!(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT))
  134.  
  135. void *thread2(void *arg){
  136.     REALTYPE outputl[SOUND_BUFFER_SIZE];
  137.     REALTYPE outputr[SOUND_BUFFER_SIZE];
  138.  
  139.     set_realtime();
  140.     while (Pexitprogram==0){
  141.     pthread_mutex_lock(&master->mutex);
  142.     master->AudioOut(outputl,outputr);
  143.     pthread_mutex_unlock(&master->mutex);
  144.  
  145. #ifndef NONEAUDIOOUT
  146.     audioout->OSSout(outputl,outputr);
  147. #endif
  148.  
  149. /** /      int i,x,x2;
  150.     REALTYPE xx,xx2;
  151.  
  152.         short int xsmps[SOUND_BUFFER_SIZE*2];    
  153.     for (i=0;i<SOUND_BUFFER_SIZE;i++){//output to stdout
  154.         xx=-outputl[i]*32767;
  155.         xx2=-outputr[i]*32767;
  156.         if (xx<-32768) xx=-32768;
  157.         if (xx>32767) xx=32767;
  158.         if (xx2<-32768) xx2=-32768;
  159.         if (xx2>32767) xx2=32767;
  160.         x=(short int) xx;
  161.         x2=(short int) xx2;
  162.         xsmps[i*2]=x;xsmps[i*2+1]=x2;
  163.         };
  164.         write(1,&xsmps,SOUND_BUFFER_SIZE*2*2);
  165.         
  166.         / * */
  167.     }; 
  168.     return(0);
  169. };
  170. #endif
  171.  
  172. /*
  173.  * User Interface thread
  174.  */
  175.  
  176.  
  177. void *thread3(void *arg){
  178.     ui->showUI();
  179.     while (Pexitprogram==0) Fl::wait();
  180.     return(0);
  181. };
  182.  
  183. /*
  184.  * Sequencer thread (test)
  185.  */
  186. void *thread4(void *arg){
  187.     while (Pexitprogram==0){
  188.     int type,par1,par2,again,midichan;
  189.     for (int ntrack=0;ntrack<NUM_MIDI_TRACKS;ntrack++){
  190.         if (master->seq.play==0) break;
  191.         do{
  192.         again=master->seq.getevent(ntrack,&midichan,&type,&par1,&par2);
  193. //        printf("ntrack=%d again=%d\n",ntrack,again);
  194.         if (type>0) {
  195. //        printf("%d %d  %d %d %d\n",type,midichan,chan,par1,par2);
  196.  
  197. //    if (cmdtype==MidiController) master->SetController(cmdchan,cmdparams[0],cmdparams[1]);
  198.  
  199.     
  200.     
  201.             pthread_mutex_lock(&master->mutex);
  202.                 if (type==1){//note_on or note_off
  203.             if (par2!=0) master->NoteOn(midichan,par1,par2);
  204.                 else master->NoteOff(midichan,par1);
  205.                 };
  206.             pthread_mutex_unlock(&master->mutex);
  207.         };
  208.         } while (again>0);
  209.         
  210.     };
  211. //if (!realtime player) atunci fac asta
  212. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  213. #ifdef OS_LINUX
  214.     usleep(1000);
  215. #elif OS_WINDOWS
  216.     Sleep(1);
  217. #endif
  218.     };
  219.     
  220.     return(0);
  221. };
  222.  
  223. /*
  224.  * Program initialisation
  225.  */
  226.  
  227.  
  228. void initprogram(){
  229. #ifndef JACKAUDIOOUT
  230. #ifndef JACK_RTAUDIOOUT
  231.     fprintf(stderr,"\nSample Rate = \t\t%d\n",SAMPLE_RATE);
  232. #endif
  233. #endif
  234.     fprintf(stderr,"Sound Buffer Size = \t%d samples\n",SOUND_BUFFER_SIZE);
  235.     fprintf(stderr,"Internal latency = \t%.1f ms\n",SOUND_BUFFER_SIZE*1000.0/SAMPLE_RATE);
  236.     fprintf(stderr,"ADsynth Oscil.Size = \t%d samples\n",OSCIL_SIZE);
  237.  
  238.     fflush(stderr);
  239.     srand(time(NULL));
  240.     denormalkillbuf=new REALTYPE [SOUND_BUFFER_SIZE];
  241.     for (int i=0;i<SOUND_BUFFER_SIZE;i++) denormalkillbuf[i]=(RND-0.5)*1e-16;
  242.     
  243.     master=new Master();
  244.     master->swaplr=swaplr;
  245.  
  246. #if defined(JACKAUDIOOUT)
  247.     if (usejackit) {
  248.     bool tmp=JACKaudiooutputinit(master);
  249. #if defined(OSSAUDIOOUT)
  250.     if (!tmp) printf("\nUsing OSS instead.\n");
  251. #else
  252.     if (!tmp) exit(1);
  253. #endif
  254.     usejackit=tmp;
  255.     };
  256. #endif
  257. #if defined(OSSAUDIOOUT)
  258.     if (!usejackit) audioout=new OSSaudiooutput();
  259.     else audioout=NULL;
  260. #endif
  261.  
  262. #ifdef JACK_RTAUDIOOUT
  263.     JACKaudiooutputinit(master);
  264. #endif
  265. #ifdef PAAUDIOOUT
  266.     PAaudiooutputinit(master);
  267. #endif 
  268.  
  269. #ifdef ALSAMIDIIN
  270.     Midi=new ALSAMidiIn();
  271. #endif
  272. #ifdef OSSMIDIIN
  273.     Midi=new OSSMidiIn();
  274. #endif
  275. #if (defined(NONEMIDIIN)||(defined(VSTMIDIIN)))
  276.     Midi=new NULLMidiIn();
  277. #endif
  278.     ui=new MasterUI(master,&Pexitprogram);
  279. };
  280.  
  281. /*
  282.  * Program exit
  283.  */
  284. void exitprogram(){
  285.     pthread_mutex_lock(&master->mutex);
  286. #ifdef OSSAUDIOOUT
  287.     delete(audioout);
  288. #endif
  289. #ifdef JACKAUDIOOUT
  290.     if (usejackit) JACKfinish();
  291. #endif
  292. #ifdef JACK_RTAUDIOOUT
  293.     JACKfinish();
  294. #endif
  295. #ifdef PAAUDIOOUT
  296.     PAfinish();
  297. #endif
  298.  
  299.     delete(ui);
  300.     delete(Midi);
  301.     delete(master); 
  302.  
  303. //    pthread_mutex_unlock(&master->mutex);
  304.     delete(denormalkillbuf);
  305. };
  306.  
  307. #ifdef OS_WINDOWS
  308. #define ARGSIZE 100
  309.  char winoptarguments[ARGSIZE];
  310.  char getopt(int argc, char *argv[], const char *shortopts, int *index){
  311.     winoptarguments[0]=0;
  312.     char result=0;
  313.     
  314.     if (*index>=argc) return(-1);
  315.     
  316.     if (strlen(argv[*index])==2) 
  317.     if (argv[*index][0]=='-') {
  318.         result=argv[*index][1];
  319.         if (*index+1<argc) {
  320.         snprintf(winoptarguments,ARGSIZE,"%s",argv[*index+1]);
  321.         };
  322.     };
  323.     (*index)++;
  324.     return(result);
  325.  };
  326.  int opterr=0;
  327. #undef ARGSIZE
  328.  
  329. #endif
  330.  
  331. #ifndef VSTAUDIOOUT
  332. int main(int argc, char *argv[]){
  333.     int noui=0;
  334. #ifdef JACKAUDIOOUT
  335.     usejackit=true;//use jack by default
  336. #endif
  337.     fprintf(stderr,"%s","\nZynAddSubFX - Copyright (c) 2002-2004 Nasca Octavian Paul\n");
  338.     fprintf(stderr,"Compiled: %s %s\n",__DATE__,__TIME__);
  339.     fprintf(stderr,"%s","This program is free software (GNU GPL v.2) and \n    it comes with ABSOLUTELY NO WARRANTY.\n\n");
  340. #ifdef OS_LINUX
  341.     if (argc==1) fprintf(stderr,"%s","Try 'zynaddsubfx --help' for command-line options.\n");
  342. #else
  343.     if (argc==1) fprintf(stderr,"%s","Try 'zynaddsubfx -h' for command-line options.\n");
  344. #endif
  345.     /* Get the settings from the Config*/
  346.     SAMPLE_RATE=config.cfg.SampleRate;    
  347.     SOUND_BUFFER_SIZE=config.cfg.SoundBufferSize;
  348.     OSCIL_SIZE=config.cfg.OscilSize;
  349.     swaplr=config.cfg.SwapStereo;
  350.     
  351.     /* Parse command-line options */
  352. #ifdef OS_LINUX
  353.     struct option opts[]={
  354.     {"load",2,NULL,'l'},
  355.     {"sample-rate",2,NULL,'r'},
  356.     {"buffer-size",2,NULL,'b'},
  357.     {"oscil-size",2,NULL,'o'},
  358.     {"dump",2,NULL,'D'},
  359.     {"swap",2,NULL,'S'},
  360.     {"no-gui",2,NULL,'U'},
  361.     {"not-use-jack",2,NULL,'A'},
  362.     {"help",2,NULL,'h'},
  363.     {0,0,0,0}
  364.     };
  365. #endif
  366.     opterr=0;
  367.     int option_index=0,opt,exitwithhelp=0;
  368.     
  369.     char loadfile[1001];ZERO(loadfile,1001);
  370.     
  371.     while (1){
  372. #ifdef OS_LINUX
  373.     opt=getopt_long(argc,argv,"l:r:b:o:hSDUA",opts,&option_index);
  374.     char *optarguments=optarg;
  375. #else
  376.     opt=getopt(argc,argv,"l:r:b:o:hSDUA",&option_index);
  377.     char *optarguments=&winoptarguments[0];
  378. #endif 
  379.  
  380.     if (opt==-1) break;
  381.  
  382.     int tmp;
  383.     switch(opt){
  384.         case 'h':exitwithhelp=1;
  385.              break;
  386.         case 'U':noui=1;
  387.              break;
  388.         case 'A':
  389. #ifdef JACKAUDIOOUT
  390. #ifdef OSSAUDIOOUT
  391.              usejackit=false;
  392. #endif
  393. #endif
  394.              break;
  395.         case 'l':tmp=0;
  396.                  if (optarguments!=NULL) {
  397.                 snprintf(loadfile,1000,"%s",optarguments);
  398.              };
  399.              break;
  400.         case 'r':tmp=0;
  401.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  402.              if (tmp>=4000) {
  403.                 SAMPLE_RATE=tmp;
  404.              } else {
  405.                 fprintf(stderr,"ERROR:Incorrect sample rate  %s .\n",optarguments);
  406.             exit(1);
  407.              };
  408.              break;
  409.         case 'b':tmp=0;
  410.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  411.              if (tmp>=2) {
  412.                 SOUND_BUFFER_SIZE=tmp;
  413.              } else {
  414.                 fprintf(stderr,"ERROR:Incorrect buffer size  %s .\n",optarguments);
  415.             exit(1);
  416.              };
  417.              break;
  418.         case 'o':tmp=0;
  419.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  420.              OSCIL_SIZE=tmp;
  421.                 if (OSCIL_SIZE<MAX_AD_HARMONICS*2) OSCIL_SIZE=MAX_AD_HARMONICS*2;
  422.              OSCIL_SIZE=(int) pow(2,ceil(log (OSCIL_SIZE-1.0)/log(2.0)));
  423.              if (tmp!=OSCIL_SIZE) fprintf(stderr,"\nOSCIL_SIZE is wrong (must me 2^n) or too small. Adjusting to %d.\n",OSCIL_SIZE);
  424.              break;
  425.         case 'S':swaplr=1;
  426.              break;
  427.         case 'D':dump.startnow();
  428.              break;
  429.         case '?':fprintf(stderr,"%s","ERROR:Bad option or parameter.\n\n");
  430.                  exitwithhelp=1;
  431.              break;
  432.     };
  433.     };
  434.     
  435.     if (exitwithhelp!=0) {
  436.     fprintf(stderr,"%s","Usage: zynaddsubfx [OPTION]\n\n");
  437.     fprintf(stderr,"%s","  -h , --help \t\t\t\t display command-line help and exit\n");
  438.     fprintf(stderr,"%s","  -l file, --load=FILE\t\t\t loads a .xmz file\n");
  439.     fprintf(stderr,"%s","  -r SR, --sample-rate=SR\t\t set the sample rate SR\n");
  440.     fprintf(stderr,"%s","  -b BS, --buffer-size=SR\t\t set the buffer size (granularity)\n");
  441.     fprintf(stderr,"%s","  -o OS, --oscil-size=OS\t\t set the ADsynth oscil. size\n");
  442.     fprintf(stderr,"%s","  -S , --swap\t\t\t\t swap Left <--> Right\n");
  443.     fprintf(stderr,"%s","  -D , --dump\t\t\t\t Dumps midi note ON/OFF commands\n");
  444.     fprintf(stderr,"%s","  -U , --no-gui\t\t\t\t Run ZynAddSubFX without user interface\n");
  445. #ifdef JACKAUDIOOUT
  446.     fprintf(stderr,"%s","  -A , --not-use-jack\t\t\t Use OSS/ALSA instead of JACK\n");
  447. #endif
  448. #ifdef OS_WINDOWS
  449.     fprintf(stderr,"%s","\nWARNING: On Windows systems, only short comandline parameters works.\n");
  450.     fprintf(stderr,"%s","  eg. instead '--buffer-size=512' use '-b 512'\n");
  451. #endif
  452.     fprintf(stderr,"%s","\n\n");
  453.     return(0);
  454.     };
  455.     
  456.     //---------
  457.     
  458.     initprogram();
  459.  
  460.     if (strlen(loadfile)>1){
  461.         int tmp=master->loadXML(loadfile);
  462.     if (tmp<0) {
  463.         fprintf(stderr,"ERROR:Could not load file  %s .\n",loadfile);
  464.         exit(1);
  465.     };
  466.     };
  467.  
  468. #if !(defined(NONEMIDIIN)||defined(WINMIDIIN)||defined(VSTMIDIIN))
  469.     pthread_create(&thr1,NULL,thread1,NULL);
  470. #endif
  471.  
  472. #ifdef OSSAUDIOOUT
  473. //!(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT))
  474.     if (!usejackit) pthread_create(&thr2,NULL,thread2,NULL);
  475. #endif
  476.  
  477. /*It is not working and I don't know why
  478. //drop the suid-root permisions
  479. #if !(defined(JACKAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)|| (defined (WINMIDIIN)) )
  480.       setuid(getuid());
  481.       seteuid(getuid());
  482. //      setreuid(getuid(),getuid());
  483. //      setregid(getuid(),getuid());
  484. #endif
  485. */
  486.     if (noui==0) pthread_create(&thr3,NULL,thread3,NULL);
  487.  
  488.     pthread_create(&thr4,NULL,thread4,NULL);
  489. #ifdef WINMIDIIN
  490.     InitWinMidi(master);
  491. #endif
  492.  
  493.     while (Pexitprogram==0){ 
  494. #ifdef OS_LINUX
  495.     usleep(100000);
  496. #elif OS_WINDOWS
  497.     Sleep(100);
  498. #endif
  499.     };    
  500.     
  501. #ifdef WINMIDIIN
  502.     StopWinMidi();
  503. #endif
  504.  
  505.     exitprogram();
  506.     return(0);
  507. };
  508.  
  509.  
  510. #else 
  511.  
  512. #include "Output/VSTaudiooutput.h"
  513.  
  514. #define main main_plugin
  515. extern "C" __declspec(dllexport) AEffect *main_plugin(audioMasterCallback audioMaster);
  516.  
  517. int instances=-1;
  518.  
  519. AEffect *main (audioMasterCallback audioMaster){
  520. //    if (audioMaster(0,audioMasterVersion,0,0,0,0)!=0) {
  521. //    return(0);
  522. //    };
  523.  
  524.     if (instances==-1){
  525.     Midi=new NULLMidiIn();
  526.     denormalkillbuf=new REALTYPE [SOUND_BUFFER_SIZE];
  527.     for (int i=0;i<SOUND_BUFFER_SIZE;i++) denormalkillbuf[i]=(RND-0.5)*1e-16;
  528.     instances=0;
  529.     };
  530.  
  531.     if (instances!=0) return(0);//don't allow multiple instances
  532.  
  533.     AudioEffect *sintetizator=new VSTSynth(audioMaster);
  534.  
  535.     return sintetizator->getAeffect();
  536. };
  537.  
  538. void* hInstance;
  539. BOOL WINAPI DllMain (HINSTANCE hInst,DWORD dwReason,LPVOID lpvReserved){
  540.     hInstance=hInst;
  541.     return(1);
  542. };
  543.  
  544. void *thread(void *arg){
  545.     VSTSynth *vs=(VSTSynth *) arg;
  546.  
  547. /*    FILE *a=fopen("aaaa1","a");
  548.     fprintf(a,"%lx %lx %lx -i=%d\n",vs,0,vs->vmaster,instances);
  549.     fflush(a);fclose(a);
  550. */
  551.  
  552.     vs->ui=new MasterUI(vs->vmaster,&vs->Pexitprogram);
  553.  
  554. /*    a=fopen("aaaa1","a");
  555.     fprintf(a,"%lx %lx %lx\n",vs,vs->ui->master,vs->vmaster);
  556.     fflush(a);fclose(a);
  557. */
  558.  
  559.     vs->ui->showUI();
  560.  
  561. /*    a=fopen("aaaa1","a");
  562.     fprintf(a,"%lx %lx %lx\n",vs,vs->ui,vs->vmaster);
  563.     fflush(a);fclose(a);
  564. */
  565.  
  566.     while (vs->Pexitprogram==0) Fl::wait(0.01);
  567.  
  568.     delete(vs->ui);
  569.     Fl::wait(0.01);
  570.  
  571. /*    a=fopen("aaaa1","a");
  572.     fprintf(a,"EXIT\n");
  573.     fflush(a);fclose(a);
  574. */
  575.  
  576.     
  577.     pthread_exit(0);
  578.     return(0);
  579. };
  580.  
  581. //Parts of the VSTSynth class
  582. VSTSynth::VSTSynth (audioMasterCallback audioMaster):AudioEffectX(audioMaster,1,0){
  583.     instances++;
  584.  
  585.   if (audioMaster){
  586.     setNumInputs(0);
  587.     setNumOutputs(2);
  588.     setUniqueID('ZASF');
  589.     canProcessReplacing();
  590. //    hasVu(false);
  591. //    hasClip(false);
  592.  
  593.     isSynth(true);
  594.  
  595.     programsAreChunks(true);
  596.     
  597.   };
  598.  
  599.  
  600.     SAMPLE_RATE=config.cfg.SampleRate;    
  601.     SOUND_BUFFER_SIZE=config.cfg.SoundBufferSize;
  602.     OSCIL_SIZE=config.cfg.OscilSize;
  603.     swaplr=config.cfg.SwapStereo;
  604.     this->Pexitprogram=0;
  605.     
  606.     this->vmaster=new Master();
  607.     this->vmaster->swaplr=swaplr;
  608.     
  609.  
  610. //    FILE *a=fopen("aaaa0","a");
  611. //    fprintf(a,"%lx %lx %lx\n",this,this->ui,this->ui->masterwindow);
  612. //    fflush(a);fclose(a);
  613.  
  614.     pthread_create(&this->thr,NULL,thread,this);
  615.  
  616. //    suspend();
  617.  
  618. };
  619.  
  620.  
  621.  
  622. VSTSynth::~VSTSynth(){
  623.     this->Pexitprogram=1;
  624.     
  625.     Sleep(200);//wait the thread to finish
  626.     
  627. //    pthread_mutex_lock(&vmaster->mutex);
  628.  
  629.  
  630.     delete(this->vmaster); 
  631.  
  632.     instances--;
  633. };
  634.  
  635. long VSTSynth::processEvents(VstEvents *events){
  636.     for (int i=0;i<events->numEvents;i++){
  637.  
  638.       //debug stuff
  639. //      FILE *a=fopen("events","a");
  640. //      fprintf(a,"%lx\n",events->events[i]->type);
  641. //      fflush(a);fclose(a);
  642.  
  643.     if ((events->events[i])->type != kVstMidiType) continue;
  644.     VstMidiEvent *ev= (VstMidiEvent*) events->events[i];
  645.     unsigned char *data= (unsigned char *)ev->midiData;
  646.     int status=data[0]/16;
  647.     int cmdchan=data[0]&0x0f;
  648.     int cntl;    
  649.  
  650.     pthread_mutex_lock(&vmaster->mutex);
  651.     switch(status){
  652.         case 0x8:vmaster->NoteOff(cmdchan,data[1]&0x7f);
  653.          break;
  654.         case 0x9:if (data[2]==0) vmaster->NoteOff(cmdchan,data[1]&0x7f);
  655.               else vmaster->NoteOn(cmdchan,data[1]&0x7f,data[2]&0x7f);
  656.          break;
  657.         case 0xB: cntl=Midi->getcontroller(data[1]&0x7f);
  658.               vmaster->SetController(cmdchan,cntl,data[2]&0x7f);
  659.          break;
  660.         case 0xE: vmaster->SetController(cmdchan,C_pitchwheel,data[1]+data[2]*(long int) 128-8192);
  661.          break;
  662.     };
  663.     pthread_mutex_unlock(&vmaster->mutex);
  664.     
  665.     };
  666.  
  667. return(1);
  668. };
  669.  
  670. long VSTSynth::getChunk(void** data){
  671.     int size=0;
  672.     size=vmaster->getalldata((char **)data);
  673.     return(size);
  674. };
  675.  
  676. void VSTSynth::setChunk(void *data,long size){
  677.     vmaster->putalldata((char*)data,size);
  678. };
  679. #endif
  680.  
  681.