al calls, either implicitly or explicitly, act upon opaque objects
of the kind `Buffers', `Sources', `Contexts', or `Listeners'. Of these
types, the generation and deletion of `Buffers', `Sources', and
`Contexts' are explicit and must be handled by the application.
To give a brief overview:
`Buffers'
`Buffers' contain PCM audio data, and the parameters associated
with the data (length, frequency, sample width etc). `Buffers'
cannot be played, a `Source' must be associated with them, and the
`Source' is then played.
`Buffers' are created with a call to `alGenBuffers', which creates
a set of buffer ids and binds them to buffers. The buffer id is
the only mechanism by which an application may refer to a buffer.
After its useful lifetime is over, buffer ids should be deleted
via the call `alDeleteBuffers'.
`Sources'
`Sources' are independent objects, which, when played, make sound.
`Sources' need to be associated with a `Buffer' before they can be
played.
`Sources' are created with a call to `alGenSources', which creates
a set of source ids and binds them to sources. The source id is
the only mechanism by which an application may refer to a source.
After its useful lifetime is over, source ids should be deleted
via the call `alDeleteSources'.
`Devices'
A `Device' is a binding to the audio rendered backend used by the
library. This may be an actual hardware device, a software mixing
server, or other abstraction.
At least one device must be created for the generation of contexts.
`Contexts'
A `Context' abstracts the audio device from the rest of the library
(and the application). You generally only need one. Calling most
al functions before creating a context via `alcCreateContext' will
result in either an error or a segfault.
When you're about to quit, call `alcDestroyContext' to destroy the
context and don't make any other al calls.