在读取音频文件时失去对我的应用程序的控制

时间:2014-01-09 13:30:16

标签: java audio javasound

我有一个Java应用程序,有2个按钮:Start和Stop。

当我点击“开始”按钮时,我读取了一个音频文件。但有一个问题。当我阅读音乐时,无法点击其他按钮。在读取整个音频文件之前,我失去了对应用程序的控制权。所以我无法通过点击我的按钮来停止阅读。

我认为我必须使用一个线程,但是我很难理解线程是如何工作的。

你能帮我吗?

这是我的ServerBoard:

public class ServerBoard extends JFrame
{
    private TCPServer tcpserver;
    private Sound sound;
    private JTextArea messagearea;
    private JButton startserver;
    private JButton playmusic;
    private JButton stopmusic;


    /** CONSTRUCTEUR **/
    public ServerBoard(int l, int h)
    {
        ...
    }

    /** Initialisation de la fenetre **/
    public void initialize()
            {
        ...
    }


/**********************************************************************************************
 ************************************** ADD PANELS **************************************
 **********************************************************************************************/
    private JPanel createPanelEast()
    {
        ...

        return panelEast;
    }


/**********************************************************************************************
 ************************************* ADD LISTENERS ************************************
 **********************************************************************************************/
    private class ServerBoardListener implements ActionListener
    {    
        public void actionPerformed(ActionEvent e)
        {
            String namebutton=e.getActionCommand().trim();

            if(namebutton.equals("START SERVER"))
            {
                startServer();
            }

            else if(namebutton.equals("PLAY MUSIC"))
            {
                playMusic();
            }

            else if(namebutton.equals("STOP MUSIC"))
            {
                stopMusic();
            }
        }
    }


/**********************************************************************************************
 ****************************************** METHODS ******************************************
 **********************************************************************************************/
    // METHODE POUR DEMARRER LE SERVEUR
    public void startServer()
    {
        // Une fois clique, on desactive le bouton
        startserver.setEnabled(false);

        // On cree l'objet OnMessageReceved demande par le constructeur de TCPServer
        tcpserver=new TCPServer(new TCPServer.OnMessageReceived()
                    {
            public void messageReceived(String message)
            {
                messagearea.append(message);
            }
        });
        tcpserver.start();
    }

    // METHODE POUR LIRE UN FICHIER AUDIO
    public void playMusic()
    {
        System.out.println("lecture de son");
        try 
        {
            Sound sound = new Sound("C:/Documents and Settings/cngo/Bureau/Stage-Save/TCPIP_AndroidJava/TCPIP_V6_Sound/OpeningSuite.mp3");
            System.out.println("playing : " + sound.isPlaying());
            sound.play();
            System.out.println("playing : " + sound.isPlaying());
        } 
        catch (Exception e){e.printStackTrace();}

    }

    // STOP LA MUSIQUE
    public void stopMusic()
    {
        System.out.println("arret de la musique");
        try 
        {
            sound.stop();
        } 
        catch (Exception e) {e.printStackTrace();}
    }
}

这是我的Sound.class:

public class Sound 
{           
    private boolean isPlaying = false;
    private AdvancedPlayer player = null;

    public Sound(String path) throws Exception 
    {
        InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
        player = new AdvancedPlayer(in);
    }

    public boolean isPlaying() 
    {
        return isPlaying;
    }   

    public void play() throws Exception
    {
        if (player != null) 
        {
            isPlaying = true;
            player.play();
        }
    }

    public Sound(String path,PlaybackListener listener) throws Exception 
    {
        InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
        player = new AdvancedPlayer(in);
        player.setPlayBackListener(listener);
    }

    public void play(int begin,int end) throws Exception 
    {
        if (player != null) 
        {
            isPlaying = true;
            player.play(begin,end);
        }
    }

    public void stop() throws Exception 
    {
        if (player != null)
        {
            player.stop();
            isPlaying = false;

        }
    }   
}

先谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

使用基于Java Sound的Clip。示例代码可以在Java Sound info. page上看到。它在守护进程Thread中运行,因此不会阻止事件调度线程。

  

..如果我理解,Java Sound仅用于采样音频数据?

MP3 采样音频数据!鉴于它是MP3,您应该阅读整个 Java声音信息。页面,清楚地解释了如何在JSE中提供对MP3的支持。

  

我的应用程序需要一些轻巧,极简的功能,这使我能够阅读大型音频文件和/或音频流。

行。如果它很大,你需要一个BigClip。可以是其他评论中建议的SwingWorker