From 2ec7366fdee407a89cfa82f1bab98b77694b3050 Mon Sep 17 00:00:00 2001 From: shadowislord Date: Thu, 20 Nov 2014 20:21:37 -0500 Subject: [PATCH] Initialize OpenAL context in the render thread Also remove useless AndroidAudioRenderer from jme3-ios --- .../jme3/audio/openal/ALAudioRenderer.java | 189 ++++++------------ .../audio/android/AndroidAudioRenderer.java | 24 --- 2 files changed, 66 insertions(+), 147 deletions(-) delete mode 100644 jme3-ios/src/main/java/com/jme3/audio/android/AndroidAudioRenderer.java diff --git a/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java b/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java index 3b3c7fc35..501c1645e 100644 --- a/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java +++ b/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java @@ -87,67 +87,8 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { this.alc = alc; this.efx = efx; } - - public void initialize() { - if (!decoderThread.isAlive()) { - // Set high priority to avoid buffer starvation. - decoderThread.setDaemon(true); - decoderThread.setPriority(Thread.NORM_PRIORITY + 1); - decoderThread.start(); - } else { - throw new IllegalStateException("Initialize already called"); - } - } - - private void checkDead() { - if (decoderThread.getState() == Thread.State.TERMINATED) { - throw new IllegalStateException("Decoding thread is terminated"); - } - } - - public void run() { - initInDecoderThread(); - - // Notify render thread that OAL context is available. - synchronized (threadLock) { - threadLock.set(true); - threadLock.notifyAll(); - } - - long updateRateNanos = (long) (UPDATE_RATE * 1000000000); - mainloop: - while (true) { - long startTime = System.nanoTime(); - - if (Thread.interrupted()) { - break; - } - - synchronized (threadLock) { - updateInDecoderThread(UPDATE_RATE); - } - - long endTime = System.nanoTime(); - long diffTime = endTime - startTime; - - if (diffTime < updateRateNanos) { - long desiredEndTime = startTime + updateRateNanos; - while (System.nanoTime() < desiredEndTime) { - try { - Thread.sleep(1); - } catch (InterruptedException ex) { - break mainloop; - } - } - } - } - - synchronized (threadLock) { - cleanupInDecoderThread(); - } - } - - public void initInDecoderThread() { + + private void initOpenAL() { try { if (!alc.isCreated()) { alc.createALC(); @@ -228,8 +169,8 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { logger.log(Level.WARNING, "OpenAL EFX not available! Audio effects won't work."); } } - - public void cleanupInDecoderThread() { + + private void destroyOpenAL() { if (audioDisabled) { alc.destroyALC(); return; @@ -266,17 +207,73 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { alc.destroyALC(); } - public void cleanup() { - // kill audio thread + public void initialize() { if (decoderThread.isAlive()) { - decoderThread.interrupt(); - try { - decoderThread.join(); - } catch (InterruptedException ex) { + throw new IllegalStateException("Initialize already called"); + } + + // Initialize OpenAL context. + initOpenAL(); + + // Initialize decoder thread. + // Set high priority to avoid buffer starvation. + decoderThread.setDaemon(true); + decoderThread.setPriority(Thread.NORM_PRIORITY + 1); + decoderThread.start(); + } + + private void checkDead() { + if (decoderThread.getState() == Thread.State.TERMINATED) { + throw new IllegalStateException("Decoding thread is terminated"); + } + } + + public void run() { + long updateRateNanos = (long) (UPDATE_RATE * 1000000000); + mainloop: + while (true) { + long startTime = System.nanoTime(); + + if (Thread.interrupted()) { + break; + } + + synchronized (threadLock) { + updateInDecoderThread(UPDATE_RATE); + } + + long endTime = System.nanoTime(); + long diffTime = endTime - startTime; + + if (diffTime < updateRateNanos) { + long desiredEndTime = startTime + updateRateNanos; + while (System.nanoTime() < desiredEndTime) { + try { + Thread.sleep(1); + } catch (InterruptedException ex) { + break mainloop; + } + } } } } + public void cleanup() { + // kill audio thread + if (!decoderThread.isAlive()) { + return; + } + + decoderThread.interrupt(); + try { + decoderThread.join(); + } catch (InterruptedException ex) { + } + + // destroy OpenAL context + destroyOpenAL(); + } + private void updateFilter(Filter f) { int id = f.getId(); if (id == -1) { @@ -304,12 +301,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void updateSourceParam(AudioSource src, AudioParam param) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -536,12 +527,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void updateListenerParam(Listener listener, ListenerParam param) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -608,12 +593,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void setEnvironment(Environment env) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled || !supportEfx) { return; } @@ -892,12 +871,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void setListener(Listener listener) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -933,12 +906,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void playSourceInstance(AudioSource src) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -976,12 +943,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void playSource(AudioSource src) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -1018,12 +979,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void pauseSource(AudioSource src) { checkDead(); synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -1039,12 +994,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void stopSource(AudioSource src) { synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } @@ -1140,12 +1089,6 @@ public class ALAudioRenderer implements AudioRenderer, Runnable { public void deleteAudioData(AudioData ad) { synchronized (threadLock) { - while (!threadLock.get()) { - try { - threadLock.wait(); - } catch (InterruptedException ex) { - } - } if (audioDisabled) { return; } diff --git a/jme3-ios/src/main/java/com/jme3/audio/android/AndroidAudioRenderer.java b/jme3-ios/src/main/java/com/jme3/audio/android/AndroidAudioRenderer.java deleted file mode 100644 index 0cde16aa5..000000000 --- a/jme3-ios/src/main/java/com/jme3/audio/android/AndroidAudioRenderer.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jme3.audio.android; - -import com.jme3.audio.AudioRenderer; - -/** - * Android specific AudioRenderer interface that supports pausing and resuming - * audio files when the app is minimized or placed in the background - * - * @author iwgeric - */ -public interface AndroidAudioRenderer extends AudioRenderer { - - /** - * Pauses all Playing audio. To be used when the app is placed in the - * background. - */ - public void pauseAll(); - - /** - * Resumes all Paused audio. To be used when the app is brought back to - * the foreground. - */ - public void resumeAll(); -}