Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/11/2011, 14:10
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 a todos, al fin solucione este problema del sonido y es algo que me sorprende que no sea halla tenido en cuenta en tutoriales y que tiene que ver con el lenguaje Java, no con el pc. A que me refiero:

la típica rutina para reproducir un audio:

Código:
 try {
            
          
            Clip sonido = AudioSystem.getClip();
            
          
            sonido.open(AudioSystem.getAudioInputStream(new File("sonido.wav")));
            
            
            sonido.start();
            
            // Espera mientras se esté reproduciendo.
            while (sonido.isRunning())
                Thread.sleep(1000);
            
           
            sonido.close();
        } catch (Exception e) {
          
        }
El problema que encontre, es que a veces el tipico método isRunning devuelve false, aun cuando del sonido ya se halla iniciado con start, y lo mismo ocurre con isActive, entonces acá es mejor tener un do while.


Código:
  
do{
 Thread.sleep(1000);
 }while (sonido.isRunning());
o con isActive().

y de seguro que nunca fallará.

y todo esto porque: ni idea no puedo ver el codigo del método "start" de la clase "Clip", pero supongo que tiene que ver con la creación de un hilo que se encarga de tomar el contenido del audio por partes, y hacer un poconon de procesos. Pero lo que si es cierto es que el do-while, da tiempo a que el metodo start haga todo su trabajo, incluido el necesario para que isRunning devuelva lo que tiene que ser.


chao.

me respondi solo pero bueno los foros son para eso: ayudar y compartir.


para el que la necesite:

la clase ideal para reproducir en java es:

código java:
Código PHP:


  
public class hiloSonido extends Thread{
        
           
            private 
Clip sonido;
            private 
boolean seguir;
            
        

         public 
hiloSonido(String rutaArchivo){
           
            
seguir=true;
            try {
                
sonido AudioSystem.getClip();
                
sonido.open(AudioSystem.getAudioInputStream(new File(rutaArchivo)));
                
            } 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.
            
do{
                try {
                
Thread.sleep(500);
            } catch (
InterruptedException ex) {
                
Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVEREnullex);
            }
                
            }while (
seguir && sonido.isActive());
            
            if(
sonido.isActive()){
                
sonido.stop();
            }
            
            
// Se cierra el clip.
            
sonido.close();
          
         
         }
        
        public 
void parar(){
            
seguir=false;
        }
         
     } 
__________________
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 14:24