public OpenALManager(AudioConfig config) throws OpenALException, LWJGLException {
logger.info("Initializing OpenAL audio manager");
config.subscribe(configListener);
AL.create();
AL10.alGetError();
logger.info("OpenAL {} initialized!", AL10.alGetString(AL10.AL_VERSION));
ALCcontext context = ALC10.alcGetCurrentContext();
ALCdevice device = ALC10.alcGetContextsDevice(context);
logger.info("Using OpenAL: {} by {}", AL10.alGetString(AL10.AL_RENDERER), AL10.alGetString(AL10.AL_VENDOR));
logger.info("Using device: {}", ALC10.alcGetString(device, ALC10.ALC_DEVICE_SPECIFIER));
logger.info("Available AL extensions: {}", AL10.alGetString(AL10.AL_EXTENSIONS));
logger.info("Available ALC extensions: {}", ALC10.alcGetString(device, ALC10.ALC_EXTENSIONS));
IntBuffer buffer = BufferUtils.createIntBuffer(1);
ALC10.alcGetInteger(device, ALC11.ALC_MONO_SOURCES, buffer);
logger.info("Max mono sources: {}", buffer.get(0));
buffer.rewind();
ALC10.alcGetInteger(device, ALC11.ALC_STEREO_SOURCES, buffer);
logger.info("Max stereo sources: {}", buffer.get(0));
buffer.rewind();
ALC10.alcGetInteger(device, ALC10.ALC_FREQUENCY, buffer);
logger.info("Mixer frequency: {}", buffer.get(0));
buffer.rewind();
AL10.alDistanceModel(AL10.AL_INVERSE_DISTANCE_CLAMPED);
pools.put("sfx", new OpenALSoundPool(30));
pools.put("music", new OpenALStreamingSoundPool(2));
pools.get("sfx").setVolume(config.getSoundVolume());
pools.get("music").setVolume(config.getMusicVolume());
}