From: badlogicgames Date: Wed, 7 Mar 2012 12:47:37 +0000 (+0000) Subject: [fixed] issue 725, OpenAL backend switches to passthrough if no audio device is avail... X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3ff459bd93411d8bfd741fbb3f88c86d323c33dd;p=mikumikustudio%2Flibgdx-mikumikustudio.git [fixed] issue 725, OpenAL backend switches to passthrough if no audio device is available. --- diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Mp3.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Mp3.java index ad4033001..750a565c0 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Mp3.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Mp3.java @@ -38,6 +38,7 @@ public class Mp3 { public Music (OpenALAudio audio, FileHandle file) { super(audio, file); + if(audio.noDevice) return; bitstream = new Bitstream(file.read()); decoder = new MP3Decoder(); try { @@ -105,7 +106,7 @@ public class Mp3 { public Sound (OpenALAudio audio, FileHandle file) { super(audio); - + if(audio.noDevice) return; ByteArrayOutputStream output = new ByteArrayOutputStream(4096); Bitstream bitstream = new Bitstream(file.read()); diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Ogg.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Ogg.java index 894ceb482..66522fd4f 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Ogg.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Ogg.java @@ -27,6 +27,7 @@ public class Ogg { public Music (OpenALAudio audio, FileHandle file) { super(audio, file); + if(audio.noDevice) return; input = new OggInputStream(file.read()); setup(input.getChannels(), input.getSampleRate()); } @@ -49,7 +50,7 @@ public class Ogg { static public class Sound extends OpenALSound { public Sound (OpenALAudio audio, FileHandle file) { super(audio); - + if(audio.noDevice) return; OggInputStream input = new OggInputStream(file.read()); ByteArrayOutputStream output = new ByteArrayOutputStream(4096); byte[] buffer = new byte[2048]; diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java index 462becb72..484999463 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java @@ -63,6 +63,7 @@ public class OpenALAudio implements Audio { private ObjectMap> extensionToMusicClass = new ObjectMap(); Array music = new Array(false, 1, OpenALMusic.class); + boolean noDevice = false; public OpenALAudio () { this(16); @@ -79,7 +80,9 @@ public class OpenALAudio implements Audio { try { AL.create(); } catch (LWJGLException ex) { - throw new GdxRuntimeException("Error initializing OpenAL.", ex); + noDevice = true; + return; +// throw new GdxRuntimeException("Error initializing OpenAL.", ex); } allSources = new IntArray(false, simultaneousSources); @@ -136,6 +139,7 @@ public class OpenALAudio implements Audio { } int obtainSource (boolean isMusic) { + if(noDevice) return 0; for (int i = 0, n = idleSources.size; i < n; i++) { int sourceId = idleSources.get(i); int state = alGetSourcei(sourceId, AL_SOURCE_STATE); @@ -165,6 +169,7 @@ public class OpenALAudio implements Audio { } void freeSource (int sourceID) { + if(noDevice) return; alSourceStop(sourceID); alSourcei(sourceID, AL_BUFFER, 0); if (sourceToSoundId.containsKey(sourceID)) { @@ -175,6 +180,7 @@ public class OpenALAudio implements Audio { } void freeBuffer (int bufferID) { + if(noDevice) return; for (int i = 0, n = idleSources.size; i < n; i++) { int sourceID = idleSources.get(i); if (alGetSourcei(sourceID, AL_BUFFER) == bufferID) { @@ -189,6 +195,7 @@ public class OpenALAudio implements Audio { } void stopSourcesWithBuffer (int bufferID) { + if(noDevice) return; for (int i = 0, n = idleSources.size; i < n; i++) { int sourceID = idleSources.get(i); if (alGetSourcei(sourceID, AL_BUFFER) == bufferID) { @@ -202,6 +209,7 @@ public class OpenALAudio implements Audio { } public void update () { + if(noDevice) return; for (int i = 0; i < music.size; i++) music.items[i].update(); } @@ -243,6 +251,7 @@ public class OpenALAudio implements Audio { } public void dispose () { + if(noDevice) return; for (int i = 0, n = allSources.size; i < n; i++) { int sourceID = allSources.get(i); int state = alGetSourcei(sourceID, AL_SOURCE_STATE); @@ -262,11 +271,47 @@ public class OpenALAudio implements Audio { } } - public AudioDevice newAudioDevice (int sampleRate, boolean isMono) { + public AudioDevice newAudioDevice (int sampleRate, final boolean isMono) { + if(noDevice) return new AudioDevice() { + @Override + public void writeSamples (float[] samples, int offset, int numSamples) { + } + + @Override + public void writeSamples (short[] samples, int offset, int numSamples) { + } + + @Override + public void setVolume (float volume) { + } + + @Override + public boolean isMono () { + return isMono; + } + + @Override + public int getLatency () { + return 0; + } + + @Override + public void dispose () { + } + }; return new OpenALAudioDevice(this, sampleRate, isMono); } public AudioRecorder newAudioRecorder (int samplingRate, boolean isMono) { + if(noDevice) return new AudioRecorder() { + @Override + public void read (short[] samples, int offset, int numSamples) { + } + + @Override + public void dispose () { + } + }; // BOZO - Write OpenAL recorder. return new JavaSoundAudioRecorder(samplingRate, isMono); } diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALMusic.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALMusic.java index 4aa1abaad..6369e1c55 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALMusic.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALMusic.java @@ -49,8 +49,9 @@ public abstract class OpenALMusic implements Music { public OpenALMusic (OpenALAudio audio, FileHandle file) { this.audio = audio; this.file = file; - - if(audio != null) audio.music.add(this); + if(audio != null) { + if(!audio.noDevice) audio.music.add(this); + } } protected void setup (int channels, int sampleRate) { @@ -60,6 +61,7 @@ public abstract class OpenALMusic implements Music { } public void play () { + if(audio.noDevice) return; if (sourceID == -1) { sourceID = audio.obtainSource(true); if (sourceID == -1) return; @@ -85,6 +87,7 @@ public abstract class OpenALMusic implements Music { } public void stop () { + if(audio.noDevice) return; if (sourceID == -1) return; reset(); audio.freeSource(sourceID); @@ -94,11 +97,13 @@ public abstract class OpenALMusic implements Music { } public void pause () { + if(audio.noDevice) return; if (sourceID != -1) alSourcePause(sourceID); isPlaying = false; } public boolean isPlaying () { + if(audio.noDevice) return false; if (sourceID == -1) return false; return isPlaying; } @@ -113,10 +118,12 @@ public abstract class OpenALMusic implements Music { public void setVolume (float volume) { this.volume = volume; + if(audio.noDevice) return; if (sourceID != -1) alSourcef(sourceID, AL_GAIN, volume); } public float getPosition () { + if(audio.noDevice) return 0; if (sourceID == -1) return 0; return renderedSeconds + alGetSourcef(sourceID, AL11.AL_SEC_OFFSET); } @@ -137,6 +144,7 @@ public abstract class OpenALMusic implements Music { } public void update () { + if(audio.noDevice) return; if (sourceID == -1) return; boolean end = false; @@ -175,6 +183,7 @@ public abstract class OpenALMusic implements Music { } public void dispose () { + if(audio.noDevice) return; if (buffers == null) return; if (sourceID != -1) { reset(); diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALSound.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALSound.java index 10b937dbf..994b8cadf 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALSound.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALSound.java @@ -50,6 +50,7 @@ public class OpenALSound implements Sound { } public long play (float volume) { + if(audio.noDevice) return 0; int sourceID = audio.obtainSource(false); if (sourceID == -1) return -1; long soundId = audio.getSoundId(sourceID); @@ -66,6 +67,7 @@ public class OpenALSound implements Sound { @Override public long loop (float volume) { + if(audio.noDevice) return 0; int sourceID = audio.obtainSource(false); if (sourceID == -1) return -1; long soundId = audio.getSoundId(sourceID); @@ -77,10 +79,12 @@ public class OpenALSound implements Sound { } public void stop () { + if(audio.noDevice) return; audio.stopSourcesWithBuffer(bufferID); } public void dispose () { + if(audio.noDevice) return; if (bufferID == -1) return; audio.freeBuffer(bufferID); alDeleteBuffers(bufferID); @@ -89,27 +93,32 @@ public class OpenALSound implements Sound { @Override public void stop (long soundId) { + if(audio.noDevice) return; audio.stopSound(soundId); } @Override public void setPitch (long soundId, float pitch) { + if(audio.noDevice) return; audio.setSoundPitch(soundId, pitch); } @Override public void setVolume (long soundId, float volume) { + if(audio.noDevice) return; audio.setSoundGain(soundId, volume); } @Override public void setLooping (long soundId, boolean looping) { + if(audio.noDevice) return; audio.setSoundLooping(soundId, looping); } @Override public void setPan (long soundId, float pan, float volume) { + if(audio.noDevice) return; audio.setSoundPan(soundId, pan, volume); } } diff --git a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Wav.java b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Wav.java index 80a2c2f21..e7d4c0d69 100644 --- a/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Wav.java +++ b/backends/gdx-openal/src/com/badlogic/gdx/backends/openal/Wav.java @@ -31,6 +31,7 @@ public class Wav { public Music (OpenALAudio audio, FileHandle file) { super(audio, file); input = new WavInputStream(file); + if(audio.noDevice) return; setup(input.channels, input.sampleRate); } @@ -59,6 +60,7 @@ public class Wav { static public class Sound extends OpenALSound { public Sound (OpenALAudio audio, FileHandle file) { super(audio); + if(audio.noDevice) return; WavInputStream input = new WavInputStream(file); ByteArrayOutputStream output = new ByteArrayOutputStream(4096);