Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java'中的Drain方法;s剪辑类_Java - Fatal编程技术网

Java'中的Drain方法;s剪辑类

Java'中的Drain方法;s剪辑类,java,Java,我正在创建一个短剪辑,然后播放它,调用start()方法。然后调用drain()方法来阻止执行,直到片段播放完成。但是,当运行下面的代码数次时,有时有效,有时无效,并且声音在结束前随机停止 Mixer mixer = AudioSystem.getMixer(null); AudioFormat format = new AudioFormat(44100, 8, 1, true, false); DataLine.Info info = new DataLine.Info(Clip.class

我正在创建一个短剪辑,然后播放它,调用
start()
方法。然后调用
drain()
方法来阻止执行,直到片段播放完成。但是,当运行下面的代码数次时,有时有效,有时无效,并且声音在结束前随机停止

Mixer mixer = AudioSystem.getMixer(null);
AudioFormat format = new AudioFormat(44100, 8, 1, true, false);
DataLine.Info info = new DataLine.Info(Clip.class, format);
try {
    // Create a sound of 1 second
    Clip clip = (Clip)mixer.getLine(info);
    byte[] b = new byte[44100];
    for(int i=0; i<b.length; i++)
        b[i] = (byte) (50*Math.sin(i/10.0));

    clip.open(format, b, 0, b.length);
    clip.setFramePosition(0);
    clip.start();
    clip.drain();
} catch(LineUnavailableException lue) { lue.printStackTrace(); }
Mixer-Mixer=AudioSystem.getMixer(null);
AudioFormat格式=新的AudioFormat(44100,8,1,真,假);
DataLine.Info=newdataline.Info(Clip.class,format);
试一试{
//发出1秒的声音
Clip Clip=(Clip)mixer.getLine(info);
字节[]b=新字节[44100];
对于(int i=0;i,clip.start()有时会在bug(?)发生开始事件之前立即返回,在这种情况下,drain没有任何效果。通过一种解决方法,我们可以使用侦听器捕捉开始事件:

解决方案:

Mixer mixer = AudioSystem.getMixer(null);
AudioFormat format = new AudioFormat(44100, 8, 1, true, false);
DataLine.Info info = new DataLine.Info(Clip.class, format);
try {
    // Create a sound of 1 second
    Clip clip = (Clip)mixer.getLine(info);

    //Workaround part 1
    clip.addLineListener(new LineListener() {
        @Override
        public void update(LineEvent event) {
            if (event.getType() == Type.START)
                synchronized (clip) {
                    clip.notify();
                }
        }
    });

    byte[] b = new byte[44100];
    for(int i=0; i<b.length; i++)
        b[i] = (byte) (50*Math.sin(i/10.0));

    clip.open(format, b, 0, b.length);
    clip.setFramePosition(0);

    //Workaround part 2
    synchronized (clip) {
        clip.start();
        clip.wait();
        System.out.println("Started");
    }
    clip.drain();
    System.out.println("Drained");
} catch(LineUnavailableException | InterruptedException lue) { lue.printStackTrace(); }
Mixer-Mixer=AudioSystem.getMixer(null);
AudioFormat格式=新的AudioFormat(44100,8,1,真,假);
DataLine.Info=newdataline.Info(Clip.class,format);
试一试{
//发出1秒的声音
Clip Clip=(Clip)mixer.getLine(info);
//解决方案第1部分
clip.addLineListener(新的LineListener(){
@凌驾
公共作废更新(LineEvent事件){
if(event.getType()==Type.START)
同步(剪辑){
clip.notify();
}
}
});
字节[]b=新字节[44100];
对于(int i=0;i