diff options
Diffstat (limited to 'src/java/jogamp/openal/ALCImpl.java')
-rw-r--r-- | src/java/jogamp/openal/ALCImpl.java | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/java/jogamp/openal/ALCImpl.java b/src/java/jogamp/openal/ALCImpl.java new file mode 100644 index 0000000..75fc47d --- /dev/null +++ b/src/java/jogamp/openal/ALCImpl.java @@ -0,0 +1,93 @@ +/* + * Created on Saturday, July 10 2010 17:08 + */ +package com.jogamp.openal.impl; + +import com.jogamp.common.nio.Buffers; +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); + } + } + + /** Entry point (through function pointer) to C language function: <br> <code> const ALCchar * alcGetString(ALCdevice * device, ALCenum param); </code> */ + public ByteBuffer alcGetStringImpl(ALCdevice device, int param) { + + final long __addr_ = getALCProcAddressTable()._addressof_alcGetString; + if (__addr_ == 0) { + throw new UnsupportedOperationException("Method \"alcGetStringImpl\" not available"); + } + ByteBuffer _res; + _res = dispatch_alcGetStringImpl1(((device == null) ? null : device.getBuffer()), param, __addr_); + if (_res == null) { + return null; + } + Buffers.nativeOrder(_res); + return _res; + } + private native java.nio.ByteBuffer dispatch_alcGetStringImpl1(ByteBuffer deviceBuffer, int param, long addr); + + /** + * 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); + } + } +} |