/*
*
      
_______
                       
_____
   
_____ _____
  

*
     
|__
   
__|
                     
|
  
__ \ / ____|__ \
 

*
        
| | __ _ _ __ ___
  
______| || | (___ | |__) |
*
        
| |/ _` | '__/ __|/ _ \/ __| |
  
| |\___ \|___/
 

*
        
| | (_| | |
  
\__ \ (_) \__ \ |__| |____) | |
     

*
        
|_|\__,_|_|
  
|___/\___/|___/_____/|_____/|_|
     

*
                                                         

* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*
  

* -------------------------------------------------------------
*
*
  
Info: http://0110.be/tag/TarsosDSP
*
  
Github: https://github.com/JorenSix/TarsosDSP
*
  
Releases: http://0110.be/releases/TarsosDSP/
*
  

*
  
TarsosDSP includes modified source code by various authors,
*
  
for credits and info, see README.
*
 

*/


package be.tarsos.dsp.example;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioEvent;
import be.tarsos.dsp.Oscilloscope;
import be.tarsos.dsp.Oscilloscope.OscilloscopeEventHandler;
import be.tarsos.dsp.io.jvm.JVMAudioInputStream;

public class OscilloscopeExample extends JFrame implements OscilloscopeEventHandler {

	
/**
	 
*
 

	 
*/
	
private static final long serialVersionUID = 3501426880288136245L;
	
int counter;
	
double threshold;
	
AudioDispatcher dispatcher;
	
Mixer currentMixer;
	
private final GaphPanel panel;
	

	
public OscilloscopeExample() {
		
this.setLayout(new BorderLayout());
		
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
this.setTitle("Osciloscope Example");
		

		
JPanel inputPanel = new InputPanel();
		
//add(inputPanel);
		
inputPanel.addPropertyChangeListener("mixer",
				
new PropertyChangeListener() {
					
@Override
					
public void propertyChange(PropertyChangeEvent arg0) {
						
try {
							
setNewMixer((Mixer) arg0.getNewValue());
						
} catch (LineUnavailableException e) {
							
// TODO Auto-generated catch block
							
e.printStackTrace();
						
} catch (UnsupportedAudioFileException e) {
							
// TODO Auto-generated catch block
							
e.printStackTrace();
						
}
					
}
				
});
		

				

		
panel = new GaphPanel();
		
this.add(inputPanel,BorderLayout.NORTH);
		
this.add(panel,BorderLayout.CENTER);
	
}
	

	
private static class GaphPanel extends JPanel{

		
/**
		 
*
 

		 
*/
		
private static final long serialVersionUID = 4969781241442094359L;
		

		
float data[];
		

		
public GaphPanel(){
			
setMinimumSize(new Dimension(80,60));
		
}
		

		
public void paintComponent(Graphics g) {
	        
super.paintComponent(g); //paint background
	        
g.setColor(Color.BLACK);
			
g.fillRect(0, 0,getWidth(), getHeight());
			
g.setColor(Color.WHITE);
			
if(data != null){
				
float width = getWidth();
				
float height = getHeight();
				
float halfHeight = height / 2;
				
for(int i=0; i < data.length ; i+=4){
					 
g.drawLine((int)(data[i]* width),(int)( halfHeight - data[i+1]* height),(int)( data[i+2]*width),(int)( halfHeight - data[i+3]*height));
				
}
			
}
	    
}
		

		
public void paint(float[] data, AudioEvent event){
			
this.data = data;
		
}
	
}
	

	


	
private void setNewMixer(Mixer mixer) throws LineUnavailableException,
			
UnsupportedAudioFileException {
		

		
if(dispatcher!= null){
			
dispatcher.stop();
		
}
		
currentMixer = mixer;
		

		
float sampleRate = 44100;
		
int bufferSize = 2048;
		
int overlap = 0;
		

		
final AudioFormat format = new AudioFormat(sampleRate, 16, 1, true,
				
true);
		
final DataLine.Info dataLineInfo = new DataLine.Info(
				
TargetDataLine.class, format);
		
TargetDataLine line;
		
line = (TargetDataLine) mixer.getLine(dataLineInfo);
		
final int numberOfSamples = bufferSize;
		
line.open(format, numberOfSamples);
		
line.start();
		
final AudioInputStream stream = new AudioInputStream(line);

		
JVMAudioInputStream audioStream = new JVMAudioInputStream(stream);
		
// create a new dispatcher
		
dispatcher = new AudioDispatcher(audioStream, bufferSize,
				
overlap);

		
// add a processor, handle percussion event.
		
//dispatcher.addAudioProcessor(new DelayEffect(400,0.3,sampleRate));
		
dispatcher.addAudioProcessor(new Oscilloscope(this));
		
//dispatcher.addAudioProcessor(new AudioPlayer(format));
		

		
// run the dispatcher (on a new thread).
		
new Thread(dispatcher,"Audio dispatching").start();
	
}

	
public static void main(String... strings) throws InterruptedException,
			
InvocationTargetException {
		
SwingUtilities.invokeAndWait(new Runnable() {
			
@Override
			
public void run() {
				
JFrame frame = new OscilloscopeExample();
				
frame.pack();
				
frame.setSize(640,480);
				
frame.setVisible(true);
			
}
		
});
	
}

	
@Override
	
public void handleEvent(float[] data, AudioEvent event) {
		
panel.paint(data,event);
		
panel.repaint();
	
}
}