Java 停止和启动Runnable冻结应用程序2-10秒

Java 停止和启动Runnable冻结应用程序2-10秒,java,audio,runnable,Java,Audio,Runnable,我的应用程序的主要核心是一个Runnable,它允许音频反馈用户说话并听到他的声音,而反馈由三个Jsliders控制音频延迟、音量和音调移动 问题是,当处理第一个JSlider音频延迟时,程序会冻结2-10秒。在我看来,发生这种情况是因为在处理时,Runnable停止,并启动一个新的 我使用TarsosDSP包。Runnable被称为Dispatcher 这3个JSlider定义/馈送3个变量,这些变量由Dispatcher使用的一些类对象使用,以便执行反馈的操纵延迟、音量和音高偏移 三个变量:

我的应用程序的主要核心是一个Runnable,它允许音频反馈用户说话并听到他的声音,而反馈由三个Jsliders控制音频延迟、音量和音调移动

问题是,当处理第一个JSlider音频延迟时,程序会冻结2-10秒。在我看来,发生这种情况是因为在处理时,Runnable停止,并启动一个新的

我使用TarsosDSP包。Runnable被称为Dispatcher

这3个JSlider定义/馈送3个变量,这些变量由Dispatcher使用的一些类对象使用,以便执行反馈的操纵延迟、音量和音高偏移

三个变量:

用于基音偏移的电流系数Jslider,用于音频延迟的采样器..,用于音量的增益值

事件顺序:

一,。单击试用按钮->开始创建调度程序音频反馈

`

二,。之后,用户控制三个JSLIDER。音频反馈被改变了

当我控制延迟Jslider时:

public ChangeListener delaySettingChangedListener = new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent arg0) {

        int delayFactor = sldelay.getValue();

        df = (double) delayFactor / (double) 100;

        // Here, sampleRate variable is updated
        panelbuttons.sampleRate = 44100 * df;
        // And then, I stop the current runnable Dispatcher, and start a new one, 
        //according to the updated variable               
        startFile();
    }
};
StartFile的代码:

private void startFile() {
    // stop the current thread
    if (panelbuttons.dispatcher != null)
        panelbuttons.dispatcher.stop();

    if (timer == null) {
        timer = new Timer(400, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // and start a new one, after some time, in order
                // for the previous runnable to end/withdraw
                startFile0();
            }
        });
    }
    timer.stop();
    timer.setRepeats(false);
    timer.start();

}
StartFile0的代码,与试用按钮侦听器方法几乎相同:

private void startFile0() {


    AudioFormat format;
    try {
        format = new AudioFormat(44100, 8, 1, true, true);
        panelbuttons.rateTransposer = new RateTransposer(
                panelbuttons.currentFactor);
        panelbuttons.audioPlayer = new AudioPlayer(format);

        panelbuttons.wsola = new WaveformSimilarityBasedOverlapAdd(
                Parameters.musicDefaults(panelbuttons.currentFactor,
                        panelbuttons.sampleRate)
        );

        DataLine.Info dataLineInfo = new DataLine.Info(
                TargetDataLine.class, format);
        TargetDataLine line;

        Mixer.Info mixerInfo = Shared.getMixerInfo(false, true).get(1);
        Mixer mixer = AudioSystem.getMixer(mixerInfo);

        line = (TargetDataLine) mixer.getLine(dataLineInfo);
        line.open(format, panelbuttons.wsola.getInputBufferSize());

        line.start();
        final AudioInputStream stream = new AudioInputStream(line);
        panelbuttons.dispatcher = new AudioDispatcher(stream,
                panelbuttons.wsola.getInputBufferSize(),
                panelbuttons.wsola.getOverlap());

        panelbuttons.wsola.setDispatcher(panelbuttons.dispatcher);
        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.wsola);
        panelbuttons.dispatcher
                .addAudioProcessor(panelbuttons.rateTransposer);

        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.gain);

        //panelbuttons.dispatcher.addAudioProcessor(new VolumeDetector(this));

        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.audioPlayer);

        Thread t = new Thread(panelbuttons.dispatcher);
        t.start();
    } catch (UnsupportedAudioFileException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (LineUnavailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
如何避免冰冻,并使其在没有时间间隔的情况下立即响应

我知道stop不受欢迎,但这会导致冻结吗

如有需要,请要求我进一步澄清

概要-基本问题:
如何在零冻结的情况下停止runnable并启动新的runnable?

您的Timer类在做什么?使用Timer,startFile0方法在400毫秒后执行。如果您在此处使用线程,则需要这段时间才能完全释放上一个Dispatcher runnable。@UVM只有在我使用线程Dispatcher时,TarsosDSP包才允许使用音频反馈功能。
private void startFile0() {


    AudioFormat format;
    try {
        format = new AudioFormat(44100, 8, 1, true, true);
        panelbuttons.rateTransposer = new RateTransposer(
                panelbuttons.currentFactor);
        panelbuttons.audioPlayer = new AudioPlayer(format);

        panelbuttons.wsola = new WaveformSimilarityBasedOverlapAdd(
                Parameters.musicDefaults(panelbuttons.currentFactor,
                        panelbuttons.sampleRate)
        );

        DataLine.Info dataLineInfo = new DataLine.Info(
                TargetDataLine.class, format);
        TargetDataLine line;

        Mixer.Info mixerInfo = Shared.getMixerInfo(false, true).get(1);
        Mixer mixer = AudioSystem.getMixer(mixerInfo);

        line = (TargetDataLine) mixer.getLine(dataLineInfo);
        line.open(format, panelbuttons.wsola.getInputBufferSize());

        line.start();
        final AudioInputStream stream = new AudioInputStream(line);
        panelbuttons.dispatcher = new AudioDispatcher(stream,
                panelbuttons.wsola.getInputBufferSize(),
                panelbuttons.wsola.getOverlap());

        panelbuttons.wsola.setDispatcher(panelbuttons.dispatcher);
        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.wsola);
        panelbuttons.dispatcher
                .addAudioProcessor(panelbuttons.rateTransposer);

        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.gain);

        //panelbuttons.dispatcher.addAudioProcessor(new VolumeDetector(this));

        panelbuttons.dispatcher.addAudioProcessor(panelbuttons.audioPlayer);

        Thread t = new Thread(panelbuttons.dispatcher);
        t.start();
    } catch (UnsupportedAudioFileException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (LineUnavailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}