hola ,hice otro intento con el objeto Clip, pero a veces no reproduce a pesar de que cada sonido esta en un hilo diferente:
(mantengo la referencia a los hilos(los guardo en una lista), para poder "matar" a los activos en cualquier momento)
código java
Código PHP:
import Gui.MarcoPrincipal;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class ReproduceSonido {
private boolean sonido;
private String directorio;
private File[] vAudios;
private LinkedList<hiloSonido> lAudios;
public ReproduceSonido(){
sonido=true;
vAudios=new File[7];
lAudios=new LinkedList<hiloSonido>();
String carpeta;
if(MarcoPrincipal.getSo().equals("Linux")){
carpeta="/Audio/";
}else{
carpeta=String.valueOf((char)(92))+"Audio"+String.valueOf((char)(92));
}
directorio=MarcoPrincipal.getDirectorioAplicacion()+carpeta;
vAudios[0]=new File(this.directorio+"Acierto.au");
vAudios[1]=new File(this.directorio+"Error.au");
vAudios[2]=new File(this.directorio+"Introduccion.au");
vAudios[3]=new File(this.directorio+"PulsaBoton.au");
vAudios[4]=new File(this.directorio+"Contestarprimero.au");
vAudios[5]=new File(this.directorio+"Inicioprueba.au");
vAudios[6]=new File(this.directorio+"Pocotiempo.au");
}
public boolean isSonido() {
return sonido;
}
public void setSonido(boolean sonido) {
this.sonido = sonido;
}
// clase anidada para los hilos
class hiloSonido extends Thread{
private Clip sonido;
private boolean seguir;
hiloSonido(File archivo){
seguir=true;
try {
sonido = AudioSystem.getClip();
sonido.open(AudioSystem.getAudioInputStream(archivo));
} catch (UnsupportedAudioFileException ex) {
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
} catch (LineUnavailableException ex) {
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run(){
sonido.start();
// Espera mientras se esté reproduciendo.
while (seguir && sonido.isRunning())
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
}
// por si el ciclo termina por seguir:false
if(sonido.isRunning()){
sonido.stop();
}
// Se cierra el clip.
sonido.close();
}
public void parar(){
seguir=false;
}
}
// fin clase anidada para los hilos
// se llama a start cuando se quiere reproducir un audio y solo se le pasa el indice predeterminado para este (no es muy POO que digamos :P)
public void start(int indice){
//remuevo hilos muertos de lista
if(!lAudios.isEmpty()){
LinkedList<hiloSonido> elementsToDelete = new LinkedList<hiloSonido>();
for (hiloSonido singleObject: lAudios){
if(!singleObject.isAlive()){
elementsToDelete.add(singleObject);
}
}
lAudios.removeAll(elementsToDelete);
}
if (sonido) {
hiloSonido hs = new hiloSonido(this.vAudios[indice]);
hs.start();
lAudios.add(hs);
}
}
public void stop(){
// paro todas las reproducciones y limpio la lista
if(!lAudios.isEmpty()){
for (hiloSonido singleObject: lAudios){
if(singleObject.isAlive()){
singleObject.parar();
}
}
lAudios.clear();
}
}
}
agradezco cualquier ayuda o idea del porque no reproduce a veces. Es que he hecho como 10 clases y ninguna me sirve.
PD:En el software: el sonido: "PulsaBoton", suena cada vez que algun JButton se oprima, pero cuando estos se oprimen muy seguido es cuando comienzan a fallar las reproducciones.
¿será que me toca meterme con JMF?