2013-07-21 4 views
0

У меня есть простой метод Clip, чтобы воспроизводить небольшие звуки wav. Да, я нашел метод clip.loop() прямо сейчас, но в любом случае я не могу понять, почему мой метод не работает.java Clip loop не работает

Heres код:

public void playSound(final String sound, final boolean loop, final int repeatTime){ 
    try { 
     sounds.get(sound).open(); 
    } 
    catch(Exception e) { 
     System.out.println(e); 
    } 
    new Thread(new Runnable() { 
     public void run() { 
      int repeatCount = 1; 
      Clip actualClip = sounds.get(sound); 
      actualClip.setFramePosition(0); 
      actualClip.start(); 
      while(true){ 
       System.out.println("repeat c: " + repeatCount + ", frames left: " + (actualClip.getFrameLength() - actualClip.getFramePosition())); 
       if(actualClip.getFramePosition() >= actualClip.getFrameLength()){ 
        actualClip.stop(); 
        actualClip.setFramePosition(0); 
        actualClip.start(); 
        repeatCount++; 
       } 
       if(!loop && repeatCount > repeatTime){ 
        break; 
       } 
      } 
      actualClip.stop(); 
     } 
    }).start(); 
} 

его Струнный звук, becaus им получать его из HashMap. Когда я назову его

playSound(key, false, 10); 

Звук повторяет себя 10 раз. Но когда я назову это снова, (я делаю это с помощью кнопки), его воспроизведение всего 4 - 8 раз, поэтому цикл не работает правильно. Что я делаю неправильно?

Спасибо!

+0

1) Для лучшей помощи раньше, отправьте сообщение [SSCCE] (http://sscce.org/). 2) «Клип» не требует отдельного «потока». –

+0

Я предполагаю, что это должно быть 'if (! Loop || repeatCount> repeatTime)'. Кстати, почему бы не использовать 'for' вместо' while'? Это сделает ваш код более читаемым. – Elist

+0

Спасибо ... это актуально sscce o.O ok fail ... действительно, это должно быть и. – GFP

ответ

1
  • if(!loop || repeatCount > repeatTime) должно быть ИЛИ, а не И.
  • Использование for цикл вместо while.
  • Проблема, вероятно, в том, что вы пытаетесь снова и снова использовать один и тот же клип open. Чтобы сделать это, вы должны сначала получить новый AudioInputStream, который будет open ed этим Clip.
+0

Спасибо, что это действительно должно быть или. В то время как истинный цикл - как я могу использовать здесь? И я просто открываю его, когда он закончил. – GFP

Смежные вопросы