【问题标题】:Java Threads, with Visual and AudioJava 线程,带有视觉和音频
【发布时间】:2014-03-22 02:10:23
【问题描述】:

我正在创建一个小型 Java 应用程序,它需要一致地连接到外围设备,A Leap Motion,然后还显示视觉反馈。我还尝试通过 Leap Motion 播放基于用户输入的一系列声音......基本上只是当某个值大于最小值时,播放声音......

我特别需要帮助的是如何正确处理 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.sound.midi。使用基本合成器和 MidiChannel 来创建基本音调。

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();
    }
}

我确实在一个运行函数中调用了这个,它用于以与窗口类似的方式启动一个线程,但是重复播放很多声音,比如每秒 10 次会导致声音暂停并发出很多声音嗡嗡声。这可能是一个与线程完全无关的问题,但是我只想问是否有一种在线程中播放声音的好方法。如果我需要在播放声音后处理线程的销毁。

谢谢:D

【问题讨论】:

    标签: java multithreading audio lwjgl


    【解决方案1】:

    developers of LWJGL themselves have specifically mentioned LWJGL 仅限于单个图形上下文,即一次不超过 1 个 OpenGL 窗口或显示。所以,如果你启动一个线程并创建第二个 Display,很可能会发生一些非常不幸的事情。否则,假设您只创建一次该窗口线程,它应该完全没问题。

    但是,如果您正在使用声音并且想要一次播放多个声音,既然您正在使用 LWJGL,为什么不使用 LWJGL 的 OpenAL 绑定呢? OpenAL 无需多线程即可完美地同时播放多个声音,尽管您需要录制声音才能做到这一点,您可以在用于播放声音的函数中修改音高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多