2014-12-20 2 views
1

Привет, У меня есть класс звука для моего приложения, и он воспроизводит определенный звук, когда я говорю об этом тоже. Я хочу, чтобы быть в состоянии обнаружить, когда звук закончил играть, так что я могу затем играть другой звук без них над притиркой вот мой звук класс:Java Detecing при остановке звука

public class Sound { 

public static final Sound cash = new Sound("/cash.wav"); 
public static final Sound snap = new Sound("/snap.wav"); 
public static final Sound disarm = new Sound("/disarm.wav"); 
public static final Sound tp = new Sound("/tp.wav"); 
public static final Sound select = new Sound("/selectBTN.wav"); 
public static final Sound scroll = new Sound("/btn.wav"); 
public static final Sound fire = new Sound("/fire2.wav"); 

private AudioClip c; 

public Sound(String filename) { 
    try { 
     c = Applet.newAudioClip(Sound.class.getResource(filename)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void play() { 
    try { 
     new Thread() { 
      public void run() { 
       if (!title.mute) { 

        c.play(); 
       } 
      } 
     }.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

затем для воспроизведения звука я использую эта строка кода:

Sound.cash.play(); 

Как я могу определить, когда звук закончил играть

ответ

1

Попробуйте что-то вроде этого (является aproximation), с LineListener для обнаружения Конец игры:

import javax.sound.sampled.AudioInputStream; 
    import javax.sound.sampled.AudioSystem; 
    import javax.sound.sampled.Clip; 
    import javax.sound.sampled.LineEvent; 
    import javax.sound.sampled.LineEvent.Type; 
    import javax.sound.sampled.LineListener; 

    public class Sound { 


     private Clip     c; 

     public Sound(final String filename) { 
      try { 
       c = AudioSystem.getClip(); 
       final AudioInputStream inputStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(filename)); 
       c.open(inputStream); 
       c.addLineListener(new LineListener() { 

        @Override 
        public void update(final LineEvent event) { 
         if (event.getType().equals(Type.STOP)) { 
          System.out.println("Do something"); 
         } 
        } 
       }); 
      } catch (final Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public void play() { 
      c.start(); 
     } 

     public static void main(final String[] args) throws InterruptedException { 
      final Sound s = new Sound("/cash.wav"); 
      s.play(); 
      Thread.sleep(100000); 
      final Sound p = new Sound("/cash.wav"); 
      p.play(); 
      Thread.sleep(10000); 
     } 
    } 
+0

это работает, но по какой-то причине, когда я играю звук это обыкновение играть снова, как я могу это исправить – user2279603

+0

Его, кажется, что вы можете использовать один и тот же звуковой объект, см http://stackoverflow.com/вопросы/9999961/песни-игры-первый раз, но, действительно, не-игра-раз-остановленный клип-в-Java – rafalopez79