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