Zdravím,
vyvíjam jednoduchú hru v Jave; o zvuk sa má postarať
javax.sound.sampled.AudioSystem a
javax.sound.sampled.Clip. Prehrávajú sa WAV súbory. Problém je, že na Linuxe (mám Ubuntu 16.04) sa zvuk síce
prehraje, ale preruší sa asi v polke, t.j. neprahraje sa mi celý zvukový efekt. Skúšal som to na Windowse,
tam to funguje v poriadku. Zaujímavé je tiež, že ak nechám prehrať efekt viac krát pomocou
loop(),
tak sa prehraje zvuk OK.
Používam efekty zo stránky
https://www.freesoundeffects.com/free-sounds/explosion-10070/Nevie niekto, kde by mohol byť problém?
Nasleduje jednoduchý kód, ktorý demonštruje problém.
package com.zetcode;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GameSoundEx extends JFrame {
private final GameSound gameSound;
public GameSoundEx() {
gameSound = new GameSound();
initUI();
}
private void initUI() {
// FlowLayout only for testing purposes; never use
setLayout(new FlowLayout(5));
JButton button = new JButton("Play explosion");
button.addActionListener(e -> gameSound.playExplosion());
add(button);
}
private static void createAndShowGUI() {
GameSoundEx game = new GameSoundEx();
game.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
game.setTitle("Testing Java sound");
game.setSize(300, 200);
game.setLocationRelativeTo(null);
game.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> createAndShowGUI());
}
}
package com.zetcode;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class GameSound {
private Clip explosion;
public GameSound() {
loadSoundFile();
}
private void loadSoundFile() {
try {
URL url = this.getClass().getResource(
"/resources/explosion.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
explosion = AudioSystem.getClip();
explosion.open(ais);
} catch (LineUnavailableException | IOException |
UnsupportedAudioFileException ex) {
Logger.getLogger(GameSound.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void playExplosion() {
if (explosion.isRunning()) {
explosion.stop();
}
explosion.setFramePosition(0);
// explosion.loop(1);
explosion.start();
}
}