Java Clip.start() полусистемно не воспроизводит звук
Эта проблема требует некоторого контекста. Казалось бы, что-то в java-клипе я не совсем понимаю. У меня есть следующий способ воспроизведения клипа.
public class AudioPlayer {
.....
public void play(float gain) throws LineUnavailableException, IOException {
this.changeVol(gain);
clip.start();
System.out.println("played");
/*
to see that clip.start() was
executed successfully without throwing any exceptions
*/
}
}
public class Speaker {
......
public static void play(String path)throws UnsupportedAudioFileException, IOException, LineUnavailableException {
AudioPlayer AP = new AudioPlayer(path, Effect);
audio.add(AP);
if (!paused) {
AP.play(Options.volumeSetting[Effect]);
}
}
}
Это установлено, чтобы играть каждый раз, когда щелчок левой кнопкой мыши реагировал на одну из кнопок следующим образом
public void respond() {
responded = true;
if(soundFile != null) {
try {
Speaker.play(soundFile);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}
}
Проблема, с которой я столкнулся, заключается в том, что иногда вызывается вышеуказанный метод ответа, и "играющий" печатается на терминале, а звук на самом деле не воспроизводится.
что я не понимаю, так это то, что это происходит довольно регулярно в отношении того, какой тип кнопки вызывает этот метод ответа, хотя существует только один метод, который фактически вызывает этот метод ответа.
ниже приведены места, где вызывается вышеуказанный метод:
public class SimpleButton extends GameObject {
.....
public boolean tick() {
if(this.isMousedOver() && Controller.LeftMouse.isPressed() &&
!Controller.LeftMouse.isResponded()) {
Controller.LeftMouse.respond();
return true;
}
return false;
}
}
это корневой класс кнопок, от которого наследуются все типы кнопок. каждый случай простой кнопки (исключая ее подклассы) воспроизводит звук 100% времени, когда она нажата
public class ThreeStateButton extends SimpleButton{
......
public boolean tick() {
if (index == Clicked) {
return !t.tick();
}
if (super.tick()) {
index = Clicked;
t = new Timer(Idle_Time);
} else if (isMousedOver()) {
index = Moused;
} else {
index = Idle;
}
return false;
}
}
ThreeStatesButton, с другой стороны, воспроизводит звук каждые 30 или около того щелчков, даже если строка "воспроизведена" печатается при каждом нажатии.
public class ToggleButton extends SimpleButton {
......
public boolean tick() {
if(super.tick()) {
if(++index >= models.length) {
index = 0;
}
this.m = models[index];
return true;
}
return false;
}
}
ToggleButton, хотя и выходит из SimpleButton и использует очень похожий код, звук воспроизводится 100% времени.
Я не мог понять, что вызывает это, так как оба типа кнопок подкласса вызывают метод tick() SimpleButton, который вызывает оба метода response при нажатии, а затем им всем удалось вывести "Play", однако только он ThreeStateButton не издает никаких звуков. Я что-то упускаю?