Som?

4 respostas
A

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

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();  
          
    }  
}

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?

4 Respostas

Anime

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

A

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.

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();};

	
}

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

A

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();
A

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

Criado 17 de junho de 2012
Ultima resposta 17 de jun. de 2012
Respostas 4
Participantes 2