Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/11/2011, 00:49
Avatar de calichecal
calichecal
 
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 14 años, 11 meses
Puntos: 12
Respuesta: En la busqueda de la clase perfecta para audio en java

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<hiloSonidolAudios;
     

     
     
     
  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.SEVEREnullex);
            } catch (
IOException ex) {
               
                
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVEREnullex);
            } catch (
LineUnavailableException ex) {
               
                
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVEREnullex);
            }
         }
         
        @
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.SEVEREnullex);
            }
            
            
// 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<hiloSonidoelementsToDelete = new LinkedList<hiloSonido>();
            for (
hiloSonido singleObjectlAudios){
                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 singleObjectlAudios){
                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?
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-

Última edición por calichecal; 26/11/2011 a las 01:06