gpt4 book ai didi

java - 写入 SourceDataLine 时无法执行任何操作

转载 作者:太空宇宙 更新时间:2023-11-04 07:05:56 25 4
gpt4 key购买 nike

我对 Java 音频有点陌生。我想做的是,当我播放音频时,我想重新绘制我的 JComponent,但是 SourceDataLine 阻止了所有其他代码行,包括其他线程。这是我的 play() 方法

public void play()
{
final AudioFormat af =new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
SourceDataLine line;
try {
line = AudioSystem.getSourceDataLine(af);
line.open(af, Note.SAMPLE_RATE);
line.start();
byte[] arr=data;
for(int position=0;position<arr.length;position++)
{
byte[] out={arr[position]};
line.write(out, 0, 1); //Blocks all user input (Mouse and Keyboard)
this.repaint(); //Need to repaint JComponent here
}
line.drain();
line.close();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}

最佳答案

显然您正在调用the Event Dispatch Thread上的play 。例如,也许您可​​以从按下按钮生成的 Action 事件中调用它。您需要为播放循环启动一个新线程,否则在播放结束之前 GUI 上不会发生任何事情。

至少,类似:

new Thread(new Runnable() {
@Override
public void run() {
play();
}
}).start();

但是,您应该阅读一些并发教程(例如 this one ),因为您似乎将跨不同线程访问字段(例如 byte[] arr = data; 是什么)。

您可能还希望使用SwingWorker它与 Swing 有一些集成。我在网上有一个较长的代码示例,它显示了使用 SwingWorker 的播放循环的示例:WaveformDemo 。播放循环在第 310 行左右。

关于java - 写入 SourceDataLine 时无法执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21373231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com