Eu ainda continuo com este problema, mas achei esse relato de bug aqui:
LineEvent.Type.STOP is returned too early for short sound clips
Vi isso daqui nele:
[quote]Verified to work fine with DirectAudioDevices. The old implementation (Java Sound Engine) will not be fixed. To make it clear: the fix will work with 1.5.0 or later, on
- Solaris with Mixer enabled
- Windows with Direct Sound 5 or later
- Linux with ALSA and hardware or software mixing enabled in ALSA[/quote]
Como ele está fechado, achei que podia ter feito alguma coisa errada com meu código lá, e fiz esse programa que foi baseado no que está no bug report e tentei tocar o arquivo que anexei lá em cima, o boom.wav:
package teste.eduardo.pessoal;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
public class ClipTeste implements LineListener {
private Clip clip;
private String wait = "";
private int audioLength;
private long inicio;
public void play(File f) throws UnsupportedAudioFileException, IOException, LineUnavailableException,
InterruptedException {
AudioInputStream ain = AudioSystem.getAudioInputStream(f);
try {
DataLine.Info info = new DataLine.Info(Clip.class, ain.getFormat());
clip = (Clip) AudioSystem.getLine(info);
System.out.println(clip);
clip.open(ain);
} finally { // We're done with the input stream.
ain.close();
}
// Get the clip length in microseconds and convert to milliseconds
audioLength = (int) (clip.getMicrosecondLength() / 1000);
System.out.println("O áudio possui " + audioLength + " ms");
inicio = System.currentTimeMillis();
System.out.println("Iniciando reprodução em " + inicio);
clip.addLineListener(this);
clip.start();
synchronized (wait) {
wait.wait();
}
}
public static void main(String[] args) throws UnsupportedAudioFileException, IOException,
LineUnavailableException, InterruptedException {
JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() || (f.isFile() && f.getName().endsWith("wav"));
}
@Override
public String getDescription() {
return "Arquivos Wav";
}
});
System.out.println("java.runtime.version=" + System.getProperty("java.runtime.version"));
System.out.println("os.name=" + System.getProperty("os.name"));
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
File f;
f = chooser.getSelectedFile();
ClipTeste clipTeste = new ClipTeste();
clipTeste.play(f);
}
}
public void update(LineEvent event) {
if (event.getType() == LineEvent.Type.STOP) {
long fim = System.currentTimeMillis();
System.out.println("Evento STOP em " + fim);
System.out.println("Tempo decorrido de " + (fim - inicio) + " ms");
clip.close();
synchronized (wait) {
wait.notify();
}
}
}
}
Aí então, vou todo feliz rodar meu programa e recebo isso aqui:
[quote]java.runtime.version=1.5.0-b64
os.name=Windows 2000
com.sun.media.sound.DirectAudioDevice$DirectClip@941db6
O áudio possui 847 ms
Iniciando reprodução em 1159452999859
Evento STOP em 1159452999859
Tempo decorrido de 0 ms
[/quote]
Ou seja, segundo o bug report, esse bug já foi corrigido na versão 5 do java!
Então gostaria de saber:
[list]Como saber a versão do DirectX?[/list]
[list]Vocês conseguem tocar o som com esse programa? Qual SO e versão do Java você está usando?[/list]
[list]Como faço pra pedir uma reabertura desse bug?[/list]
Por favor, alguém me dê uma luz… não sei o que fazer!
Obrigado desde já, tchau