package com.synthbot.audioio.vst;

import com.javadaw.gui.javaMain;
import com.javadaw.plugins.*;

import com.synthbot.minihost.loadVST;

public class runVST implements Runnable {
  private javaMain parent;
  private loadVST lv;
  private runFX runfx;
  private javaVST jvst;
  private int track;

  private static final float SAMPLE_RATE = 44100f;
  private static final int BLOCK_SIZE = 1024;
  private static final String AUDIO_THREAD = "VST Thread";


  public runVST(javaMain parent, int track) {
    
      this.track   = track;
      this.parent  = parent;
      this.parent.threadAlive[track] = true;
      
      try { Thread.sleep(200); } catch(Throwable t) {}
      
      Thread thread = new Thread(this);
      thread.setPriority(Thread.MIN_PRIORITY);
      thread.setName(AUDIO_THREAD+" "+track); // for easy debugging
      thread.setDaemon(true); // allows the JVM to exit normally
      thread.start();
  }
  public void run() {
      
    //parent.messagepanel.textField.setText("start VST Thread "+track);

    while(parent.threadAlive[track]) {
        
        synchronized(this) {
            try {

                 wait();
                
                 //try { Thread.sleep(1); } catch(Throwable t) {}
                
                 if (!parent.isnative[parent.vstplugintochannel[track]]) {
                     if (parent.pluginisloaded[track]) lv = parent.pluginMap.get(String.valueOf(parent.vstplugintochannel[track]));
                     if (parent.pluginisloaded[track]) lv.vst.processReplacing(parent.ffOutputs[track], parent.ffOutputs[track], parent.bufferSize);
                 } else { if (parent.pluginisloaded[track]) jvst = parent.jvstMap.get(String.valueOf(parent.vstplugintochannel[track]));
                          if (parent.pluginisloaded[track]) jvst.processReplacing(parent.ffOutputs[track], parent.ffOutputs[track], parent.bufferSize);
                 }        
                 if (parent.fxpluginisloaded[track][0]) { 
                     runfx = parent.fxMap.get(String.valueOf(track) + "0");
                     synchronized(runfx) { runfx.notify();
                     }
                 }
            } catch(Throwable t) { System.out.println("run vstmap on channel " + track + " " + t);
            }
          }
    }
    parent.threadAlive[track] = false;
    
    //parent.messagepanel.textField.setText("stop vst thread " + track);

  }
}

