Wie kann ich mein Soundmodul in Java verbessern?Java

Java-Forum
Guest
 Wie kann ich mein Soundmodul in Java verbessern?

Post by Guest »

Ich entwickle ein 2D-Spiel in Java und habe manchmal Probleme mit dem Ton. Im Moment verwende ich in vielen Teilen keinen Ton, außer in der Musik, beim Gehen, beim Angreifen und wenn Feinde Schaden erleiden.
Ich überlasse Ihnen den Code der Tonklasse und den Fehler Ich habe:

Code: Select all

public class SoundThread extends Thread {
private String filename;
private Clip clip;
private float volumeScale;
private boolean isPlaying;

public SoundThread(String filename) {
try {
this.filename = filename;
clip = AudioSystem.getClip();
}
catch (LineUnavailableException ex) {
Logger.getLogger(SoundThread.class.getName()).log(Level.SEVERE, null, ex);
}
}

@Override
public void run() {
isPlaying = true;
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
while (clip.isActive()) {
Thread.sleep(80);
}
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException e) {
e.printStackTrace();
} finally {
isPlaying = false;
}
}

public void reproducir(float volumen) {
if (!isPlaying && clip != null && !clip.isActive()) {
new Thread(() -> {
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
ajustarVolumen(clip, volumen);
clip.start();
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}).start();
}
}

public void repetir(float volumen) {
if (!isPlaying && clip != null && !clip.isActive()) {
new Thread(() -> {
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
ajustarVolumen(clip, volumen);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}).start();
}
}

private void ajustarVolumen(Clip clip, float volumen) {
if (clip != null)
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float range = gainControl.getMaximum() - gainControl.getMinimum();
float gain = (range * volumen) + gainControl.getMinimum();
gainControl.setValue(gain);
}
}

public long getDuracion() {
return clip.getMicrosecondLength();
}

public void detener() {
if (clip != null &&  clip.isRunning()) {
clip.stop();
isPlaying = false;
}
}

public void cambiarArchivo(String nuevoArchivo) {
detener();
this.filename = nuevoArchivo;
}
}
Fehler:

Code: Select all

Exception in thread "Thread-40" java.lang.IllegalArgumentException: Unsupported control type: Master Gain
at java.desktop/com.sun.media.sound.AbstractLine.getControl(AbstractLine.java:149)
at principal.sonido.SoundThread.ajustarVolumen(SoundThread.java:116)
at principal.sonido.SoundThread.lambda$reproducir$0(SoundThread.java:68)
at java.base/java.lang.Thread.run(Thread.java:842)
Ich habe versucht, Ausnahmen hinzuzufügen oder nach einer anderen Bibliothek zu suchen, weiß aber nicht, welche besser helfen würde. Ich weiß auch nicht, warum sich so viele Threads ansammeln. Wie im Fehler erwähnt, handelt es sich um Thread 40 und ich glaube nicht, dass ich die Klasse an so vielen Stellen verwende.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post