# Programm hängt sich auf wenn Lied abspielt



## Sawa (22. Sep 2010)

Ich hab ein Problem vielleicht könnt ihr mir ja dabei helfen ....

sobald ich bei meinen javaprogramm ein Lied abspielen will, fängt es zwar an zu spielen das Programm friert dabei aber ein.

ich habe den Code zum Abspielen in eine eigene Klasse (Abspielen) gepackt und rufe die die Methode zum abspielen in der Doc-Schicht auf.
die Klasse Abspielen wird in der Main Klasse Deklariert.

ich habe auch schon versucht den gesamten Code zum Abspielen der Musik in die Main Klasse zu packen da hatte ich zwar nicht das problem das sich das Programm aufhängt, dafür ging das Lied sofort beim start des Programms an.


- benutze MP3SPI1.9.4 .


----------



## ?!?!? (22. Sep 2010)

*Glaskugel* Würde vll. ein Thread abhilfe schaffen?

Ansonsten ein wenig Code posten


----------



## Sawa (22. Sep 2010)

Mein Quellcode

Main-Schicht

```
import doc.MusikDoc;
import view.MusikView;


public class Mainapp 
{
	public static void main(String[] args) 
	{
		MusikDoc doc = new MusikDoc();
		MusikView m = new MusikView("Musik", doc);
	}
}
```

DOC-Schicht
[JAVA=54]
package doc;

import java.io.*;
import javax.sound.sampled.*;

public class MusikDoc 
{
	public MusikDoc() 
	{
		super();
	}

	public void testPlay(String filename)
	{
	  try {
	    File file = new File(filename);
	    AudioInputStream in= AudioSystem.getAudioInputStream(file);
	    AudioInputStream din = null;
	    AudioFormat baseFormat = in.getFormat();
	    AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
	                                                baseFormat.getSampleRate(),
	                                                16,
	                                                baseFormat.getChannels(),
	                                                baseFormat.getChannels() * 2,
	                                                baseFormat.getSampleRate(),
	                                                false);
	    din = AudioSystem.getAudioInputStream(decodedFormat, in);
	    // Play now.
	    rawplay(decodedFormat, din);
	    in.close();
	  } 
	  catch (Exception e)
	    {
	        //Handle exception.
		  System.out.println(e);
	    }
	}

	private void rawplay(AudioFormat targetFormat, AudioInputStream din) throws IOException, LineUnavailableException
	{
	  byte[] data = new byte[4096];
	  SourceDataLine line = getLine(targetFormat);
	  if (line != null)
	  {
	    // Start
	    line.start();
	    int nBytesRead = 0, nBytesWritten = 0;
	    while (nBytesRead != -1)
	    {
	        nBytesRead = din.read(data, 0, data.length);
	        if (nBytesRead != -1) nBytesWritten = line.write(data, 0, nBytesRead);
	    }
	    // Stop
	    line.drain();
	    line.stop();
	    line.close();
	    din.close();
	  }
	}

	private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException
	{
	  SourceDataLine res = null;
	  DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
	  res = (SourceDataLine) AudioSystem.getLine(info);
	  res.open(audioFormat);
	  return res;
	} 
}
[/code]

View-Schicht

```
package view;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import doc.MusikDoc;

public class MusikView extends JFrame
{
	private JButton btn_play;
	private MusikDoc doc;
	
	public MusikView(String title, MusikDoc doc) 
	{
		super(title);
		this.doc = doc;
		
		this.setSize(400, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		
		erzeugeAnsicht();
	}

	private void erzeugeAnsicht() 
	{
		this.setVisible(false);
		this.removeAll();
		
		ButtonListener bl = new ButtonListener();
		
		btn_play = new JButton("play");
		btn_play.addActionListener(bl);
		this.add(btn_play, BorderLayout.CENTER);
		
		this.setVisible(true);
	}
	
	class ButtonListener implements ActionListener
	{

		@Override
		public void actionPerformed(ActionEvent ae) 
		{
			if (ae.getSource() == btn_play) 
			{
				doc.testPlay("1.mp3");
			}
		}
		
	}
}
```


----------



## MiDniGG (22. Sep 2010)

Ja. Wie *?!?!?* schon sagte. Du musst Threads benutzen!


----------



## ?!?!? (22. Sep 2010)

^^ Schade das mir meine Glaskugel nicht die Lottozahlen voraus sagen tut


----------

