2017-02-24 4 views
3

이것은 테스트 파일 일뿐입니다. 저는 Sound 클래스를 가지고 있으며 다른 메인 클래스에서 호출하고 있습니다. 3 초 동안 재생 한 다음 정지하면 다시 재생되지 않습니다. 무엇이 문제일까요?Java 사운드가 멈추면 작동하지 않습니다.

이것은 나를 미치게합니다.

사운드 클래스

public class Sound { 

    private static URL url1, url2, url3, url4; 
    private static AudioClip gun, boom; 
    private static Clip menuClip, gameClip; 
    private static AudioInputStream menu, game; 

    public static boolean menuPlaying, gamePlaying, explosionOn; 

    public Sound() { 
     menuPlaying = false; 
     gamePlaying = false; 
     url1 = Sound.class.getResource("/laserSound.wav"); 

     url2 = Sound.class.getResource("/boom.wav"); 

     url3 = Sound.class.getResource("/adventure.wav"); 

     url4 = Sound.class.getResource("/adventure.wav"); 

     gun = Applet.newAudioClip(url1); 

     boom = Applet.newAudioClip(url2); 

     try { 
      game = AudioSystem.getAudioInputStream(url4); 
      //menu = AudioSystem.getAudioInputStream(url3); 
     } catch (UnsupportedAudioFileException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void playGunSound() { 
     gun.play(); 
    } 

    public void stopGunSound() { 
     gun.stop(); 
    } 

    public void playExplosion() { 
     boom.stop(); 
     boom.play(); 
    } 

    public void stopExplosion() { 
     boom.stop(); 
    } 
    public void playGameMusic() throws LineUnavailableException { 
     if (gamePlaying == false) { 
      gameClip = AudioSystem.getClip(); 
      try { 
       gameClip.open(game); 
      } catch (
      LineUnavailableException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      gameClip.start(); 
      gameClip.loop(Clip.LOOP_CONTINUOUSLY); 
      gamePlaying = true; 
     } 
    } 

    public void stopGameMusic() { 
      gameClip.stop(); 
      gamePlaying = false; 

    } 

} 

홈페이지 방법

public static void main(String[] args) throws LineUnavailableException, InterruptedException { 
    Sound sound = new Sound(); 
    sound.playGameMusic(); 
    TimeUnit.SECONDS.sleep(3); 
    sound.stopGameMusic(); 
    TimeUnit.SECONDS.sleep(3); 
    sound.playGameMusic(); 
} 
+0

디버깅을 시도 했습니까? 새로운'Sound' 객체를 인스턴스화하면 어떨까요? –

+0

예, 새 Sound 객체를 인스턴스화 할 때 작동합니다. 여전히 인스턴스화하지 않고 작동하지 않는 이유를 알고 있지만 당신의 도움을 주셔서 감사합니다 ... :) @ SkaryWombat – KiranGautam

+0

아마 재생 메서드를 호출 한 후에 리소스를 해제해야 재생 사운드를 재생할 때 다시 재생됩니다 – SoulRayder

답변

1

코드는 이제 약자 방법, 정리해야 할 몇 가지 흥미로운 일이있다.

우선, gameClip.open을 별도의 메서드에 넣는 것이 좋습니다. 한 번만 클립을 열면됩니다. 종료하지 않는 한 마음대로 시작하고 중지 할 수 있습니다. 각 플레이마다 클립을 여는 것이므로 클립을 재생하기 전에 전체 사운드 파일을 메모리에로드해야합니다. 이것은 Clip 객체의 목적을 상실합니다.

둘째, 시작 다음에 루프가있는 것이 중복됩니다. 어느 것이 든 클립을 재생합니다. 연속적으로 반복 재생을 원한다면 시작이 아닌 루프 메서드 만 호출하면됩니다.

이 두 가지를 정리 한 후에 코드를 다시 살펴보고 문제가 사라 졌는지 확인하십시오. 발생하는 문제가 특정 오류로 인한 것인지 또는 두 개의 중복 코드 작업 중 하나가 정의되지 않은/예기치 않은 상황을 일으키는 지 여부는 확실하지 않습니다.

Clip API를 보았습니까?

저는 AudioClip에 익숙하지 않습니다. 그러나 Clip을 성공적으로 사용했습니다.

+0

고맙습니다. gameClip.open을 별도의 메서드에 넣으면 불필요한 시작을 제거하고 완벽하게 작동합니다. 도와 줘서 고마워. – KiranGautam

관련 문제