2010-09-23 12 views
14

Estoy trabajando con un software de manejo de SMS, basado en Java y quiero reproducir un sonido de bip/alerta cada vez que recibimos un mensaje. Intenté buscar en las bibliotecas de java.sound y no pude encontrar nada. No sé si usar la forma de applet de reproducir un sonido estará bien en una aplicación java. ¿Hay algún sonido predefinido en cualquier biblioteca de Java que podamos llamar en una aplicación? ¡Cualquier apuntador será apreciado!¿Cómo se reproduce un sonido (alerta) en una aplicación java?

Respuesta

6

Usted puede echar un vistazo al método pitido dentro de la clase Toolkit, como se muestra here

2

La ruta del applet debe estar bien (y es muy sencillo). Para evitar crear una instancia de Applet, puede usar el método estático newAudioClip y luego llamar al play() en el AudioClip creado.

URL url = getClass().getResource("/foo/bar/sound.wav"); 
AudioClip clip = Applet.newAudioClip(url); 
clip.play(); 
+0

idea de por qué esta respuesta no es ampliamente utilizado? Parece extremadamente simple y útil ... – RaKXeR

37

Si lo que desea es un bip o una alarma rápida tratan

Toolkit.getDefaultToolkit().beep(); 
+1

Esto podría no funcionar en Linux. – Augustin

+0

FYI, funciona bien en Windows 10. Gracias – Nabin

+1

import java.awt.Toolkit; –

1

Si desea utilizar el paquete de sonido para reproducir un archivo de sonido arbitraria, puede utilizar el paquete javax.sound.sampled. Aquí está el código que jugará un archivo de sonido:

 
private void playSound(File f) { 
    Runnable r = new Runnable() { 
     private File f; 

     public void run() { 
      playSoundInternal(this.f); 
     } 

     public Runnable setFile(File f) { 
      this.f = f; 
      return this; 
     } 
    }.setFile(f); 

    new Thread(r).start(); 
} 

private void playSoundInternal(File f) { 
    try { 
     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(f); 
     try { 
      Clip clip = AudioSystem.getClip(); 
      clip.open(audioInputStream); 
      try { 
       clip.start(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       clip.drain(); 
      } finally { 
       clip.close(); 
      } 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } finally { 
      audioInputStream.close(); 
     } 
    } catch (UnsupportedAudioFileException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

¿Puede explicar por qué necesitamos el hilo para dormir después de llamar a clip.start()? – lucks

+0

Ha pasado un tiempo desde que escribí este código, pero supongo que probablemente funcione igual de bien con un 'Thread.yield()'. –

+0

Me refería a por qué tenemos que bloquear en primer lugar, pero me di cuenta de que es probablemente porque cerramos la línea antes de que termine de jugar – lucks

23

Puede generar su propio sonido si busca algo menos aburrido que un pitido() sin un archivo de sonido externo.

import javax.sound.sampled.*; 

public class SoundUtils { 

    public static float SAMPLE_RATE = 8000f; 

    public static void tone(int hz, int msecs) 
    throws LineUnavailableException 
    { 
    tone(hz, msecs, 1.0); 
    } 

    public static void tone(int hz, int msecs, double vol) 
     throws LineUnavailableException 
    { 
    byte[] buf = new byte[1]; 
    AudioFormat af = 
     new AudioFormat(
      SAMPLE_RATE, // sampleRate 
      8,   // sampleSizeInBits 
      1,   // channels 
      true,  // signed 
      false);  // bigEndian 
    SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
    sdl.open(af); 
    sdl.start(); 
    for (int i=0; i < msecs*8; i++) { 
     double angle = i/(SAMPLE_RATE/hz) * 2.0 * Math.PI; 
     buf[0] = (byte)(Math.sin(angle) * 127.0 * vol); 
     sdl.write(buf,0,1); 
    } 
    sdl.drain(); 
    sdl.stop(); 
    sdl.close(); 
    } 

    public static void main(String[] args) throws Exception { 
    SoundUtils.tone(1000,100); 
    Thread.sleep(1000); 
    SoundUtils.tone(100,1000); 
    Thread.sleep(1000); 
    SoundUtils.tone(5000,100); 
    Thread.sleep(1000); 
    SoundUtils.tone(400,500); 
    Thread.sleep(1000); 
    SoundUtils.tone(400,500, 0.2); 

    } 
} 

experimentos sonoros más aquí: Produce special sound effect

Cuestiones relacionadas