aboutsummaryrefslogtreecommitdiff
path: root/docs/doxygen/nel/nel_sound.html
blob: c1e5ee4c2e187f411fe5a35ea5bf300783c070c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
	<TITLE>nevrax.org : docs</TITLE>
	<LINK REL=stylesheet TYPE="text/css" HREF="/inc/css/nevrax.css">
	<link href="doxygen.css" rel="stylesheet" type="text/css">
</HEAD>
<BODY MARGINHEIGHT="0" MARGINWIDTH="0">

<!-- uplinks -->
<TABLE CELLSPACING=0 CELLPADDING=0  BORDER=0>
 <TR>
        <TD WIDTH=16><IMG  SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
        <TD WIDTH=140 BGCOLOR=#dddddd><IMG  SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD>
        <TD WIDTH=16><IMG  SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
        <TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle>&nbsp;<A CLASS=uplinks HREF=><b>Home</B></FONT></A>&nbsp;&nbsp;&nbsp;</TD>
        <TD><IMG  width=6 height=14  SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle>&nbsp;<A CLASS=uplinks HREF=><b>nevrax.com</B></FONT></A>&nbsp;&nbsp;&nbsp;</TD>
 </TR>
</TABLE> 

<!-- banner Nevrax -->
<TABLE CELLSPACING=0 CELLPADDING=0  BORDER=0 WIDTH=100%>
 <TR><TD  BGCOLOR="#000000" BACKGROUND="/inc/img/black_banner.jpg"><A HREF=""><IMG  SRC="/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR>
</TABLE>

<!-- main table -->
<TABLE CELLSPACING=0 CELLPADDING=0  BORDER=0 height=100%>
 <TR>
	<TD WIDTH=16><IMG  SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD>
	<TD WIDTH=140   BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG  SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">

		<!------ Begin Box ------>
		<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0  cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black>
		<FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td  colspan=2 bgcolor=#FFFFFF>
		<TABLE cellspacing=0 cellpadding=1 border=0>
			<tr><td ALIGN=middle><a  class='linkbox' href="/news/" TITLE="Rubrique news"><img width=13 height=15  hspace=5 border=0 src=/inc/img/picto-news.gif ALT=#></A></td><td><a  class='linkbox' href="/news/" TITLE="News">News</a></td></tr>
			<tr><td ALIGN=middle><a  class='linkbox' href="/mail/" TITLE="Rubrique mail"><img width=15 height=11  hspace=5 border=0 src=/inc/img/picto-mail.gif ALT=#></A></td><td><a  class='linkbox' href="/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr>
			<tr><td ALIGN=middle><a  class='linkbox' href="/docs/" TITLE="Rubrique docs"><img width=14 height=16  hspace=5 border=0 src=/inc/img/picto-docs.gif ALT=#></A></td><td><a  class='linkbox' href="/docs/" TITLE="Documentation">Documentation</a></td></tr>
			<tr><td ALIGN=middle><a  class='linkbox' href="/cvs/" TITLE="Rubrique cvs"><img width=13 height=17  hspace=5 border=0 src=/inc/img/picto-cvs.gif ALT=#></A></td><td><a  class='linkbox' href="/cvs/" TITLE="CVS Web">CVS</a></td></tr>
			<tr><td ALIGN=middle><a  class='linkbox' href="/bugs/" TITLE="Rubrique bugs"><img width=20 height=16  hspace=5 border=0 src=/inc/img/picto-bugs.gif ALT=#></A></td><td><a  class='linkbox' href="/bugs/" TITLE="Bugtracking">Bugs</a></td></tr>
			<tr><td ALIGN=middle><a  class='linkbox' href="/GPL.php3" TITLE="Rubrique license"><img  width=18 height=12   hspace=5 border=0 src=/inc/img/picto-gpl.gif ALT=#></A></td><td><a  class='linkbox' href="/GPL.php3" TITLE="License">License</a></td></tr>
		</TABLE>
		</TD></TR></TABLE></TD></TR></TABLE>
		<!------ End Box  ------>

	</TD>
	<TD WIDTH=15><IMG  SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
	<TD ALIGN=left valign=top><IMG  SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">

<!-- title -->
<TABLE  background="/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0  BORDER=0 width=100%><tr><td>
<A HREF="/docs/"><img src="/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A>
</td><td><IMG  SRC="/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT="">
</td></tr></table>
&nbsp;

<!-- block -->
<TABLE  bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0  BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="/inc/img/reddots.gif"></TD>
	<TD><B>Documentation</B></TD>
	<TD ALIGN=RIGHT>&nbsp;</td>
</tr></table>
<!-- Generated by Doxygen 1.2.14 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="namespacemembers.html">Namespace Members</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; <a class="qindexRef" doxygen="_cgi:/cgi-bin/nel-search.cgi" href="/cgi-bin/nel-search.cgi">Search</a> &nbsp; </center>
<hr><a name="nel_sound"><h2>The NeL Sound Engine</h2></a>
 <dl compact><dt><b>
Author: </b><dd>
Olivier Cado</dl><dl compact><dt><b>
Date: </b><dd>
Updated July 31, 2001</dl><a name="sndoverview"><h2>Overview</h2></a>

<p>
The purpose of the NeL Sound Engine is to provide a high-level library to play sounds and apply environmental effects.
<p>
Here are the types of sounds that can be played:<ul>
<li>Stereo sounds<li>3D sounds, associated with 3D objects that can move<li>Environment sounds, made up of a 3D sound that the listener hears when he or she is far from the source (for example the sound of a bar coming from a building when you are outside) and a surrounding stereo sound heard when the listener is within the environment. This surrounding sound itself is made up of three channels that provide a smooth mix of ambiant sounds (for example the background noise you hear in a bar) and of sparse random sounds (for example a short shout in the bar).</ul>
The environmental effects are combined to 3D areas. The sound engine chooses and applies automatically the good effect depending on the listener's position. For example, if the players enters a cathedral, an effect with a lot of reverberations will be set.
<p>
Both the environment sounds and the environmental effects can be dynamically changed, using a tag to select them in a bank. For example, you could have a "day" and a "night" configuration for a single environmental effect.
<p>
<a name="sndarchi"><h2>Architecture</h2></a>

<p>
<a name="sndlowlevel"><h3>Low level and driver</h3></a>

<p>
Somes classes encapsulate the functionalities of common 3D audio API, such as OpenAL (<a href="http://www.openal.org">http://www.openal.org</a>) and DirectSound3D (<a href="http://www.microsoft.com/directx">http://www.microsoft.com/directx</a>) with EAX (<a href="http://eax.creative.com">http://eax.creative.com</a>): CSoundDriver, IListener, ISource, IBuffer.
<p>
As in NeL 3D, the low level uses a dynamic library to provide a device-independant layer. At present time, a library for OpenAL has been made. OpenAL is a cross-platform, free softwaree API for 3D audio.
<p>
<a name="sndhilevel"><h3>High level library</h3></a>

<p>
The high-level library is intended for the game developers that write the game client. Is is made available through a small set of user include files, as in NeL 3D.
<p>
Although a great number of sources can be created by the user, sound cards and audio APIs limit the number of simultaneous sound sources to a small number (usually 32). The library is able to balance the sources to choose which ones have to be heard, depending on their priority and their distance from the listener.
<p>
An environment sound object (envsound) is a node of an envsound tree, the root of which is returned by UAudioMixer::loadEnvSounds(). The root is the world envsound: it has no bounds. The areas of children envsounds have bounds and they must be totally included in the area of their parent envsound, so that the listener is located in one and only one envsound area
<p>
Here is an example of an envsound tree, showing a geographical view and the tree view:
<p>
<div align="center">
<img src="envsound_tree.png" alt="envsound_tree.png">
</div>
 <div class="fragment"><pre>
                       Root (world envsound)
                       /                   \
                Transition               Transition
                    |                        |
                  Cave1                    City
                                           /  \
                                 Transition    Transition
                                     |             |
                                  Building1     Building2
</pre></div>
<p>
The library performs automatically the mix of environment sources channels contained in most of the envsounds (playing random sounds and crossfading them).
<p>
The library applies automatically the environmental effects as well.
<p>
Finally, it handles object allocation, config file and buffer loading, etc.
<p>
As a conclusion, all the game developer has to do at the very least is to:<ul>
<li>Init the system (class UAudioMixer)<li>Move the listener (class UListener)<li>Move the sources (other players, bots, objects...) (class USource)<li>Possibly move the envsounds (class UEnvSound)</ul>
<a name="sndfiles"><h3>Files</h3></a>

<p>
The environment sounds parameters, such as their 3D area, and the environmental effects parameters are created using an editor. It is likely that it will be a 3DSMax plug-in.
<p>
The sounds used for sources have parameters as well, for example their cone angles. An editor is provided, at the convenience of a sound designer. It can be found in /code/nel/tools/sounds. This editor takes a names file (a text file with one name per line) in input. It allows the game developers to identify the sounds by the names they have chosen.
<p>
<a name="sndcompile"><h2>Compiling the NeL OpenAL Sound Driver</h2></a>

<p>
(The examples are given for my Windows configuration)
<p>
Include paths needed:<ul>
<li>OpenAL base platform dir (C:\NETSHARE\OPENAL\WIN)<li>OpenAL include dir (C:\NETSHARE\OPENAL\WIN\AL)<li>EAX include dir (C:\NETSHARE\CREATIVE LABS\EAX 2.0 EXTENSIONS SDK\INCLUDE)<li>NeL src dir (R:\CODE\NEL\SRC)</ul>
Library paths needed:<ul>
<li>OpenAL .lib location (C:\Netshare\openal\win\openal32\release)<li>OpenAL UT .lib location (C:\Netshare\openal\win\alut\release)<li>EAX .lib location (C:\NETSHARE\CREATIVE LABS\EAX 2.0 EXTENSIONS SDK\LIBS)</ul>
At runtime, the user needs openal32.dll and eax.dll (usually in the system directory).
<p>
Please report any problems to <a href="mailto:cado@nevrax.com">cado@nevrax.com</a> or use the mailing list <a href="mailto:nel@nevrax.org.">nel@nevrax.org.</a>
<p>
<a name="sndlater"><h2>Later enhancements</h2></a>

<p>
In the future, the sound will not be loaded staticly anymore. A streaming feature is technically feasable.
<p>
EAX provides functionalities for sound occlusion/obstruction between a source and the listener. These are not used at present.
<p>


<!-- footer -->
<BR><FONT Size=+5>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </FONT>
</TD>
<TD WIDTH=15><IMG  SRC=/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD>
</TR>
</TABLE>
</BODY>
</HTML>