Jelajahi Sumber

mitigate issue #1383 (Could not locate OpenAL library) for LWJGL v2 (#1432)

* mitigate issue #1383 (Could not locate OpenAL library) for LWJGL v2

* LwjglALC: convert the System.out warning to a Logger message

* don't increase the wait time after each failure
Stephen Gold 4 tahun lalu
induk
melakukan
a94038a6d4
1 mengubah file dengan 36 tambahan dan 4 penghapusan
  1. 36 4
      jme3-lwjgl/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java

+ 36 - 4
jme3-lwjgl/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java

@@ -2,6 +2,8 @@ package com.jme3.audio.lwjgl;
 
 import com.jme3.audio.openal.ALC;
 import java.nio.IntBuffer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.lwjgl.LWJGLException;
 import org.lwjgl.openal.AL;
 import org.lwjgl.openal.ALC10;
@@ -9,13 +11,43 @@ import org.lwjgl.openal.ALCcontext;
 import org.lwjgl.openal.ALCdevice;
 
 public class LwjglALC implements ALC {
+    /**
+     * message logger for this class
+     */
+    private static final Logger logger
+            = Logger.getLogger(LwjglALC.class.getName());
 
     @Override
     public void createALC() {
-        try {
-            AL.create();
-        } catch (LWJGLException ex) {
-            throw new RuntimeException(ex);
+        int numRetriesRemaining = 4;
+        int retryDelayMsec = 100; // 0.1-second delay between retries
+
+        while (true) {
+            try {
+                AL.create();
+                break;
+
+            } catch (LWJGLException exception1) {
+                if (numRetriesRemaining < 1) {
+                    throw new RuntimeException(exception1);
+                }
+
+                // Retry to mitigate JME Issue 1383.
+                --numRetriesRemaining;
+                String message = String.format(
+                        "Caught an LWJGLException from AL.create(). "
+                        + "Will retry after %d msec, "
+                        + "with %d more retr%s remaining.%n",
+                        retryDelayMsec,
+                        numRetriesRemaining,
+                        (numRetriesRemaining == 1) ? "y" : "ies");
+                logger.log(Level.WARNING, message);
+
+                try {
+                    Thread.sleep(retryDelayMsec);
+                } catch (InterruptedException exception2) {
+                }
+            }
         }
     }