# WAV abspielen nach Button-Klick



## hklaudia (1. Okt 2012)

Hallo!

Ich möchte meine aufgenommene WAV-Datei nach dem klicken auf einen PLAY - Button abspielen lassen. Hier mal mein Code:


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.imageio.ImageIO;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import model.GriffeModel;

@SuppressWarnings("serial")
public class Gitarrengriffe extends JFrame implements Observer {
	private GriffeModel model;
	
	private Container contentPane;
	private JTextField name, eSaite, BSaite, GSaite, DSaite, ASaite, ESaite;
	private JButton adden, record, stop, play;
	private JLabel hals, gg;
	private JComboBox<String> griffeCombo;
	private ArrayList<String> griff;
	private String[] saiten;
	private ImageIcon icon; 
    private BufferedImage image;
    private File file;

	public Gitarrengriffe(GriffeModel gm) {
		model = gm;
		this.model.addObserver(this);
		
		contentPane = getContentPane();
		
		JPanel griffePanel = new JPanel();
		
        
        play = new JButton("PLAY");
          
        griffePanel.add(play);

play.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent arg0) {			    
				String name = (String) griffeCombo.getSelectedItem();
				
				play(name);
			}
        	
        });
}

public void play(String n){
		String name = n + "_Sound";
		AudioInputStream ais=null;
		try{
			File file = new File("C:\\Klaudia\\Java\\Beispiele\\Gitarrengriffe\\"+name+".wav");
			ais = AudioSystem.getAudioInputStream(file);
	        AudioFormat format = ais.getFormat();
	        SourceDataLine line = null;
	        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
	        line = (SourceDataLine) AudioSystem.getLine(info);
	        line.open(format);
	        line.start();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
        	e.printStackTrace();
        } catch (IOException e) {
        	e.printStackTrace();
        }
        finally
        {
            try
            {
                ais.close();
            }
            catch (IOException e)
            {
            	e.printStackTrace();
            }
        }
	}
```

nach dem drücken auf den button passiert nichts. also zumindest hört man nichts.
please help


----------



## faetzminator (1. Okt 2012)

Und eine Fehlermeldung/Stacktrace in der Konsole hast du nicht?


----------



## hklaudia (1. Okt 2012)

nein gar nichts..programm läuft weiter..ich drück drauf und es kommt einfach kein sound..:S


----------



## JavaZ (3. Okt 2012)

Hm,sieht bisschen komisch aus.
So auf anhieb fällt mir aber nicht viel auf,
vielleicht dass du in der Methode
nochmal ein neues Objekt vom Typ file definierst?
Oder ein neuer String name?

Und wenn du's mal so probierst?
(So mach ichs jedenfalls):



```
private File file;
	private boolean muted = false;
	private float volume = 100.0f; //Volume (von 0 - 100)
	private float pan = 0.0f; //Die balance der Kopfhörer -1 über 0(beide) bis 1
	private double seconds = 0.0d;//Die Sekunden die er wartet bevor er die Musik abspielt


...

            public void actionPerformed(ActionEvent arg0) {             
                String name = (String) griffeCombo.getSelectedItem();
                new Thread(play).start(name);
            }

	//Methode um die Musik abzuspielen
	final static Runnable play = new Runnable(String n)
	{
                name = n + "_Sound";
                file = new File("C:\\Klaudia\\Java\\Beispiele\\Gitarrengriffe\\"+name+".wav");

		public void run()
		{
			try
			{
				//Prüft ob das engegebene File ein wav ist
				if (file.getName().toLowerCase().contains(".wav"))
				{
					AudioInputStream stream = AudioSystem.getAudioInputStream(file);
					
					AudioFormat format = stream.getFormat();
					
					if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED)
					{
						format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
								format.getSampleRate(),
								format.getSampleSizeInBits() * 2,
								format.getChannels(),
								format.getFrameSize() * 2,
								format.getFrameRate(),
								true);
						
						stream = AudioSystem.getAudioInputStream(format, stream);
					}
					
					SourceDataLine.Info info = new DataLine.Info(
							SourceDataLine.class,
							stream.getFormat(),
							(int) (stream.getFrameLength() * format.getFrameSize()));
					
					SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
					line.open(stream.getFormat());
					line.start();
					
					// Setzt die Volume
					FloatControl volume_control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
					volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f));
					
					// Mute
					BooleanControl mute_control = (BooleanControl) line.getControl(BooleanControl.Type.MUTE);
					mute_control.setValue(muted);
					
					FloatControl pan_control = (FloatControl) line.getControl(FloatControl.Type.PAN);
					pan_control.setValue(pan);
					
					long last_update = System.currentTimeMillis();
					double since_last_update = (System.currentTimeMillis() - last_update) / 1000.0d;
					
					//Wartet die angegeben Sekunden,bevor er die Musik abspielt
					while (since_last_update < seconds)
					{
						since_last_update = (System.currentTimeMillis() - last_update) / 1000.0d;
					}
					
					System.out.println("Musik wird abgespielt!");
					
					int num_read = 0;
					byte[] buf = new byte[line.getBufferSize()];
					
					while ((num_read = stream.read(buf, 0, buf.length)) >= 0)
					{
						int offset = 0;
						
						while (offset < num_read)
						{
							offset += line.write(buf, offset, num_read - offset);
						}
					}
					
					line.drain();
					line.stop();
					
				}
			}
			catch (Exception ex) { ex.printStackTrace(); }
		}
	};
```


----------



## hklaudia (3. Okt 2012)

danke! ich habs jetzt so gemacht wie du, (nur nicht mit thread) und es funktioniert  danke danke!!

nur eine frage, was genau passiert hier (denn wenn ichs ohne dem hab dann wird wieder nichts abgespielt):


```
int num_read = 0;
                    byte[] buf = new byte[line.getBufferSize()];
                    
                    while ((num_read = stream.read(buf, 0, buf.length)) >= 0)
                    {
                        int offset = 0;
                        
                        while (offset < num_read)
                        {
                            offset += line.write(buf, offset, num_read - offset);
                        }
                    }
```


----------

