Ola galera,
Tudo bom?
Estou desenvolvendo um aplicativo em java que utiliza som, usei a linha Clip que somente carrega no máximo 32 arquivos de som e como carrego uns 50 arquivos de som, optei pela linha SourceDataLine, porém na minha maquina e na máquina do meu irmão roda normalmente o som (Windows 7 e Windows Vista), respectivamente, hoje estava na faculdade e fui testar na máquina de dois amigos e som não tocou (Windows 7 e Windows XP), o que pode ser?
Dá uma olhada no Código:
/* Carrega o clipe ao qual pode ser tocado, parado, resumido e loopado
*
* Um objeto implementando a interface SoudWatcher pode ser notificada quando clip
* loopar ou parar.
*/
import java.io.*;
import javax.sound.sampled.*;
import javax.sound.sampled.DataLine.Info;
import java.text.DecimalFormat;
public class SomInfo implements LineListener {
private final static String SOUND_DIR = "/Sons/";
private String name, filename;
private static SourceDataLine clip = null;
private boolean isLooping = false;
private SoundsWatcher watcher = null;
private DecimalFormat df;
private static AudioInputStream stream;
public SomInfo(String nm, String fnm) {
name = nm;
filename = SOUND_DIR + fnm;
df = new DecimalFormat("0.#");
//loadClip(filename);
} // fim do construtor
private void loadClip(String fnm) {
try {
// linka o Audio Stream com o arquivo
stream = AudioSystem.getAudioInputStream(
getClass().getResourceAsStream(fnm));
AudioFormat formato = stream.getFormat();
// converte os formatos ULAW E ALAW para PCM
if((formato.getEncoding() == AudioFormat.Encoding.ULAW)||
(formato.getEncoding() == AudioFormat.Encoding.ALAW)){
AudioFormat novoFormato = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
formato.getSampleRate(),
formato.getSampleSizeInBits()*2,
formato.getChannels(),
formato.getFrameSize()*2,
formato.getFrameRate(), true);
//big_Endian
//atualiza os streams e os detalhes dos formatos
stream = AudioSystem.getAudioInputStream(novoFormato, stream);
System.out.println("Converte o formato de Audio: " + novoFormato);
formato = novoFormato;
}
DataLine.Info info = new DataLine.Info(SourceDataLine.class, formato);
// tenha certeza que o sistema suporta o DataLine
if(!AudioSystem.isLineSupported(info)) {
System.out.println("Não suporta no DataLine " + fnm);
return;
}
// pega a linha do clip
clip = (SourceDataLine)AudioSystem.getLine(info);
System.out.println("Tamanho: " + clip.available());
//Ouvindo os eventos do clip
clip.addLineListener(this);
clip.open(formato); // abre o arquivo de som como um clip
//play();
}
catch(UnsupportedAudioFileException auioException) {
System.out.println("Não suportado o arquivo de audio: " + fnm);
}
catch(LineUnavailableException lineException) {
System.out.println("Nenhuma linha suportada: " + fnm);
}
catch(IOException ioException) {
System.out.println("Erro de I/O: " + fnm);
}
catch(Exception e) {
System.out.println("Problema com: " + fnm);
}
} // fim do método
public void update(LineEvent lineEvent) {
/* Chamada quando há a detecção de abertura, fechamento, começo ou a
* paralisação dos eventos. O watcher se há uma saída notificada.
*/
//Quando o clip é parado/ chegou ao final.
if(lineEvent.getType() == LineEvent.Type.STOP) {
System.out.println("Atualiza STOP para: " + name);
clip.stop();
if(!isLooping) { // não está loopando?
if(watcher != null) {
watcher.atSequenceEnd(name, SoundsWatcher.STOPPED);
}
}
}
} // fim do método
public void close() {
if(clip != null) {
clip.stop();
clip.close();
}
}
public void play() {
/*Carrega o som em tempo real */
loadClip(filename);
int numRead = 0;
byte[] buffer = new byte[clip.getBufferSize()];
clip.start();
// le e toca os streams de audio
try {
int offset;
while ((numRead = stream.read(buffer,0, buffer.length)) >= 0) {
// System.out.println("Lê: " + numRead);
offset = 0;
while (offset < numRead)
offset += clip.write(buffer, offset, numRead-offset);
}
}
catch (IOException e)
{ System.out.println( e.getMessage()); }
// Espera até todos os bytes passarem pelo mixer
clip.drain();
clip.stop();
clip.close();
}
public void stop() {
// para e reinicia a track
if(clip != null) {
isLooping = false;
clip.stop();
}
}
public void pause() {
// para o clipe na atual posição
if(clip != null) {
clip.stop();
}
}
public void resume() {
if(clip != null) {
clip.start();
}
}
public void setWatcher(SoundsWatcher sw) {
watcher = sw;
}
// outros métodos de acesso
public String getName() {
return name;
}
}
vlws,