Initializes ALUT (JOAL) in the static initializer to avoid freezing everything

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9895 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
jul..om 12 years ago
parent 03fe815bd2
commit e4d776ae0e
  1. 105
      engine/src/jogl/com/jme3/audio/joal/JoalAudioRenderer.java

@ -77,6 +77,10 @@ public class JoalAudioRenderer implements AudioRenderer, Runnable {
private ALC alc;
private AL al;
static {
ALut.alutInit();
}
public JoalAudioRenderer() {
}
@ -139,10 +143,9 @@ public class JoalAudioRenderer implements AudioRenderer, Runnable {
public void initInThread() {
try {
ALut.alutInit();
alc = ALFactory.getALC();
al = ALFactory.getAL();
// Get handle to default device.
ALCdevice device = alc.alcOpenDevice(null);
if (device == null) {
@ -159,7 +162,7 @@ public class JoalAudioRenderer implements AudioRenderer, Runnable {
logger.log(Level.FINER, "Audio Vendor: {0}", al.alGetString(ALConstants.AL_VENDOR));
logger.log(Level.FINER, "Audio Renderer: {0}", al.alGetString(ALConstants.AL_RENDERER));
logger.log(Level.FINER, "Audio Version: {0}", al.alGetString(ALConstants.AL_VERSION));
// Create audio context.
ALCcontext context = alc.alcCreateContext(device, null);
if (context == null) {
@ -174,57 +177,57 @@ public class JoalAudioRenderer implements AudioRenderer, Runnable {
throw new ALException("Error making OpenAL context current");
}
// Find maximum # of sources supported by this implementation
ArrayList<Integer> channelList = new ArrayList<Integer>();
IntBuffer channelsNioBuffer = Buffers.newDirectIntBuffer(MAX_NUM_CHANNELS);
al.alGenSources(MAX_NUM_CHANNELS, channelsNioBuffer);
for (int i = 0; i < MAX_NUM_CHANNELS; i++) {
int chan = channelsNioBuffer.get(i);
if (chan != 0) {
channelList.add(chan);
// Find maximum # of sources supported by this implementation
ArrayList<Integer> channelList = new ArrayList<Integer>();
IntBuffer channelsNioBuffer = Buffers.newDirectIntBuffer(MAX_NUM_CHANNELS);
al.alGenSources(MAX_NUM_CHANNELS, channelsNioBuffer);
for (int i = 0; i < MAX_NUM_CHANNELS; i++) {
int chan = channelsNioBuffer.get(i);
if (chan != 0) {
channelList.add(chan);
}
}
}
channels = new int[channelList.size()];
for (int i = 0; i < channels.length; i++) {
channels[i] = channelList.get(i);
}
ib = BufferUtils.createIntBuffer(channels.length);
chanSrcs = new AudioNode[channels.length];
logger.log(Level.INFO, "AudioRenderer supports {0} channels", channels.length);
supportEfx = alc.alcIsExtensionPresent(device, "ALC_EXT_EFX");
if (supportEfx) {
ib.position(0).limit(1);
alc.alcGetIntegerv(device, AL.ALC_EFX_MAJOR_VERSION, 1, ib);
int major = ib.get(0);
ib.position(0).limit(1);
alc.alcGetIntegerv(device, AL.ALC_EFX_MINOR_VERSION, 1, ib);
int minor = ib.get(0);
logger.log(Level.INFO, "Audio effect extension version: {0}.{1}", new Object[]{major, minor});
alc.alcGetIntegerv(device, AL.ALC_MAX_AUXILIARY_SENDS, 1, ib);
auxSends = ib.get(0);
logger.log(Level.INFO, "Audio max auxilary sends: {0}", auxSends);
// create slot
ib.position(0).limit(1);
al.alGenAuxiliaryEffectSlots(1, ib);
reverbFxSlot = ib.get(0);
// create effect
ib.position(0).limit(1);
al.alGenEffects(1, ib);
reverbFx = ib.get(0);
al.alEffecti(reverbFx, AL.AL_EFFECT_TYPE, AL.AL_EFFECT_REVERB);
channels = new int[channelList.size()];
for (int i = 0; i < channels.length; i++) {
channels[i] = channelList.get(i);
}
// attach reverb effect to effect slot
al.alAuxiliaryEffectSloti(reverbFxSlot, AL.AL_EFFECTSLOT_EFFECT, reverbFx);
} else {
logger.log(Level.WARNING, "OpenAL EFX not available! Audio effects won't work.");
}
ib = BufferUtils.createIntBuffer(channels.length);
chanSrcs = new AudioNode[channels.length];
logger.log(Level.INFO, "AudioRenderer supports {0} channels", channels.length);
supportEfx = alc.alcIsExtensionPresent(device, "ALC_EXT_EFX");
if (supportEfx) {
ib.position(0).limit(1);
alc.alcGetIntegerv(device, AL.ALC_EFX_MAJOR_VERSION, 1, ib);
int major = ib.get(0);
ib.position(0).limit(1);
alc.alcGetIntegerv(device, AL.ALC_EFX_MINOR_VERSION, 1, ib);
int minor = ib.get(0);
logger.log(Level.INFO, "Audio effect extension version: {0}.{1}", new Object[]{major, minor});
alc.alcGetIntegerv(device, AL.ALC_MAX_AUXILIARY_SENDS, 1, ib);
auxSends = ib.get(0);
logger.log(Level.INFO, "Audio max auxilary sends: {0}", auxSends);
// create slot
ib.position(0).limit(1);
al.alGenAuxiliaryEffectSlots(1, ib);
reverbFxSlot = ib.get(0);
// create effect
ib.position(0).limit(1);
al.alGenEffects(1, ib);
reverbFx = ib.get(0);
al.alEffecti(reverbFx, AL.AL_EFFECT_TYPE, AL.AL_EFFECT_REVERB);
// attach reverb effect to effect slot
al.alAuxiliaryEffectSloti(reverbFxSlot, AL.AL_EFFECTSLOT_EFFECT, reverbFx);
} else {
logger.log(Level.WARNING, "OpenAL EFX not available! Audio effects won't work.");
}
} catch (ALException ex) {
logger.log(Level.SEVERE, "Failed to load audio library", ex);
audioDisabled = true;

Loading…
Cancel
Save