# OpenAL Tutoral
Basic sound using OpenAL
Author: Brian Matzon

# Array Conversion
(by Brian Matzon <brian@matzon.dk>)

1.0 About this document
This document describes the typical rules for converting arrays often used in C/C++ OpenAL (and indeed OpenGL too) code.
It is not bullet proof, but should handle most cases.
1.1 Array to ByteBuffer
When using an array of some data type in C/C++ you will typically convert that
to the corresponding ByteBuffer type. ie:

`ALfloat floatv[3];`

becomes

`FloatBuffer floatv = createFloatBuffer(3);`

In this example, `createFloatBuffer` is this utility method:

`public FloatBuffer createFloatBuffer(int size) {
//allocate bytebuffer, using 4 bytes per float
ByteBuffer temp = ByteBuffer.allocateDirect(4*size);
temp.order(ByteOrder.nativeOrder());
return temp.asFloatBuffer();
}`

1.2 Examples
Using the above FloatBuffer, you would typically use it like this (examples taken from altest.c/ALTest.java):

1.2.1 Example 1

`alGetListenerfv(AL_POSITION, floatv);`

becomes

`al.getListenerfv(AL.POSITION, Sys.getDirectBufferAddress(floatv));`

1.2.2 Example 2

`if (floatv[0] != 100.0)) {`

becomes:

`if (floatv.get(0) != 100.0f) {`

1.2.3 Example 3

`alGetListener3f(AL_POSITION, &floatv[0],
&floatv[1],
&floatv[2]);`

becomes

`al.getListener3f(AL.POSITION, Sys.getDirectBufferAddress(floatv),
Sys.getDirectBufferAddress(floatv) + 4,
Sys.getDirectBufferAddress(floatv) + 8);`

the last case is a bit special, since we start of by getting the base address of the buffer, and then add the datatype size to the base address
to get the address of that specific index. This is just how it has to be in Java.