From 58684996f9f9b68d7472b8feed195b35d72d25a0 Mon Sep 17 00:00:00 2001 From: "iwg..om" Date: Mon, 13 May 2013 15:56:29 +0000 Subject: [PATCH] Android: Added methods for OpenAL Soft Audio Renderer to pause and resume audio when app is placed in the background git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10613 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../jME3-openal-soft-natives-android.jar | Bin 488162 -> 488162 bytes .../android/com/jme3/app/AndroidHarness.java | 9 +++ .../AndroidOpenALSoftAudioRenderer.java | 63 ++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/engine/lib/openal-soft/jME3-openal-soft-natives-android.jar b/engine/lib/openal-soft/jME3-openal-soft-natives-android.jar index fa37962620bd75aff1d4322ca3fe57f82c68a0bb..02880883c9cd252c85835079fcde73b18d72e366 100644 GIT binary patch delta 84 zcmaF#RQAzR*$FkwR&i?^>s#v?x7IV+l!18d`^uPrn0foYG8WTDu*kRXEbZUEvu^+P ZosGQ;Br>gt-3vrd_bp;~12cdkJ^(rkBb)#L delta 84 zcmaF#RQAzR*$Fkwvv;m;tZ%Jn+*;3MQwHL-?<->hV&?7p%2-Sr!6M(jv$TKv&bs~E acQ*DakjS(mb}tY;-M5I{4a@+F_y7RjV<-3k diff --git a/engine/src/android/com/jme3/app/AndroidHarness.java b/engine/src/android/com/jme3/app/AndroidHarness.java index 9102c16b3..a7a116bb3 100644 --- a/engine/src/android/com/jme3/app/AndroidHarness.java +++ b/engine/src/android/com/jme3/app/AndroidHarness.java @@ -15,6 +15,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.jme3.audio.AudioRenderer; import com.jme3.audio.android.AndroidAudioRenderer; +import com.jme3.audio.android.AndroidOpenALSoftAudioRenderer; import com.jme3.input.JoyInput; import com.jme3.input.TouchInput; import com.jme3.input.android.AndroidSensorJoyInput; @@ -486,6 +487,10 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt AndroidAudioRenderer renderer = (AndroidAudioRenderer) result; renderer.resumeAll(); } + if (result instanceof AndroidOpenALSoftAudioRenderer) { + AndroidOpenALSoftAudioRenderer renderer = (AndroidOpenALSoftAudioRenderer) result; + renderer.resumeAll(); + } } //resume the sensors (aka joysticks) if (app.getContext() != null) { @@ -525,6 +530,10 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt AndroidAudioRenderer renderer = (AndroidAudioRenderer) result; renderer.pauseAll(); } + if (result instanceof AndroidOpenALSoftAudioRenderer) { + AndroidOpenALSoftAudioRenderer renderer = (AndroidOpenALSoftAudioRenderer) result; + renderer.pauseAll(); + } } //pause the sensors (aka joysticks) if (app.getContext() != null) { diff --git a/engine/src/android/com/jme3/audio/android/AndroidOpenALSoftAudioRenderer.java b/engine/src/android/com/jme3/audio/android/AndroidOpenALSoftAudioRenderer.java index 49959af81..6b880a7e9 100644 --- a/engine/src/android/com/jme3/audio/android/AndroidOpenALSoftAudioRenderer.java +++ b/engine/src/android/com/jme3/audio/android/AndroidOpenALSoftAudioRenderer.java @@ -1299,6 +1299,69 @@ public class AndroidOpenALSoftAudioRenderer implements AudioRenderer, Runnable { } } + public void pauseAll() { + checkDead(); + synchronized (threadLock) { + while (!threadLock.get()) { + try { + threadLock.wait(); + } catch (InterruptedException ex) { + } + } + if (audioDisabled) { + return; + } + + for (int i = 0; i < channels.length; i++) { + AudioSource src = chanSrcs[i]; + if (src == null) { + continue; + } + + if (src.getStatus() == Status.Playing) { + assert src.getChannel() != -1; + + logger.log(Level.FINE, "Pausing Source: {0}", src.getChannel()); + alSourcePause(channels[src.getChannel()]); + checkError(true); + src.setStatus(Status.Paused); + } + } + + } + } + + public void resumeAll() { + checkDead(); + synchronized (threadLock) { + while (!threadLock.get()) { + try { + threadLock.wait(); + } catch (InterruptedException ex) { + } + } + if (audioDisabled) { + return; + } + + for (int i = 0; i < channels.length; i++) { + AudioSource src = chanSrcs[i]; + if (src == null) { + continue; + } + + if (src.getStatus() == Status.Paused) { + assert src.getChannel() != -1; + + logger.log(Level.FINE, "Playing/Resuming Source: {0}", src.getChannel()); + alSourcePlay(channels[src.getChannel()]); + checkError(true); + src.setStatus(Status.Playing); + } + } + } + } + private int checkError(boolean stopOnError) { int errorCode = alGetError(); String errorText = AL.GetALErrorMsg(errorCode);