J
JavaNooby
Gast
Hi, ich bin gerade dabei n Moorhuhn clone zu erstellen, es funktioniert alles bis auf eine kleinigkeit ^^.
Ich habe eifrig gegoogled und bin auf eine wunederschöne Klasse gestoßen die Nebenläufig Wav Dateien abspielt.
Beim ersten mal starten funktioniert das auch einwandfrei, nur wie kann ich den Thread erneut starten wenn ich nochmal schieße?
Hier mal die Klasse die das Wavfile abspielt:
Von Außen hab ich mir ein Object der Klasse erstellt und starte diese mit .start().
Zum erneuten Starten gibt es dummerweiße keine nützliche funktion (,resume() ist deprecated ;( ).
Wenn ich direct die run() Methode aufruf hängt das spiel bis der Sound abgespielt ist ^^.
Kann mir da jemand weiterhelfen?
thx
Ich habe eifrig gegoogled und bin auf eine wunederschöne Klasse gestoßen die Nebenläufig Wav Dateien abspielt.
Beim ersten mal starten funktioniert das auch einwandfrei, nur wie kann ich den Thread erneut starten wenn ich nochmal schieße?
Hier mal die Klasse die das Wavfile abspielt:
Code:
package logic;
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.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class SoundPlayer extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
public boolean shoot =false;
enum Position {
LEFT, RIGHT, NORMAL
};
public SoundPlayer(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public SoundPlayer(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
@Override
public void run() {
System.out.println(shoot);
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
this.interrupt();
}
}
Von Außen hab ich mir ein Object der Klasse erstellt und starte diese mit .start().
Zum erneuten Starten gibt es dummerweiße keine nützliche funktion (,resume() ist deprecated ;( ).
Wenn ich direct die run() Methode aufruf hängt das spiel bis der Sound abgespielt ist ^^.
Kann mir da jemand weiterhelfen?
thx