Ciao a tutti! Sto provando a realizzare un player mp3 utilizzando MP3SPI.
Ho creato una gui con una textField e 3 bottoni (play, pausa, stop). Non vi preoccupate, è ancora in fase di testing, la textField sparirà... Viene invocata la classe Mp3Player istanziando l'oggetto mp3 di tipo appunto Mp3Player. I bottoni hanno i relativi ascoltatori e quando vengono cliccati vengono invocati i rispettivi metodi mp3.play() mp3.pausa() e mp3.stop()
La textField ha già impostato come testo da contenere la stringa "prova.mp3" che è il file mp3 che c'è nella cartella della classe.

La classe Mp3Player è così formata:

codice:
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
		
class Mp3Player {
	private AudioInputStream din;
	private SourceDataLine line;
	private volatile boolean paused;
	private Object lock;
	private String x;
	
	public Mp3Player(String x){
		
		this.x=x;
		din = null;
		lock = new Object();
		paused = false;
		
		try {
			File file = new File(x);
			AudioInputStream in = AudioSystem.getAudioInputStream(file);
			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);
			DataLine.Info info = new DataLine.Info(SourceDataLine.class, decodedFormat);
			line = (SourceDataLine) AudioSystem.getLine(info);
			if(line != null) {
				line.open(decodedFormat);
				byte[] data = new byte[4096];
				// Start
				line.start();
				
				int nBytesRead;
				synchronized (lock) {
					while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
						while (paused) {
							if(line.isRunning()) {
								line.stop();
							}
							try {
								lock.wait();
							}
							catch(InterruptedException e) {
							}
						}
	
						if(!line.isRunning()) {
							line.start();
						}
						line.write(data, 0, nBytesRead);
					}
				}

				// Stop
				line.drain();
				line.stop();
				line.close();
				din.close();
			}
			
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			if(din != null) {
				try { din.close(); } catch(IOException e) { }
			}
		}

	}
	
	public void userPressedPause() {
 		paused = true;
	}
 
	public void userPressedPlay() {
	 	synchronized(lock) {
	  	paused = false;
	  	lock.notifyAll();
	 	}
	}
	
	public void userPressedStop() {
		try {
			line.drain();
			line.stop();
			line.close();
			din.close();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		try { din.close(); } catch(IOException e2) { }
	}
}
Ovviamente l'oggetto di tipo Mp3Player viene istanziato quando si preme il pulsante Play prendendo la stringa presente nella textField e passandogliela come parametro.

Perchè se la stringa "prova.mp3" gliela passo come parametro appena premo play il player inizia a riprodurre la musica ma la gui diventa "bloccata" cioè non risponde più ai comandi, neanche se si tenta di chiuderla? Se invece di passarglielo come parametro, invece lo metto nel costruttore di Mp3Player funzionano sia il play che il pausa ma non lo stop!

Qualcuno saprebbe rispondermi? Grazie!