Java 停止和启动Runnable冻结应用程序2-10秒
我的应用程序的主要核心是一个Runnable,它允许音频反馈用户说话并听到他的声音,而反馈由三个Jsliders控制音频延迟、音量和音调移动 问题是,当处理第一个JSlider音频延迟时,程序会冻结2-10秒。在我看来,发生这种情况是因为在处理时,Runnable停止,并启动一个新的 我使用TarsosDSP包。Runnable被称为Dispatcher 这3个JSlider定义/馈送3个变量,这些变量由Dispatcher使用的一些类对象使用,以便执行反馈的操纵延迟、音量和音高偏移 三个变量: 用于基音偏移的电流系数Jslider,用于音频延迟的采样器..,用于音量的增益值 事件顺序: 一,。单击试用按钮->开始创建调度程序音频反馈 ` 二,。之后,用户控制三个JSLIDER。音频反馈被改变了 当我控制延迟Jslider时:Java 停止和启动Runnable冻结应用程序2-10秒,java,audio,runnable,Java,Audio,Runnable,我的应用程序的主要核心是一个Runnable,它允许音频反馈用户说话并听到他的声音,而反馈由三个Jsliders控制音频延迟、音量和音调移动 问题是,当处理第一个JSlider音频延迟时,程序会冻结2-10秒。在我看来,发生这种情况是因为在处理时,Runnable停止,并启动一个新的 我使用TarsosDSP包。Runnable被称为Dispatcher 这3个JSlider定义/馈送3个变量,这些变量由Dispatcher使用的一些类对象使用,以便执行反馈的操纵延迟、音量和音高偏移 三个变量:
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();
}
}