lwjgl/doc/tutorial/openal_basics.html

154 lines
6.1 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>OpenAL Tutoral</title>
<meta http-equiv="content-type"
content="text/html; charset=windows-1252">
<meta name="author" content="Brian Matzon">
<meta name="description" content="Basic sound using OpenAL">
</head>
<body>
<h1 align="center">OpenAL Tutorial<br>
<font size="-1">(by Brian Matzon &lt;<a href="mailto:brian@matzon.dk">brian@matzon.dk</a>&gt;)</font><br>
</h1>
<b>1.0 OpenAL Basics</b><br>
Before embarking on our little OpenAL adventure, some tools are needed.<br>
<br>
<b>1.0.1 Ingredients</b><br>
Head on over to Creatives <a
href="http://developer.creative.com/scripts/DC_D&amp;H_Games-Downloads.asp?opt=2">site</a>
and snag a copy of the OpenAL specification along with a copy of the Programmers
reference.<br>
If you haven't already done so, get a copy of the OpenAL runtime environment
too (and install it).<br>
<br>
<b>1.1 OpenAL theory</b><br>
Uhm... I'm not going to write this... In all honesty reading the specification
would be a good thing before continuing - but it isn't required...<br>
<br>
<b>1.2 Basic setup</b><br>
Lets start out by creating a skeleton class for some very basic sound. We'll
start of by creating the required OpenAL object<br>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt>import
org.lwjgl.openal.AL;<br>
<br>
public class PlayTest {<br>
    <br>
  /** OpenAL instance */<br>
  protected AL al;<br>
<br>
  /**<br>
   * Creates an instance of PlayTest<br>
   */<br>
  public PlayTest() {<br>
    try {<br>
</tt>         
<tt> al = new AL();<br>
      al.create();<br>
   } catch (Exception e) {<br>
      e.printStackTrace();<br>
    }</tt><tt><br>
  }<br>
}</tt></p>
<p><b>1.3 Buffer and Source creation</b><br>
Now that we have created the AL instance, we need to create
two things to actually get some sound. We need to create a buffer to hold
sound data, and a source that is to play the sound data.<br>
Lets start of by creating one source, and one buffer:</p>
<p style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);">
<tt>
&nbsp;&nbsp;//create one IntBuffer as buffer and one as source<br>
&nbsp;&nbsp;//createIntBuffer is a utility method which allocates a direct ByteBuffer in native order<br>
  IntBuffer buffers = createIntBuffer(1);<br>
  IntBuffer sources = createIntBuffer(1);<br>
<br>
  //generate buffers and sources<br>
  al.genBuffers(1, Sys.getDirectBufferAddress(buffers));<br>
  al.genSources(1, Sys.getDirectBufferAddress(sources));
</tt>
</p>
<p>There, all set for actually loading some sound data into the buffer.<br>
</p>
<b>1.4 Loading sound data and setting up a buffer</b><br>
Now that we have a buffer, we need to load some sound data into this buffer.
This is done using the <tt>al.bufferData</tt> method. In our example we will
"cheat" a bit, by using the <tt>WaveData</tt> class to load
a wave file, and copy this into the buffer:<br>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt> 
//load wave data<br>
  WaveData wavefile = WaveData.create("mywavefile.wav");<br>
        <br>
  //copy to buffer<br>
  al.bufferData(buffers.get(0), wavefile.format, Sys.getDirectBufferAddress(wavefile.data), wavefile.data.capacity(), wavefile.samplerate);<br>
        <br>
  //unload file again<br>
  wavefile.dispose();        <br>
</tt></p>
Having loaded the data, we pass it to <tt>bufferData</tt>. Once the buffer
has been filled with sound data, we unload it from the system using <tt>wavefile.dispose()</tt>.
Don't worry about deleting it this soon - the sound data has been <b>copied</b>
to the buffer.<br>
<br>
<b>1.5 Associating sources and buffers</b><br>
To associate a source to a buffer we set the integer BUFFER attribute on
the source, and assign it a value of the buffer to play:<br>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt> 
//set up source input<br>
  al.sourcei(sources.get(0), AL.BUFFER, buffers.get(0));</tt><tt><br>
</tt></p>
<b>1.6 Setting source properties</b><br>
Having set up the source, it is time to set some attributes on the source
- there are many that can be set, but in this example we only set the looping
attribute to true by doing the following:<br>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt> 
//loop source<br>
  al.sourcei(sources.get(0), AL.LOOPING, AL.TRUE);</tt><tt><br>
</tt></p>
<b>1.7 Sound...<br>
</b>There, ready to play the sound, do this using the <tt>sourcePlay </tt>method
of the <tt>AL </tt>class. to stop and pause use <tt>sourcePause </tt>and
<tt>sourceStop </tt>respectively, and supply the source to affect:<br>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt> 
//play source 0<br>
  al.sourcePlay(sources.get(0));<br>
        <br>
  //wait 5 secs<br>
  try {<br>
    System.out.println("Waiting 5 seconds for sound to complete");<br>
    Thread.sleep(5000);<br>
  } catch (InterruptedException inte) {<br>
  }<br>
        <br>
  //stop source 0<br>
  al.sourceStop(sources.get(0));</tt></p>
<b>1.8 Cleaning up<br>
</b>Having had loads of fun playing a sound (!), it is now time to do some
house chores. We need to clean up what we have created, this amounts to:<br>
 - deleting source and buffer<br>
 - destroying AL<br>
as is shown here:<b><br>
</b>
<p
style="border-style: solid; border-width: 1px; padding: 3px; background-color: rgb(255,255,204);"><tt> 
//delete buffers and sources<br>
  al.deleteSources(1, Sys.getDirectBufferAddress(sources));<br>
  al.deleteBuffers(1, Sys.getDirectBufferAddress(buffers));<br>
        <br>
  //shutdown<br>
  al.destroy();<br>
</tt>
</p>
There, all set. Now you should be able to play some basic sound!<br>
This tutorial is rather short, and the above examples feature no error checking.
For the complete source code, look at the classes in the <br>
<a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/java/org/lwjgl/test/openal/" target="_blank"><tt>org.lwjgl.test.openal</tt></a> package.<br>
</body>
</html>