diff options
Diffstat (limited to 'src/java/com')
-rw-r--r-- | src/java/com/jogamp/openal/impl/ALCImpl.java | 75 | ||||
-rwxr-xr-x | src/java/com/jogamp/openal/impl/ALProcAddressLookup.java | 33 |
2 files changed, 99 insertions, 9 deletions
diff --git a/src/java/com/jogamp/openal/impl/ALCImpl.java b/src/java/com/jogamp/openal/impl/ALCImpl.java new file mode 100644 index 0000000..208e64f --- /dev/null +++ b/src/java/com/jogamp/openal/impl/ALCImpl.java @@ -0,0 +1,75 @@ +/* + * Created on Saturday, July 10 2010 17:08 + */ +package com.jogamp.openal.impl; + +import com.jogamp.openal.ALException; +import com.jogamp.openal.ALCdevice; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.ArrayList; + +/** + * ALC implementation. + * @author Michael Bien + */ +public class ALCImpl extends ALCAbstractImpl { + + public String alcGetString(ALCdevice device, int param) { + if (device == null && param == ALC_DEVICE_SPECIFIER) { + throw new ALException("Call alcGetDeviceSpecifiers to fetch all available device names"); + } + + ByteBuffer buf = alcGetStringImpl(device, param); + if (buf == null) { + return null; + } + byte[] res = new byte[buf.capacity()]; + buf.get(res); + try { + return new String(res, "US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new ALException(e); + } + } + + /** + * Fetches the names of the available ALC device specifiers. + * Equivalent to the C call alcGetString(NULL, ALC_DEVICE_SPECIFIER). + */ + public String[] alcGetDeviceSpecifiers() { + return getDoubleNullTerminatedString(ALC_DEVICE_SPECIFIER); + } + + /** + * Fetches the names of the available ALC capture device specifiers. + * Equivalent to the C call alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER). + */ + public String[] alcGetCaptureDeviceSpecifiers() { + return getDoubleNullTerminatedString(ALC_CAPTURE_DEVICE_SPECIFIER); + } + + private String[] getDoubleNullTerminatedString(int which) { + ByteBuffer buf = alcGetStringImpl(null, which); + if (buf == null) { + return null; + } + byte[] bytes = new byte[buf.capacity()]; + buf.get(bytes); + try { + ArrayList/*<String>*/ res = new ArrayList/*<String>*/(); + int i = 0; + while (i < bytes.length) { + int startIndex = i; + while ((i < bytes.length) && (bytes[i] != 0)) { + i++; + } + res.add(new String(bytes, startIndex, i - startIndex, "US-ASCII")); + i++; + } + return (String[]) res.toArray(new String[res.size()]); + } catch (UnsupportedEncodingException e) { + throw new ALException(e); + } + } +} diff --git a/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java b/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java index 7f16628..45718dd 100755 --- a/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java +++ b/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java @@ -39,19 +39,34 @@ import java.lang.reflect.Field; import com.jogamp.openal.*; import com.jogamp.gluegen.runtime.*; -import com.jogamp.openal.impl.ALCProcAddressTable; -import com.jogamp.openal.impl.ALImpl; -import com.jogamp.openal.impl.ALProcAddressTable; /** Helper class for managing OpenAL-related proc address tables. */ public class ALProcAddressLookup { - private static final ALProcAddressTable alTable = new ALProcAddressTable(); - private static volatile boolean alTableInitialized = false; - private static final ALCProcAddressTable alcTable = new ALCProcAddressTable(); - private static volatile boolean alcTableInitialized = false; - private static final DynamicLookup lookup = new DynamicLookup(); - private static volatile NativeLibrary openAL = null; + + private static final ALProcAddressTable alTable; + private static final ALCProcAddressTable alcTable; + + private static volatile boolean alTableInitialized = false; + private static volatile boolean alcTableInitialized = false; + + private static final DynamicLookup lookup; + private static volatile NativeLibrary openAL; + + static { + //workaround: map renamed fooImpl back to the real function name + FunctionAddressResolver resolver = new FunctionAddressResolver() { + public long resolve(String string, DynamicLookupHelper dlh) { + if (string.endsWith("Impl")) { + string = string.substring(0, string.length() - 4); + } + return dlh.dynamicLookupFunction(string); + } + }; + alcTable = new ALCProcAddressTable(resolver); + alTable = new ALProcAddressTable(); + lookup = new DynamicLookup(); + } static class DynamicLookup implements DynamicLookupHelper { public long dynamicLookupFunction(String functionName) { |