Problema em classe para tocar som

9 respostas
Filipe_A

Bom dia,

Eu crie uma classe que funciona da sequinte maneira :

Ela percorre um arquivo .txt e pegando os nomes dos arquivos de audio que eu quero adicionar em um arrayList.

Ela tambem carrega o arquivo de som um por vez no metodo carregarVoz()

E cria a linha com esse arquivo criarLinha()

de resto ela toca o arquivo atual , avança arquivo, volta arquivo, para…

Meu problema é que Ela não ta funcionando. Ela não TOCA o som. Não da erro nenhum, a aplicação simplesmente começa e ja termina sem que o som toque.

package mult.controladores;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Vozes {

	private AudioInputStream stream;
	private AudioFormat format;
	private Clip clip;
	private ArquivosCursos arquivosCursos;
	private List<String> nomeArquivoVozes;
	private int posVoz;

	public Vozes(ArquivosCursos arquivosCursos) {

		this.arquivosCursos = arquivosCursos;
		carregarNomesVozes();

	}

	private void carregarNomesVozes() {

		try {

			nomeArquivoVozes = new ArrayList<String>();

			FileReader leitor1 = new FileReader("NomeVozes/"
					+ arquivosCursos.getArquivoCurso());
			BufferedReader leitor2 = new BufferedReader(leitor1);

			String nome = null;

			while ((nome = leitor2.readLine()) != null) {

				nomeArquivoVozes.add(nome);

			}

			leitor2.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void criarLinha() {

		DataLine.Info info = new DataLine.Info(Clip.class, format);

		try {

			clip = (Clip) AudioSystem.getLine(info);
			clip.open(stream);

		} catch (LineUnavailableException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	public void carregarVoz() {

		try {

			File file = new File(arquivosCursos.getDiretorioVozes()
					+ nomeArquivoVozes.get(posVoz));

			stream = AudioSystem.getAudioInputStream(file);

			format = stream.getFormat();

		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		criarLinha();

	}

	public void avancarVoz() {

		if ((nomeArquivoVozes.size() - 1) > posVoz) {
			posVoz++;
		}

	}

	public void voltarVoz() {

		if (posVoz > 0) {
			posVoz--;
		}

	}

	public void tocarVoz() {

		clip.start();

	}

	public void pararVoz() {

		clip.stop();
	}

}
package mult.test;

import mult.controladores.ArquivosCursos;
import mult.controladores.Cursos;
import mult.controladores.Vozes;

public class TesteVozes {
	
	public static void main(String[] args) {
		
		ArquivosCursos arquivosCursos = new ArquivosCursos(Cursos.WIN_XP_BASICO);
		Vozes vozes = new Vozes(arquivosCursos);
		vozes.carregarVoz();
		vozes.tocarVoz();
		
	}

}

Alguem poderia me ajudar ? o que estou fazendo de errado ?

Agradecido.

9 Respostas

Marky.Vasconcelos

Uma coisa… o javax.sound não consegue tocar arquivos mp3, ogg e wma se não me engano.

Seria interessante usar o JLayer da JavaZOOM.

Com ele voce pode simplesmente fazer o seguinte para tocar:

Player p = new Player(new File("arquivo de som"));
p.play();
Filipe_A

Ola mark, tudo blz com vc ?

… bom o arquivo é .wav deveria tocar não é ?

Sobre o JLayer, eu ja tentei usa-lo uma vez, mas se eu não me engano ele parava toda a minha aplicação enquanto tocava o som.

Ou será que usava ele de forma errada ? tem uma solução pra isso ?

Valeu pela ajuda !
t+ :smiley:

Link_pg

Cara, to com um projeto de um Messenger/Player parado que pretendo retomar. Lá tem minha classe Musica que reproduz mp3.

Aqui eu postei uma vez também:
http://www.guj.com.br/posts/list/90107.java#482261

JMessengerPlayer
http://code.google.com/p/jmessengerplayer/

Abraços

Marky.Vasconcelos

Era só criar ele em outra Thread.

new Thread(new Runnable(){
public void run(){
Player p = new Player(musica);
p.play();
}
}).start();
Filipe_A
  • Valeu mark, vou testar aqui em uma nova thread.

  • Link, baixei sua classe Musica mas ela tem outras classes importadas parece ? ñ deu pra testar.

Bom vou ver aqui no que da … tomara que funcione, depois posto respostas.

Em relação a classe que eu postei, vcs sabem me dizer se tem algo errado nela ?

Mais uma vez obrigado, pela colaboração. :slight_smile:

Link_pg

Fora essa classe tem alguns Jars que precisam ser adicionados como referência no projeto. Se vocÊ olhar la na parte Source do link que eu te passei do google code tem o projeto inteiro lá.

Abraços

Filipe_A

Mark, eu fiz algo com o Jlayer aqui…

veja como ficou

package mult.controladores;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class Vozes implements Runnable {

	private Player player;
	private ArquivosCursos arquivosCursos;
	private List<File> arquivoVozes;
	private int posVoz;

	public Vozes(ArquivosCursos arquivosCursos) {

		this.arquivosCursos = arquivosCursos;
		carregarNomeVozes();

	}

	private void carregarNomeVozes() {

		try {

			arquivoVozes = new ArrayList<File>();

			FileReader leitor1 = new FileReader("NomeVozes/"
					+ arquivosCursos.getArquivoCurso());
			BufferedReader leitor2 = new BufferedReader(leitor1);

			String nome = null;

			while ((nome = leitor2.readLine()) != null) {

				arquivoVozes.add(new File(arquivosCursos.getDiretorioVozes()
						+ nome));

			}

			leitor2.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void carregarVoz() {

		try {
			FileInputStream leitor1 = new FileInputStream(arquivoVozes
					.get(posVoz));
			BufferedInputStream leitor2 = new BufferedInputStream(leitor1);
			player = new Player(leitor2);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void avancarVoz() {

		if ((arquivoVozes.size() - 1) > posVoz) {
			posVoz++;
		}

	}

	public void voltarVoz() {

		if (posVoz > 0) {
			posVoz--;
		}

	}

	private void tocarVoz() {

		try {
			player.play();
			
		} catch (JavaLayerException e) {
			e.printStackTrace();

		}

	}

	@Override
	public void run() {
		tocarVoz();
		
	}

}

ai no main eu faço

Thread thread = new Thread(new Vozes());
thread.run();

só que ainda assim ta parando minha aplicação.

O que esta faltando fazer ?

t+ :frowning:

Filipe_A

Nossa parece que resolvi aqui…

eu tava fazendo thread.run() ai olhei que vc tinha postado thread.start()

ai funcionou…

Valeu , preciso estudar mais thread.

Mas obrigado, parece que ficou bom agora :smiley:

Marky.Vasconcelos

Minha classe Musica??

Acho que deve ser algo que postei muito tempo atrás e nem se quer terminei.

Deixei o projeto de lado e vou ver mais sobre sintetizadores de sons… parece mais divertido XD

Ainda bem que funcionou.

Criado 16 de setembro de 2009
Ultima resposta 18 de set. de 2009
Respostas 9
Participantes 3