Habe kürzlich in mein aktuelles Projekt Sound eingebaut. Das tut auch soweit, aber manchmal wird ein Sample nicht wirklich abgespielt.
Hier erstmal der Code.
Also ich habe 24 Samples (sound_0.wav ... sound_23.wav) in WAV-Format, die ich im Constructor in Byte-Arrays einlese. Beim Abspielen hole ich mir einen Clip über Audiosystem. Die Sache mit dem Retrycount war ein hilfloser Versuch zur Behebung des Problems, ebenso wie die Behandlung "c.isRunning". In der Tat behebt keiner der beiden Workarounds das Problem, daß ab und zu gar nichts ausgegeben wird - außer vielleicht einem Knacksen. Eine halbe Sekunde später wird genau das gleiche Sample wieder ganz abgespielt.
Das tritt auf mehreren Rechnern gleichermaßen auf, ist aber nicht 100% reproduzierbar. Manchmal wird 'zigmal hintereinander kein Sound verschluckt, dann mehrfach jedes 2. oder 3. Mal.
Irgendwelche Ideen? Bringt es was, explizit über den Mixer zu gehen?
Hier erstmal der Code.
Code:
import java.net.URL;
import java.net.URLClassLoader;
import javax.sound.sampled.*;
public class Sound {
public Sound() throws SoundException {
canPlay = false;
String fName="";
soundBuffer = new byte[NUMBER][];
try {
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
for (int i = 0; i<NUMBER; i++) {
fName = "sound/sound_"+Integer.toString(i)+".wav";
URL fileLoc = urlLoader.findResource(fName);
if (fileLoc == null)
throw new SoundException();
AudioInputStream f = AudioSystem.getAudioInputStream(fileLoc);
format = f.getFormat();
soundBuffer[i] = new byte[(int)f.getFrameLength()*format.getFrameSize()];
f.read(soundBuffer[i]);
f.close();
}
} catch (Exception ex) {
throw new SoundException("Error loading sound file "+ fName);
}
info = new Line.Info(Clip.class);
}
public void play(int num) {
int retryCount = 0;
while (retryCount < 3) {
try {
Clip c = (Clip)AudioSystem.getLine(info);
c.open(format,soundBuffer[num],0,soundBuffer[num].length);
if (c.isRunning())
c.stop();
c.start();
retryCount = 100;
} catch (LineUnavailableException ex) {
retryCount++;
}
}
}
byte soundBuffer[][];
AudioFormat format;
boolean canPlay;
Line.Info info;
final static int NUMBER = 24;
Also ich habe 24 Samples (sound_0.wav ... sound_23.wav) in WAV-Format, die ich im Constructor in Byte-Arrays einlese. Beim Abspielen hole ich mir einen Clip über Audiosystem. Die Sache mit dem Retrycount war ein hilfloser Versuch zur Behebung des Problems, ebenso wie die Behandlung "c.isRunning". In der Tat behebt keiner der beiden Workarounds das Problem, daß ab und zu gar nichts ausgegeben wird - außer vielleicht einem Knacksen. Eine halbe Sekunde später wird genau das gleiche Sample wieder ganz abgespielt.
Das tritt auf mehreren Rechnern gleichermaßen auf, ist aber nicht 100% reproduzierbar. Manchmal wird 'zigmal hintereinander kein Sound verschluckt, dann mehrfach jedes 2. oder 3. Mal.
Irgendwelche Ideen? Bringt es was, explizit über den Mixer zu gehen?