Pessoal, estou fazendo um programa, que é pra fazer uma rádio. Então, estou usando o JMF pra execução de musicas. Fiz os botoes de controle de musica (anterior, proxima, play, pause, stop). Falta implementar o caso onde , da lista de reprodução, quando acabar uma musica, o programa já passa para a próxima. Algumas pessoas disseram para usar Threads, olhei o material de Threads só que não sei onde aplicar no projeto.
Tentei fazer com um While para pegar o ‘getMediaTime()’ e comparar com o ‘getMediaDuration’, se fossem iguais , ele parava e passava pra próxima, mas não dar certo. O While trava o programa, até sair do bloco.
O Projeto tem uma classe ‘Reprodutor’ que é onde fica o player. Acho que é essa classe que ‘implements’ o Runnable.
Alguem me ajuda por favor ?
O mais adequado seria usar Thread mesmo para não ‘travar o programa’. Assim você poderá fazer duas coisas ao mesmo tempo como adicionar musica/remover/mudar etc. Se você não saber usar Thread o mais adequado é perquisar no google já que ele é um melhor professor do que eu.
Mas continuando, você pode criar uma classe do tipo
private class GerenciaMusicas extends Thread{
private List<Musica> playList = new ArrayList<>();
private Musica musicaTocando;
private boolean TocadorParado = true;
@Override
public void run() {
while(true){
// verifica se esta tocando alguma música, caso não aguarda nesse loop até o usuário escolher uma
while(){}
//verifica se a música acabou
if(){//sim
//troca de musica (tem que ser synchronized )
}
else{
//sleep aqui para não ficar verificando se a música acabou milhares de vezes por segundo
}
}
}
public synchronized void addMusica( Musica m ) {..}
public synchronized void removeMusica( Musica m ) {..}
}
Pelo menos foi isso que eu entendi, e essa a solução que pensei
O correto seria usar wait() e notify() mas acho que essa solução da pro gasto, dps você melhora;
Eu prefiro fazer uma classe que implementa Runnable …
e depois criar a thread passando a classe por parametro.
acho que fica melhor, além de possibilidar que crie outras interfaces para padronizar melhor a estrutura que a thread deve ter
(por ex.: os métodos adicionarMusica, removerMusica etc)
Abraços!!
Valeu galera, vou tentar fazer isso aqui.
magostta, olha aq, no projeto tem a Classe Reprodutor, que ela cria o player. Ela ta assim:
[code]import java.io.File;
import javax.media.Manager;
import javax.media.Player;
import javax.media.Time;
//import java.sql.Time;
/**
*
*
*/
public class Reprodutor {
private Player player;
private Time time;
public Reprodutor(Musica musica){
time = new Time(0.0);
try {
File f = new File("Musicas/"+musica.getLocal().substring(11,musica.getLocal().length()));
player = Manager.createRealizedPlayer(f.toURI().toURL());
} catch (Exception e) {
System.out.println("Arquivo não encontrado");
}
}
public void reproduzir(){
player.setMediaTime(time);
player.start();
}
public void stop(){
player.stop();
}
public void pause(){
time = player.getMediaTime();
player.stop();
}
public double getTime(){
return player.getMediaTime().getSeconds();
}
public double getDuracao(){
return player.getDuration().getSeconds();
}
}
[/code]
Ai tipo, la na tela onde reproduz, eu crio um reprodutor e passo a musica como parametro e tal. Esse codigo que você mandou, da pra fazer no reprodutor ? Pq nao sei se daria p passar a musica como parametro desse jeito q você falou.
Agradeço desde já ;D