Som?

Eae galera, eu tava querendo por um arquivo “yeah.wav” para tocar mas eu não consigo. Tentei vario códigos já, vou postar um pra vocês verem

[code]public class ClassSound implements Runnable {

private Clip clip;  
private static final String LOCAL_SONS = "Extras/Sons/";  
private String[] colecao_sons = { "som_um", "som_dois" };  

public ClassSound() {  

}  

public void carregarSom(int pos) {  

    File soundFile = new File(LOCAL_SONS + colecao_sons[pos] + ".wav");  
    AudioInputStream sound = null;  

    try {  
        sound = AudioSystem.getAudioInputStream(soundFile);  
    } catch (UnsupportedAudioFileException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

    DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());  
    try {  
        clip = (Clip) AudioSystem.getLine(info);  
    } catch (LineUnavailableException e) {  
        e.printStackTrace();  
    }  

    try {  
        clip.open(sound);  
    } catch (LineUnavailableException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

}  

public void tocarSom() {  
    clip.start();  

}  
  
public Clip getClip(){  
    return this.clip;  
}  

@Override  
public void run() {  
    clip.start();  
      
}  

}[/code]

e eu ponho isso aqui dentro do main em outra classe:

ClassSound som = new ClassSound(); som.carregarSom(0); som.tocarSom();

O arquivo existe, quando não existe ele chega a da um erro. É como se o programa rodasse normalmente só que sem reproduzir o som.
Já tentei com arquivos mp3 e wma mas dão erro.

Será que é porque eu estou usando o main? Tem algo a ver?

Oi,

Use a busca do forum… :wink:

http://www.guj.com.br/java/76160-como-executar-aquivos-de-som-wav-mp3-etc-numa-aplicacao-java

Eu tava dando uma olhada em outras classes e acabei fazendo outra. Funcionou pra mim, e creio que com qualquer arquivo .wav, eu não testei mas acho que não funciona com qualquer outro tipo de arquivo.

[code]import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.SourceDataLine;

public class Som {

Runnable player = new Runnable(){
	public void run(){
		try{
			if (som.getName().toLowerCase().contains(".wav"))
			{
				AudioInputStream stream = AudioSystem.getAudioInputStream(som);
				AudioFormat format = stream.getFormat();
				
				SourceDataLine.Info info = new DataLine.Info(
						SourceDataLine.class,
						stream.getFormat(),
						(int) (stream.getFrameLength() * format.getFrameSize()));
				
				line = (SourceDataLine) AudioSystem.getLine(info);
				line.open(stream.getFormat());
				line.start();
				
				//controle de volume
				volume_control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
				volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f));
				
				//controle de pan
				pan_control = (FloatControl) line.getControl(FloatControl.Type.PAN);
				pan_control.setValue(pan);
				
				int num_read = 0;
				byte[] buf = new byte[line.getBufferSize()];
				
				while ((num_read = stream.read(buf, 0, buf.length)) >= 0)
				{
					int offset = 0;
					pan_control.setValue(pan);
					volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f));
					while (offset < num_read)
					{
						offset += line.write(buf, offset, num_read - offset);
					}
				}
				
				if(loop)
					controle.start();
				
				line.drain();
				line.stop();
				line.close();
			}
		}catch(Exception e){e.printStackTrace();}
		
	}	
};


FloatControl pan_control, volume_control;
SourceDataLine line;
File som;
static float volume = 100f;
static float pan = 0f;
static boolean loop = false;
Thread controle = new Thread(player);



Som(String sound){this.som = new File(sound);}
Som(String sound, float volume, float pan, boolean loop){
	this.som = new File(sound);
	this.volume = volume;
	this.pan = pan;
	this.loop = loop;		
	}
	
public void Pause(){line.stop();}
public void Resume(){line.start();}
public void End(){line.close();}
public void Play(){controle.start();};

}
[/code]

creio que essa parte do código possa ficar meio pesada, no meu PC não ficou mas vai saber…

while ((num_read = stream.read(buf, 0, buf.length)) >= 0) { int offset = 0; pan_control.setValue(pan); volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f)); while (offset < num_read) { offset += line.write(buf, offset, num_read - offset); } }

por causa das linhas

pan_control.setValue(pan); volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f));

mas se isso acontecer é só deixar elas um pouco pra cima do while, só que você não vai ter controle sobre o volume e o pan em tempo real, você teria que encerrar a reprodução e iniciar outra para atualizar os valores.

Provavelmente não é a maneira mais optimizada e fazer isso, mas por enquanto com meus programinhas leves da pra levar de boa.
Valeu Anime e pessoal do fórum em geral ;D

Achei um erro no código, quando eu declaro 2 Som, parece que eles partilham os atributos. Se eu digo para o 1º que eu declarei não ter loop e o 2º ter, os dois ficam com loop, e se eu fizer o contrário os 2 ficam sem. Não sei porque, alguém me ajuda?

Eu mudei aquela parte do loop e puis essa:

if(loop)
controle.run();

finalmente descobri! Parece que quando você declara um atributo de um objeto como estático, todos os objetos daquele mesmo tipo vão ter o mesmo valor. Eu tirei o static e os getters e setters que tinha posto e agora deu certo! Aleluia, nem acredito que passei tanto tempo tentando resolver uma coisa tão simples ;D