2011-04-27 2 views
2

내 스윙 응용 프로그램에서 마우스를 클릭하면 소리를 재생하는 클래스를 사용하고 있습니다. 내가 가지고있는 문제는 소리가 한 번 재생되는 클래스를 호출 할 때 갑자기 다른 버튼을 클릭하면 소리가 재생되지 않습니다. 나는 내 코드에서 지연을 주려고했지만, ID는 예상대로 작동하지 않는다. 스레드와 관련이 있습니까 ?? 나는 실이 좋지 않아 그렇게하는 법을 말해줘. 내가 사용하고있는 코드는Java에서 AudioPlayer로 작업

package utilities; 
import java.applet.AudioClip; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import sun.audio.AudioData; 
import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 
import sun.audio.ContinuousAudioDataStream; 
public class Tone {` 

    File wavFile = new File("sounds/Windows Default.wav"); 
    URL urlClick = Tone.class.getResource("/sounds/WindowsDefault.wav"); 
    AudioClip sound; 
    public void sound() { 
     AudioStream as = null; 
     try { 

      InputStream in = this.getClass().getResourceAsStream("/sounds/WindowsDefault.wav"); 
      as = new AudioStream(in); 
      AudioData data = as.getData(); 
// Create ContinuousAudioDataStream. 
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data); 
      //System.out.println(as.getLength()); 
      AudioPlayer.player.start(cas); 

      //System.out.println(urlClick); 
       //sound = Applet.newAudioClip(urlClick); 
     //this.wait(1000); 
      for(int i =0;i<100000;i++){ 
       double k = Math.pow(i, 5); 
       if(i==99999){ 
        AudioPlayer.player.stop(cas); 
        return; 
       } 
      } 
      // sound.play(); 
      String relativeDirectory = System.getProperty("user.dir"); 
      System.out.println(relativeDirectory); 

     } catch (IOException ex) { 
      Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       as.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 

    } 

    public static void main(String[] args) { 
Tone tone = new Tone(); 
tone.sound(); 
System.out.println("done"); 

    } 
} 

--EDIT-- 내가이 aleast 어떤 소리를들을 사용할 때 소리가 전혀 발생하지 않았기 때문에 continuousaudiostream가 사용되는 이유는, 다음과 같습니다. AudioStream을 사용할 때도 문제가있었습니다.

+1

사용'javax.sound .sampled.Clip' 또는'sun. * '클래스로 파고 쓰는 대신 직접'AudioInputStream'을 사용하십시오. –

+0

메서드를 직접 호출하면 (애플릿 외부에서) 사운드를 두 번 재생할 수 있습니까? –

+0

아니요, 직접 메소드를 호출해도 아무 소리도 들리지 않습니다. 내가 직접 말하면, main()에서 호출합니다 – Deepak

답변

3

1) 더 나은 숨겨진 클래스/API를 사용하지를 재설정 해보십시오 시작/다시 열고 다시 같은 공공 API를 뭔가 :

Clip clip; 

private void doPlay(final String url) { 
    try { 
     stopPlay(); 
     AudioInputStream inputStream = AudioSystem 
       .getAudioInputStream(getClass().getResourceAsStream(url)); 
     clip = AudioSystem.getClip(); 
     clip.open(inputStream); 
     clip.start(); 
    } catch (Exception e) { 
     stopPlay(); 
     System.err.println(e.getMessage()); 
    } 
} 

private void stopPlay() { 
    if (clip != null) { 
     clip.stop(); 
     clip.close(); 
     clip = null; 
    } 
} 

(참고 : 다시 시작/중지으로 만 완전히 폐쇄 된 후 한 번에로드 할 논리를 수정)

+0

멈추고 시작하고 싶지 않습니다. 나는 단지 클릭 사운드를 2 초 이상 재생하고 싶지 않다. 그래서 모든 클릭에 대해 한 번 재생하고 싶습니다. 클릭 이벤트가 생성 될 때 사운드가 시작되면 anythign은 다음 클릭 이벤트가 .wav 파일을 다시 재생하기 위해 sound() 메서드를 다시 호출하지 않습니다. 나는 그렇게 생각하지 않는다. 내가 틀렸다면 나에게 설명해라. – Deepak

+0

또한 나의 편집을 점검해라. ... – Deepak

+1

@Deepak : "단지 두 번째 이상의 클릭 소리를 내고 싶지 않다." 'Clip.isRunning()','Clip.isActive()','LineListener', 그리고'javax.swing.Timer'를보십시오. 당신은 그 중 일부 조합을 사용하여 대답을 찾을 수 밖에 없습니다. –

1

ContinuousAudioDataStream은 파일 끝에 도달 한 후에 만 ​​다시 설정되기 때문에 두 번째 버튼 클릭이 발생하기 전에 발생할 수 있습니다./전에 이미 실행중인 사운드를 닫습니다 당신은 이미 당신이

2) 중지 :-) 다른 질문을 가지고 링크에서 읽은대로 - 아마 스트림

+0

내 편집 확인 ... – Deepak