il ne faut pas tout passer ta class en thread mais juste la méthode play
car la ce que tu as fait revient au même
le thread permet a la fonction play de s'exécuter en parallèle sans bloquer le reste de ton programme...
voila ce qui fonctionne chez moi après changement
j'ai créer une classe appelé "MonThread" qui extend Thread
le fichier MonThread :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
import java.io.IOException;
public class MonThread extends Thread{
public MonThread(){
}
public void run(){
WavPlayer.line.start();
try {
byte bytes[] = new byte[1024];
int bytesRead=0;
while (((bytesRead = WavPlayer.audioStream.read(bytes, 0, bytes.length)) != -1)) {
WavPlayer.line.write(bytes, 0, bytesRead);
}
} catch (IOException io) {
io.printStackTrace();
return;
}
}
} |
et la classe WavPlayer :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
import java.io.File;
import java.io.IOException;
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;
public class WavPlayer {
public static AudioInputStream audioStream = null;
public static SourceDataLine line = null;
private AudioFormat audioFormat = null;
public WavPlayer(File f) throws Exception{
audioStream = AudioSystem.getAudioInputStream(f);
audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
try {
line = (SourceDataLine) AudioSystem.getLine(info);
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
/**
* Ouverture du flux audio
* @return On retourne <code>false</code> si il y a eu une erreure
*/
public boolean open(){
try {
line.open(audioFormat);
} catch (Exception e) {
e.printStackTrace();//pour le debugage
return false;
}
return true;
}
/**
* Fermeture du flux audio
*/
public void close(){
line.close();
}
/**
* On joue le son
*/
public void play(){
MonThread t = new MonThread();
t.start();
System.out.println("test");
}
/**
* On arrete le son
*/
public void stop(){
line.stop();
}
public static void main(String [] args){
try {
WavPlayer wp = new WavPlayer(new File("D:\\Documents and Settings\\romain\\Bureau\\musique.wav"));
wp.open();
wp.play();
int i = 0;
while(i < 5){
Thread.sleep(1000);
System.out.println(i);
i++;
}
wp.stop();
wp.close();
System.out.println("debug0");
} catch (Exception e) {
e.printStackTrace();
}
}
} |
les changements apportés :
création de la classe Monthread qui s'occupe exactement de ce que faisait la fonction play()
ensuite dans le fichier WavPlayer :
passage de variable audioStream et line en variable public static pour partager ses variable avec le thread
ensuite dans la méthode play() :
1 2 3 4 5 6 7
|
public void play(){
MonThread t = new MonThread();
t.start();
System.out.println("test");
} |
j'instancie le thread et je le lance (ce qui a pour effet de lancer la méthode run
donc le thread se lance en parallèle mais renvoie tout de suite la main au programme qui continue (affiche le println("test"))
Pour ce qui est du main j'ai rajouter juste une petite boucle pour mon test
pour ce test j'ai un wav de 15seconde
la boucle en fait boucle pendant 5 secondes ... au bout des 5 secondes
on sort de la boucle et fait appelle au la fonction stop qui fait un line.stop()
ce qui remplace le listener sur ton bouton stop ...
avec ça, lorsque tu appuiera sur ton bouton il devrai bien stopper ta musique
tien moi au courant pour la suite
Partager