停止方法不起作用

时间:2010-04-18 20:59:17

标签: java audio

任何人都可以告诉我为什么以下代码无法正常工作? 我想播放并停止播放音频文件。 我可以进行播放,但每当我点击停止按钮时都没有任何反应。 这是代码: 谢谢。

..................

import java.io.*;
import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.event.*;

public class SoundClipTest extends JFrame {

    final JButton button1 = new JButton("Play");
    final JButton button2 = new JButton("Stop");
    int stopPlayback = 0;

    // Constructor
    public SoundClipTest() {

        button1.setEnabled(true);
        button2.setEnabled(false);

        // button play
        button1.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent e) {

                    button1.setEnabled(false);
                    button2.setEnabled(true);

                    play();
                }// end actionPerformed
            }// end ActionListener
            );// end addActionListener()          

        // button stop
        button2.addActionListener(
            new ActionListener() {

                public void actionPerformed(
                    ActionEvent e) {
                    //Terminate playback before EOF

                    stopPlayback = 1;

                }//end actionPerformed
            }//end ActionListener
            );//end addActionListener()

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Test Sound Clip");
        this.setSize(300, 200);
        JToolBar bar = new JToolBar();
        bar.add(button1);
        bar.add(button2);
        bar.setOrientation(JToolBar.VERTICAL);
        add("North", bar);
        add("West", bar);
        setVisible(true);
    }

    void play() {

        try {

            final File inputAudio = new File("first.wav");
            // First, we get the format of the input file
            final AudioFileFormat.Type fileType =
                AudioSystem.getAudioFileFormat(inputAudio).getType();
            // Then, we get a clip for playing the audio.
            final Clip c = AudioSystem.getClip();
            // We get a stream for playing the input file.
            AudioInputStream ais = AudioSystem.getAudioInputStream(inputAudio);
            // We use the clip to open (but not start) the input stream
            c.open(ais);
            // We get the format of the audio codec
            // (not the file format we got above)
            final AudioFormat audioFormat = ais.getFormat();

            c.start();
            if (stopPlayback == 1) {
                c.stop();
            }

        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
    }// end play

    public static void main(String[] args) {
        //new SoundClipTest().play();
        new SoundClipTest();
    }
}

1 个答案:

答案 0 :(得分:1)

你的if (stopPlayback == 1 )只能运行一次 - 你必须将它包含在一个while(true)循环中,以确保它继续被评估,确保你添加一个暂停,否则你将燃烧很多不必要的周期。

更新:我假设您运行了第二个线程来监视stopPlayback值 - 我现在看到的情况并非如此。为什么不直接从ActionListener调用c.stop()