Não consigo tocar sons pequenos com javax.sound e nem "cloná-los"

Olá pessoal do GUJ

Estou aqui fazendo algumas experiências para tocar sons via java, a api parece muito boa e tal mas… tive um problema.

Consigo tocar midi e wav com mais de 1 segundo de duração, porém, não estou tendo sucesso ao tocar um som com menos de 1 segundo de duração.

Estou me baseando neste artigo: Java and Sound, Part 1, e mesmo o código postado por eles não consegue tocar (SoundPlayer.java)

Gostaria de saber se algum de vocês conhece algo que possa ser feito para arrumar isso.

Outra coisa, não descobri nenhum modo de clonar o objeto, se eu precisar tocar o mesmo som mais de uma vez ao mesmo tempo, não estou conseguindo… alguém sabe?

Estou usando java 5, eclipse 3.2

flw, valeu

Bem, até agora nada por aqui, tentei também usando Applet.newAudioClip(), mas só o que tem mais de um segundo foi tocado mesmo… alguém aí imagina o que pode ser?

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