当clip.stop()时,AudioSystem剪辑不会停止播放;运行

时间:2014-01-22 13:19:36

标签: java audio clip

每当运行此子程序时,我需要制作一个播放声音片段的音频播放器。它还必须在播放新的声音片段之前停止它。

我遇到的问题是剪辑从未注册为正在运行。检查它是否正在运行的两个if语句都没有使用过。这意味着剪辑仅在完成时停止,并且它们可以重叠,并破坏程序。

我会使用clip.stop();在其他子程序中,但它会告诉我无法找到“剪辑”符号。我不知道如何使其可供其他子程序使用。

我可以获得clip.stop()的唯一方法;在这个子程序中工作是在clip.start()之后直接放置它。线,在开始后立即停止剪辑,因此根本没有听到。

下面是我用来播放音频片段的子程序。

public void play(String filename){
    try {
        Clip clip = AudioSystem.getClip();
        audFile = audDir + filename;
        if (clip.isRunning()){
            System.out.println("Sounds playing 1");
            clip.stop();
        }
        clip.open(AudioSystem.getAudioInputStream(new File(audFile)));
        clip.start();
        if (clip.isRunning()){
            System.out.println("Sounds playing 2");
            clip.stop();
        }
    } catch (Exception exc) {
        exc.printStackTrace(System.out);
    }
}

1 个答案:

答案 0 :(得分:1)

  

我会使用clip.stop();在其他子程序中,但它会告诉我   无法找到“剪辑”符号。我不知道怎么做   可供其他子程序使用。

在您的班级中声明私人剪辑字段

private Clip clip;

并在从AudioSystem.getClip()获取时设置它。

/*
 * clip (local variable) is invisible from other methods
 */
Clip clip = AudioSystem.getClip(); 
this.clip = clip; // `this.clip` is a field, it's visible from other methods

然后你可以从其他方法访问它(“子例程”是Java中的类方法)。

  

我遇到的问题是剪辑从未注册为正在运行。

当您拨打clip.isRunning()时它没有运行,但您确定从不正在运行吗?

您不能认为clip.isRunning()true之后立即返回clip.start()。该机制是异步的,它可能有助于注册LineListener并收听START事件。

clip.start();
LineListener listener = new LineListener() {
    public void update(LineEvent event) {
    if (event.getType() == LineEvent.Type.START) {
            /*
             * here you are sure the clip is started
             */
        }
    }
};
clip.addLineListener(listener );