停止java中的循环声音



所以我有一个类来播放声音,我可以选择循环播放或播放一次,还有一个停止选项,但停止选项不会停止循环。这里是停止声音的代码:EDIT添加了全部内容包装我.welsar55.story;

import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class Sound {
public static synchronized void clip(final String fileName, final String action) 
{
    new Thread(new Runnable()
    { 
        public void run() 
        {
            if(action.equalsIgnoreCase("play"))
            {
                try 
                {
                    Clip clip = AudioSystem.getClip();
                    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(fileName));
                    clip.open(inputStream);
                    clip.start();
                } 
                catch (Exception e)
                {
                    System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
                }
            }
            else if(action.equalsIgnoreCase("loop"))
            {
                try 
                {
                    Clip clip = AudioSystem.getClip();
                    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(fileName));
                    clip.open(inputStream);
                    clip.loop(Clip.LOOP_CONTINUOUSLY);
                } 
                catch (Exception e)
                {
                    System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
                }
            }
 else if(action.equalsIgnoreCase("stop"))
{
    try 
    {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(fileName));
        clip.open(inputStream);
        clip.stop();
    } 
    catch (Exception e)
    {
        System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
    }
}
        }
    }).start();
}

}

if是一个语句而不是循环,我不知道你说的不停止循环

是什么意思

不要使用clip.stop(),而是尝试

if (clip.isOpen()) {
    clip.close();
    inputStream.close();
}

您收到错误了吗?循环的代码在哪里?。我认为您可能正在为文件创建一个新的流以便关闭。你可能想返回用于播放文件的实际流并关闭它。如果没有看到完整的代码,我无法确认这一点

        public class Sound {
        private static Map<String,Clip> clipMap = new HashMap();
    public static synchronized void clip(final String fileName, final String action) 
    {
        new Thread(new Runnable()
        { 
            public void run() 
            {
                if(action.equalsIgnoreCase("play"))
                {
                    try 
                    {
                        Clip clip = getClip(fileName);
                        clip.start();
                    } 
                    catch (Exception e)
                    {
                        System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
                    }
                }
                else if(action.equalsIgnoreCase("loop"))
                {
                    try 
                    {
                        Clip clip = getClip(fileName);
                        clip.loop(Clip.LOOP_CONTINUOUSLY);
                    } 
                    catch (Exception e)
                    {
                        System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
                    }
                }
             else if(action.equalsIgnoreCase("stop"))
            {
                try 
                {
                    Clip clip = getClip(fileName);
                    clip.stop();
                } 
                catch (Exception e)
                {
                    System.out.println("play sound error: " + e.getMessage() + " for " + fileName);
                }
            }
            }
            private Clip getClip(final String fileName)
                    throws LineUnavailableException, UnsupportedAudioFileException,
                    IOException {
                Clip clip = clipMap.get(fileName);
                if(clip == null)
                {
                clip = AudioSystem.getClip();
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(fileName));
                clip.open(inputStream);
                clipMap.put(fileName, clip);
                }
                return clip;
            }
        }).start();
    }
    }

检查这是否有效

最新更新