package de.jaujau.daten;


import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;

/**
 * Klasse für das Abspielen eines Tons
 * @author Sebastian Kacza
 *
 */
public class Audio {
	
	public Audio() {}

	
	/**
	 * Spielt den "Jau" Ton ab
	 */
	public void spieleJau() {
		spieleTon("/sound/jau.wav");
		System.out.println("AUDIO: Spiele jau.wav");
	}
	
	
	/**
	 * Spielt den "JauJau" Ton ab
	 */
	public void spieleJauJau() {
		spieleTon("/sound/jaujau.wav");
		System.out.println("AUDIO: Spiele jaujau.wav");
	}
	
	
	/**
	 * Spielt einen Ton ein einem eingene Thread ab
	 * @param Pfad zu der Sounddatei im Jar-Archiv
	 */
	private void spieleTon(String Pfad) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					playSound(Pfad);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	
	/*
	 * !!! DIESE METHODE IST NICHT VON MIR !!! 
	 * Quelle: https://stackoverflow.com/questions/2416935/how-to-play-wav-files-with-java
	 */
	/**
	 * Spiel eine Audio dateim im WAV-Format die im internen Ordner  gespeichert ist ab.
	 * @param path Ptad zu der Sounddatei
	 * @throws Exception
	 */
    private void playSound (String path) throws Exception {
        //AudioInputStream audioStream = AudioSystem.getAudioInputStream(new File ("test.wav"));
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream(path));
        
        int BUFFER_SIZE = 128000;
        AudioFormat audioFormat = null;
        SourceDataLine sourceLine = null;

        audioFormat = audioStream.getFormat();

        sourceLine = AudioSystem.getSourceDataLine(audioFormat);
        sourceLine.open(audioFormat);
        sourceLine.start();

        int nBytesRead = 0;
        byte[] abData = new byte[BUFFER_SIZE];
        while (nBytesRead != -1) {
            try {
                nBytesRead = 
                audioStream.read(abData, 0, abData.length);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (nBytesRead >= 0) {
                int nBytesWritten = sourceLine.write(abData, 0, nBytesRead);
            }
        }

        sourceLine.drain();
        sourceLine.close();
    }
}
