Jogamp
www/devmaster/lesson*.html: Fix header, title, navigation and links.
[joal-demos.git] / www / devmaster / lesson2.html
1 <html>
2
3 <head>
4
5 <title>JOAL OpenAL Tutorials from DevMaster.net Lesson 2: Looping and Fade-away</title>
6
7 </head>
8
9 <body>
10 <a href="../index.html"><img src="../../../images/jogamp_symbols/website_final_blue_joal_346x70pel.png" alt="JOAL Symbol"></a><a href="http://www.openal.org"><img src="../openal_c.gif"></a>
11 <br>
12 OpenAL Tutorials from DevMaster.net. Reprinted with Permission.<br>
13 <br>
14
15 <table border="0" cellspacing="0" style="border-collapse: collapse" width="100%" cellpadding="0" id="AutoNumber1" height="12" bgcolor="#666699">
16     <tr>
17     <td width="47%" height="12" valign="middle"><p><b><font color="#FFFFFF">OpenAL 
18         Tutorials</font></b></p></td>
19       <td width="53%" height="12" align="right" valign="middle"><p align="right"><a href="http://devmaster.net/"><font color="#66FF99">DevMaster.net</font></a></p></td>
20     </tr>
21   </table>
22
23 <p align="left" class="title"><span class="title"><font size="5">Looping and 
24 Fade-away</font></span><font size="4"><br>
25 <b>Lesson 2</b></font></p>
26
27 <p align="right" class="title"> <span class="author">Author: <a href="mailto:lightonthewater@hotmail.com"><font color="#888888">Jesse 
28   Maurais<br>
29   </font></a></span><span class="author">Adapted for Java By: <a href="mailto:athomas@dev.java.net"><font color="#888888">Athomas 
30   Goldberg </font></a> </span></p>
31
32 <p><a href="../../../joal/www/jnlp-files/joal-lesson2.jnlp">Launch the Demo via Java Web Start</a></p>
33
34 <p align="justify">Hope you found the last tutorial of some use. I know I did. This will be a 
35 real quick and easy tutorial. It won't get too much more complicated at this point.</p>
36 <pre >
37   <font color="#0000FF">import </font>java.nio.ByteBuffer;
38   <font color="#0000FF">import </font>net.java.games.joal.AL;
39   <font color="#0000FF">import</font> net.java.games.joal.ALC;
40   <font color="#0000FF">import</font> net.java.games.joal.ALFactory;
41   <font color="#0000FF">import</font> net.java.games.joal.util.ALut;
42
43
44   <font color="#0000FF">public</font> <font color="#0000FF">class</font> LoopingAndFadeaway {
45         <font color="#0000FF">static</font> <font color="#0000FF">int</font>[] buffer = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
46         <font color="#0000FF">static</font> <font color="#0000FF">int</font>[] source = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
47         <font color="#0000FF">static</font> <font color="#0000FF">float</font>[] sourcePos = { 0.0f, 0.0f, 0.0f };
48         <font color="#0000FF">static</font> <font color="#0000FF">float</font>[] sourceVel = { 0.0f, 0.0f, 0.1f };
49         <font color="#0000FF">static</font> <font color="#0000FF">float</font>[] listenerPos = { 0.0f, 0.0f, 0.0f };
50         <font color="#0000FF">static</font> <font color="#0000FF">float</font>[] listenerVel = { 0.0f, 0.0f, 0.0f };
51         <font color="#0000FF">static</font> <font color="#0000FF">float</font>[] listenerOri = { 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f };
52         <font color="#0000FF">static</font> AL al;
53         <font color="#0000FF">static</font> ALC alc;</p></pre>
54 <p align="justify">There is only one change in the code since the last tutorial 
55   in this fist section. It is that we altered the sources velocity. It's 'z' field 
56   is now 0.1.</p>
57 <pre class=code>
58     <font color="#0000FF">static</font> <font color="#0000FF">int</font> loadALData() {
59         <font color="#0000FF">if</font> (al.alGetError() != AL.AL_NO_ERROR) {
60             <font color="#0000FF">return</font> AL.AL_FALSE;
61         }
62         <font color="#0000FF">int</font>[] format = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
63         <font color="#0000FF">int</font>[] size = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
64         ByteBuffer[] data = <font color="#0000FF">new</font> ByteBuffer[1];
65         <font color="#0000FF">int</font>[] freq = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
66         <font color="#0000FF">int</font>[] loop = <font color="#0000FF">new</font> <font color="#0000FF">int</font>[1];
67
68
69        <font color="#006600"> // Load wav data into a buffer.</font>
70         
71         al.alGenBuffers(1, buffer);
72         <font color="#0000FF">if </font>(al.alGetError() != AL.AL_NO_ERROR)
73             <font color="#0000FF">return</font> AL.AL_FALSE;
74         ALut.alutLoadWAVFile(
75             &quot;wavdata/Footsteps.wav&quot;,
76             format,
77             data,
78             size,
79             freq,
80             loop);
81         al.alBufferData(buffer[0], format[0], data[0], size[0], freq[0]);
82         ALut.alutUnloadWAV(format[0], data[0], size[0], freq[0]);
83
84         al.alGenSources(1, source);
85         al.alSourcei(source[0], AL.AL_BUFFER, buffer[0]);
86         al.alSourcef(source[0], AL.AL_PITCH, 1.0f);
87         al.alSourcef(source[0], AL.AL_GAIN, 1.0f);
88         al.alSourcefv(source[0], AL.AL_POSITION, sourcePos);
89         al.alSourcefv(source[0], AL.AL_POSITION, sourceVel);
90         al.alSourcei(source[0], AL.AL_LOOPING, AL.AL_TRUE);
91        <font color="#0000FF"> if </font>(al.alGetError() != AL.AL_NO_ERROR) {
92             <font color="#0000FF">return</font> AL.AL_FALSE;
93         }
94         <font color="#0000FF">return</font> AL.AL_TRUE;
95     }</pre>
96 <p align="justify">Two changes in this section. First we are loading the file 
97   &quot;Footsteps.wav&quot;. We are also explicitly setting the sources 'AL_LOOPING' 
98   value to 'AL_TRUE'. What this means is that when the source is prompted to play 
99   it will continue to play until stopped. It will play over again after the sound 
100   clip has ended.</p>
101 <pre class=code>
102     <font color="#0000FF">static <span class=codeKeyword>void</span> </font>setListenerValues() {
103         al.alListenerfv(AL.AL_POSITION, listenerPos);
104         al.alListenerfv(AL.AL_VELOCITY,    listenerVel);
105         al.alListenerfv(AL.AL_ORIENTATION, listenerOri);
106     }
107         
108     <font color="#0000FF">static <span class=codeKeyword>void</span> </font>killALData() {
109         al.alDeleteBuffers(1, buffer);
110         al.alDeleteSources(1, source);
111         Alut.alutExit();
112     }
113 </pre>
114 <p>Nothing has changed here.</p>
115 <pre class=code>
116     <font color="#0000FF">public static void main</font>(String[] args) {
117         ALut.alutInit();
118         al = ALFactory.getAL();
119
120         <font color="#0000FF">if</font>(loadALData() == AL.AL_FALSE) {
121             System.exit(1);
122         }; 
123          setListenerValues();
124         al.alSourcePlay(source[0]);
125         <font color="#0000FF">long</font> startTime = System.currentTimeMillis();
126         <font color="#0000FF">long</font> elapsed = 0;
127         <font color="#0000FF">long</font> ticker = 0;
128         <font color="#0000FF">long</font> lastTime = 0;
129         <font color="#0000FF">while</font> (elapsed < 5000) {
130             elapsed = System.currentTimeMillis() - startTime;            
131             <font color="#0000FF">if</font> (ticker > 100) {
132                 ticker = 0;
133                 sourcePos[0] += sourceVel[0];
134                 sourcePos[1] += sourceVel[1];
135                 sourcePos[2] += sourceVel[2];
136                 al.alSourcefv(
137                     source[0],
138                     AL.AL_POSITION,
139                     sourcePos);
140             }
141             ticker += System.currentTimeMillis() - lastTime;
142             lastTime = System.currentTimeMillis(); 
143         }
144         ALut.alutExit();
145     }
146 }</pre>
147 <p align="justify">The only thing that has changed in this code is the loop. Instead 
148   of playing and stopping the audio sample it will slowly get quieter as the sources 
149   position grows more distant. We do this by slowly incrementing the position 
150   by it's velocity over time. The time is sampled by checking the system clock 
151   which gives us a tick count. It shouldn't be necessary to change this, but if 
152   the audio clip fades too fast you might want to change 100 to some higher number. 
153 </p>
154 <table border="0" cellspacing="1" style="border-collapse: collapse" width="100%" id="AutoNumber2" bgcolor="#666699">
155   <tr> 
156     <td width="40%"> <p dir="ltr"><font color="#FFFFFF" size="2">© 2003 DevMaster.net. 
157         All rights reserved.</font></td>
158     <td width="60%"> <p align="right" dir="ltr"><font size="2"><a href="mailto:webmaster@devmaster.net"> 
159         <font color="#FFFFFF">Contact us</font></a><font color="#FFFFFF"> if you 
160         want to write for us or for any comments, suggestions, or feedback.</font></font></td>
161   </tr>
162 </table>
163 </body>
164 </html>
http://JogAmp.org git info: FAQ, tutorial and man pages.