2010-09-23 7 views
14

Je travaille avec un logiciel de gestion de SMS, basé sur Java et je veux jouer un bip/alerte sonore chaque fois que nous recevons un message. J'ai essayé de regarder les bibliothèques java.sound et je n'ai rien trouvé. Je ne sais pas si aller à l'applet façon de jouer un son sera bien dans une application Java! Existe-t-il des sons prédéfinis dans les bibliothèques Java que nous pouvons appeler dans une application? Tous les pointeurs seront appréciés!Comment jouer un son (alerte) dans une application java?

Répondre

6

Vous pouvez jeter un oeil à la méthode bip dans la classe de boîte à outils, comme le montre here

2

La route de l'applet doit être fine (et est très simple). Pour éviter de créer une instance d'applet, vous pouvez utiliser la méthode statique newAudioClip, puis appeler le play() sur le AudioClip créé.

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

toute idée pourquoi cette réponse n'est pas largement utilisé? Il semble extrêmement simple et utile ... – RaKXeR

37

Si vous voulez juste un bip ou une alerte rapide essayer

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

Cela pourrait ne pas fonctionner sous Linux. – Augustin

+0

FYI, fonctionne bien sur Windows 10. Merci – Nabin

+1

d'importation java.awt.Toolkit; –

1

Si vous voulez utiliser le package audio pour lire un fichier son arbitraire, vous pouvez utiliser le package javax.sound.sampled. Voici le code qui va jouer un fichier sonore:

 
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

Pouvez-vous expliquer pourquoi nous avons besoin du thread pour dormir après avoir appelé clip.start()? – lucks

+0

Cela fait un moment que j'ai écrit ce code, mais je suppose qu'il fonctionnerait probablement aussi bien avec un 'Thread.yield()'. –

+0

Je parlais de pourquoi nous devons bloquer en premier lieu, mais je me suis rendu compte que c'est probablement parce que nous fermions la ligne avant qu'elle ne finisse de jouer – lucks

23

Vous pouvez générer votre propre son, si vous cherchez quelque chose de moins ennuyeux qu'un bip() sans fichier audio externe.

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

    } 
} 

Des expériences plus sonores ici: Produce special sound effect