多线程Java线程,具有可视和音频
我正在创建一个小型Java应用程序,该应用程序需要连续连接到外围设备,一个跳跃动作,然后还显示视觉反馈。我还试图播放一系列基于用户输入的声音,通过跳跃动作。。。基本上,当某个值大于最小值时,播放声音
我特别需要帮助的是如何正确处理Java中的线程,如果我需要手动关闭它们
要使用LWJGL启动视觉显示,请启动如下线程:
Runnable newWindow = new ThreadedWindow();
new Thread(newWindow).start();
线程化窗口类由一个运行函数组成:
CreateWindow mainWindow = new CreateWindow();
mainWindow.startWindow();
startWindow函数只是做一些非常基本的OpenGL工作来创建一个空白窗口。我只是想知道这是否是为窗口创建和使用线程的正确方法,或者是否有其他更有效的方法
public class CreateWindow {
private int windowW = 1280;
private int windowH = 720;
private int windowCentreX = windowW/2;
private int windowCentreY = windowH/2;
public void startWindow()
{
try {
Display.setDisplayMode(new DisplayMode(1280,720));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
//Init OpenGL Stuff
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 1280, 0, 720, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
while(!Display.isCloseRequested()) {
//Render the OpenGL Stuff
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
// set the color of the quad (R,G,B,A)
GL11.glColor3f(0.5f,0.5f,1.0f);
float circleRadius = 50;
float circleX = FingerInfo.averageFingerX;
float circleY = FingerInfo.averageFingerY;
// draw quad
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(circleX + windowCentreX,circleY + windowCentreY);
GL11.glVertex2f(circleX + windowCentreX + circleRadius,circleY + windowCentreY);
GL11.glVertex2f(circleX + windowCentreX + circleRadius, circleY + windowCentreY + circleRadius);
GL11.glVertex2f(circleX + windowCentreX,circleY + windowCentreY + circleRadius);
GL11.glEnd();
Display.update();
}
Display.destroy();
}
}
-
我正在创建的音频使用JavaX。声音midi。使用基本合成器和MIDI通道创建基本音调
public static void GenerateTone(int newNote)
{
note = newNote;
try
{
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
MidiChannel channel = synth.getChannels()[0];
for(int i=0; i < 1; i++)
{
channel.noteOn(note, 50);
System.out.println("Generating new tone!");
}
} catch (MidiUnavailableException e) {
e.printStackTrace();
}
}
我确实在一个run函数中调用了这个函数,该函数用于以类似于窗口的方式启动线程,但是重复播放大量声音,比如每秒10次,会导致声音暂停并发出大量嗡嗡声。这可能是一个与线程完全无关的问题,但是我只是想问一下,是否有一种好的方法可以在线程中播放声音。如果我需要处理声音播放后线程的破坏
谢谢:D
# 1 楼答案
LWJGL的developers of LWJGL themselves have specifically mentioned限制为单个图形上下文,即一次不超过一个OpenGL窗口或显示。因此,如果启动一个线程并创建第二个显示,可能会发生非常不幸的事情。否则,假设您只创建了一次窗口线程,它应该是完美的
但是,如果您使用的是声音,并且希望同时播放多个声音,既然您使用的是LWJGL,为什么不使用LWJGL的OpenAL绑定呢?OpenAL完全能够在无需多线程的情况下同时播放多个声音,尽管您需要录制声音才能播放,但您可以在用于播放声音的函数中修改音高