diff options
Diffstat (limited to '')
-rw-r--r-- | docs/doxygen/nel/source__dsound_8cpp-source.html | 2315 |
1 files changed, 2315 insertions, 0 deletions
diff --git a/docs/doxygen/nel/source__dsound_8cpp-source.html b/docs/doxygen/nel/source__dsound_8cpp-source.html new file mode 100644 index 00000000..4ac05662 --- /dev/null +++ b/docs/doxygen/nel/source__dsound_8cpp-source.html @@ -0,0 +1,2315 @@ +<!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="http://www.nevrax.org/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="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/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="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/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="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- 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="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>source_dsound.cpp</h1><a href="source__dsound_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00007 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> +00008 <font class="comment"> *</font> +00009 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00013 <font class="comment"> * any later version.</font> +00014 <font class="comment"></font> +00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00018 <font class="comment"> * General Public License for more details.</font> +00019 <font class="comment"></font> +00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00023 <font class="comment"> * MA 02111-1307, USA.</font> +00024 <font class="comment"> */</font> +00025 +00026 +00027 <font class="preprocessor">#include "<a class="code" href="stddsound_8h.html">stddsound.h</a>"</font> +00028 <font class="preprocessor">#include "<a class="code" href="source__dsound_8h.html">source_dsound.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="sound__driver__dsound_8h.html">sound_driver_dsound.h</a>"</font> +00030 <font class="preprocessor">#include "<a class="code" href="buffer__dsound_8h.html">buffer_dsound.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="listener__dsound_8h.html">listener_dsound.h</a>"</font> +00032 +00033 +00034 +00035 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00036 +00037 +00038 <font class="keyword">namespace </font>NLSOUND { +00039 +00040 +00041 <font class="preprocessor">#if NLSOUND_PROFILE</font> +00042 <font class="preprocessor"></font> +00043 <font class="preprocessor"> #define INITTIME(_var) TTicks _var = CTime::getPerformanceTime()</font> +00044 <font class="preprocessor"></font> +00045 <font class="preprocessor"> #define DEBUG_POSITIONS 1</font> +00046 <font class="preprocessor"></font> +00047 <font class="preprocessor"> #if DEBUG_POSITIONS</font> +00048 <font class="preprocessor"></font><font class="preprocessor"> #define DBGPOS(_a) nldebug ## _a</font> +00049 <font class="preprocessor"></font><font class="preprocessor"> #else</font> +00050 <font class="preprocessor"></font><font class="preprocessor"> #define DBGPOS(_a) </font> +00051 <font class="preprocessor"></font><font class="preprocessor"> #endif</font> +00052 <font class="preprocessor"></font> +00053 <font class="preprocessor">#else</font> +<a name="l00054"></a><a class="code" href="source__dsound_8cpp.html#a0">00054</a> <font class="preprocessor"></font><font class="preprocessor"> #define INITTIME(_var)</font> +<a name="l00055"></a><a class="code" href="source__dsound_8cpp.html#a1">00055</a> <font class="preprocessor"></font><font class="preprocessor"> #define DBGPOS(_a) </font> +00056 <font class="preprocessor"></font><font class="preprocessor">#endif</font> +00057 <font class="preprocessor"></font> +00058 +00059 +<a name="l00060"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">00060</a> uint32 CSourceDSound::_SecondaryBufferSize = 65536; +<a name="l00061"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r1">00061</a> uint32 CSourceDSound::_SwapCopySize = 32768; +<a name="l00062"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">00062</a> uint32 CSourceDSound::_UpdateCopySize = 16384; +<a name="l00063"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r5">00063</a> uint32 CSourceDSound::_XFadeSize = 64; +<a name="l00064"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r2">00064</a> uint CSourceDSound::_DefaultChannels = 1; +<a name="l00065"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r3">00065</a> uint CSourceDSound::_DefaultSampleRate = 22050; +<a name="l00066"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#r4">00066</a> uint CSourceDSound::_DefaultSampleSize = 16; +00067 +00068 +00069 +<a name="l00070"></a><a class="code" href="source__dsound_8cpp.html#a2">00070</a> <font class="preprocessor">#define NLSOUND_MIN(_a,_b) (((_a) < (_b)) ? (_a) : (_b))</font> +<a name="l00071"></a><a class="code" href="source__dsound_8cpp.html#a3">00071</a> <font class="preprocessor"></font><font class="preprocessor">#define NLSOUND_DISTANCE(_from, _to, _period) (((_to) > (_from)) ? (_to) - (_from) : (_period) + (_to) - (_from))</font> +00072 <font class="preprocessor"></font> +00073 +00074 <font class="preprocessor">#if NLSOUND_PROFILE</font> +00075 <font class="preprocessor"></font> +00076 <font class="comment">// Static variables used for profiling</font> +00077 <font class="keywordtype">double</font> CSourceDSound::_LastSwapTime = 0.0; +00078 <font class="keywordtype">double</font> CSourceDSound::_TotalSwapTime = 0.0; +00079 <font class="keywordtype">double</font> CSourceDSound::_MaxSwapTime = 0.0; +00080 <font class="keywordtype">double</font> CSourceDSound::_MinSwapTime = 1000000.0; +00081 uint32 CSourceDSound::_SwapCount = 0; +00082 <font class="keywordtype">double</font> CSourceDSound::_PosTime = 0.0; +00083 <font class="keywordtype">double</font> CSourceDSound::_LockTime = 0.0; +00084 <font class="keywordtype">double</font> CSourceDSound::_CopyTime = 0.0; +00085 <font class="keywordtype">double</font> CSourceDSound::_UnlockTime = 0.0; +00086 uint32 CSourceDSound::_CopyCount = 0; +00087 <font class="keywordtype">double</font> CSourceDSound::_TotalUpdateTime = 0.0; +00088 <font class="keywordtype">double</font> CSourceDSound::_MaxUpdateTime = 0.0; +00089 <font class="keywordtype">double</font> CSourceDSound::_MinUpdateTime = 1000000.0; +00090 uint32 CSourceDSound::_UpdateCount = 0; +00091 uint32 CSourceDSound::_TotalUpdateSize = 0; +00092 <font class="preprocessor">#endif</font> +00093 <font class="preprocessor"></font> +00094 +00095 +00096 <font class="comment">// ******************************************************************</font> +00097 +<a name="l00098"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a0">00098</a> CSourceDSound::CSourceDSound( uint sourcename ) : ISource(), _SourceName(sourcename) +00099 { +00100 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> = 0; +00101 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> = 0; +00102 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> = 0; +00103 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a29">NL_DSOUND_SILENCED</a>; +00104 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> = 0; +00105 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> = 0; +00106 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00107 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = 0; +00108 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o3">_Loop</a> = <font class="keyword">false</font>; +00109 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> = 0; +00110 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = <a class="code" href="namespaceNLSOUND.html#a86a33">NL_DSOUND_TAIL1</a>; +00111 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +00112 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o14">_Freq</a> = 1.0f; +00113 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o15">_SampleRate</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r3">_DefaultSampleRate</a>; +00114 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o16">_IsUsed</a> = <font class="keyword">false</font>; +00115 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o18">_Gain</a> = 1.0f; +00116 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o17">_Volume</a> = 0; +00117 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> = 0.0; +00118 InitializeCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00119 } +00120 +00121 +00122 <font class="comment">// ******************************************************************</font> +00123 +<a name="l00124"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a1">00124</a> CSourceDSound::~CSourceDSound() +00125 { +00126 <a class="code" href="debug_8h.html#a0">nldebug</a>(<font class="stringliteral">"Destroying DirectSound source"</font>); +00127 +00128 CSoundDriverDSound::instance()->removeSource(<font class="keyword">this</font>); +00129 +00130 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00131 +00132 <font class="comment">// Release the DirectSound buffer within the critical zone</font> +00133 <font class="comment">// to avoid a call to update during deconstruction</font> +00134 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c0">release</a>(); +00135 +00136 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00137 DeleteCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00138 } +00139 +00140 +00141 <font class="comment">// ******************************************************************</font> +00142 +<a name="l00143"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c0">00143</a> <font class="keywordtype">void</font> CSourceDSound::release() +00144 { +00145 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> = 0; +00146 +00147 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> != 0) +00148 { +00149 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Stop(); +00150 } +00151 +00152 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00153 { +00154 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->Release(); +00155 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> = 0; +00156 } +00157 +00158 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> != 0) +00159 { +00160 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Release(); +00161 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> = 0; +00162 } +00163 +00164 } +00165 +00166 <font class="comment">// ******************************************************************</font> +00167 +<a name="l00168"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a2">00168</a> <font class="keywordtype">void</font> CSourceDSound::init(LPDIRECTSOUND directSound) +00169 { +00170 +00171 <font class="comment">// Initialize the buffer format</font> +00172 WAVEFORMATEX <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; +00173 +00174 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.cbSize = <font class="keyword">sizeof</font>(WAVEFORMATEX); +00175 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nChannels = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r2">_DefaultChannels</a>; +00176 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.wBitsPerSample = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r4">_DefaultSampleSize</a>; +00177 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nSamplesPerSec = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r3">_DefaultSampleRate</a>; +00178 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nBlockAlign = <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nChannels * <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.wBitsPerSample / 8; +00179 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nAvgBytesPerSec = <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nSamplesPerSec * <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.nBlockAlign; +00180 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.wFormatTag = WAVE_FORMAT_PCM; +00181 +00182 +00183 <font class="comment">// Initialize the buffer description </font> +00184 +00185 DSBUFFERDESC desc; +00186 +00187 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#l0">CSoundDriverDSound</a>* driver = CSoundDriverDSound::instance(); +00188 +00189 +00190 ZeroMemory(&desc, <font class="keyword">sizeof</font>(DSBUFFERDESC)); +00191 desc.dwSize = <font class="keyword">sizeof</font>(DSBUFFERDESC); +00192 desc.lpwfxFormat = &<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; +00193 desc.dwBufferBytes = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +00194 desc.dwReserved = 0; +00195 +00196 <font class="keywordflow">if</font> (driver->countHw3DBuffers() > 0) +00197 { +00198 <font class="comment">//nldebug("Source: Allocating 3D buffer in hardware");</font> +00199 desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCHARDWARE | DSBCAPS_GETCURRENTPOSITION2 +00200 | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE; +00201 } +00202 <font class="keywordflow">else</font> +00203 { +00204 <font class="comment">//nldebug("Source: Allocating 3D buffer in software");</font> +00205 desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCSOFTWARE | DSBCAPS_GETCURRENTPOSITION2 +00206 | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE; +00207 desc.guid3DAlgorithm = DS3DALG_NO_VIRTUALIZATION; +00208 <font class="comment">//desc.guid3DAlgorithm = DS3DALG_HRTF_FULL;</font> +00209 } +00210 +00211 +00212 <font class="comment">// Allocate the secondary buffer</font> +00213 +00214 <font class="keywordflow">if</font> (FAILED(directSound->CreateSoundBuffer(&desc, &<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>, NULL))) +00215 { +00216 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Source: Failed to create a buffer with 3D capabilities."</font>); +00217 +00218 ZeroMemory(&desc, <font class="keyword">sizeof</font>(DSBUFFERDESC)); +00219 desc.dwSize = <font class="keyword">sizeof</font>(DSBUFFERDESC); +00220 desc.lpwfxFormat = &<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; +00221 desc.dwBufferBytes = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +00222 desc.dwReserved = 0; +00223 +00224 <font class="keywordflow">if</font> (driver->countHw2DBuffers() > 0) +00225 { +00226 <font class="comment">//nldebug("Source: Allocating 2D buffer in hardware");</font> +00227 desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCHARDWARE | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; +00228 } +00229 <font class="keywordflow">else</font> +00230 { +00231 <font class="comment">//nldebug("Source: Allocating 2D buffer in software");</font> +00232 desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCSOFTWARE | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; +00233 } +00234 +00235 <font class="keywordflow">if</font> (FAILED(directSound->CreateSoundBuffer(&desc, &<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>, NULL))) +00236 { +00237 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Failed to allocate the DirectSound secondary buffer"</font>); +00238 } +00239 } +00240 +00241 +00242 <font class="comment">// Fill the buffer with silence</font> +00243 +00244 LPVOID ptr; +00245 DWORD bytes; +00246 +00247 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Lock(0, 0, &ptr, &bytes, NULL, NULL, DSBLOCK_ENTIREBUFFER))) +00248 { +00249 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Failed to lock the DirectSound secondary buffer"</font>); +00250 } +00251 +00252 memset(ptr, 0, bytes); +00253 +00254 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr, bytes, 0, 0); +00255 +00256 <font class="comment">// Allocate the 3D interface, if necessary</font> +00257 +00258 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->QueryInterface(IID_IDirectSound3DBuffer, (LPVOID *) &<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>))) +00259 { +00260 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Failed to allocate the DirectSound 3D buffer"</font>); +00261 } +00262 +00263 +00264 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Play(0, 0, DSBPLAY_LOOPING))) +00265 { +00266 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Play failed"</font>); +00267 } +00268 +00269 } +00270 +00271 <font class="comment">// ******************************************************************</font> +00272 +<a name="l00273"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a5">00273</a> <font class="keywordtype">void</font> CSourceDSound::reset() +00274 { +00275 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_8">setPitch</a>(1.0f); +00276 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_0">setLooping</a>(<font class="keyword">false</font>); +00277 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_6">setGain</a>(1.0f); +00278 } +00279 +00280 +00281 <font class="comment">// ******************************************************************</font> +00282 +<a name="l00283"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z968_0">00283</a> <font class="keywordtype">void</font> CSourceDSound::setStaticBuffer( IBuffer *buffer ) +00284 { +00285 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00286 +00287 <font class="comment">// If the user calls setStaticBuffer with a null buffer,</font> +00288 <font class="comment">// stop the currently playing buffer and set it to null.</font> +00289 <font class="comment">// Otherwise, store the buffer in the swap buffer variable.</font> +00290 <font class="comment">// A crossfade between the current buffer and the swap buffer</font> +00291 <font class="comment">// will be done when the user calls play.</font> +00292 <font class="keywordflow">if</font> (buffer == 0) +00293 { +00294 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_3">stop</a>(); +00295 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> = 0; +00296 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> = 0; +00297 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00298 } +00299 +00300 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> = <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> = buffer; +00301 +00302 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00303 } +00304 +00305 +00306 +00307 <font class="comment">// ******************************************************************</font> +00308 +<a name="l00309"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_0">00309</a> <font class="keywordtype">void</font> CSourceDSound::setLooping( <font class="keywordtype">bool</font> <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> ) +00310 { +00311 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o3">_Loop</a> = <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +00312 } +00313 +00314 +00315 <font class="comment">// ******************************************************************</font> +00316 +<a name="l00317"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_1">00317</a> <font class="keywordtype">bool</font> CSourceDSound::getLooping()<font class="keyword"> const</font> +00318 <font class="keyword"></font>{ +00319 <font class="keywordflow">return</font> <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o3">_Loop</a>; +00320 } +00321 +00322 +00323 <font class="comment">// ******************************************************************</font> +00324 +<a name="l00325"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c3">00325</a> <font class="keywordtype">void</font> CSourceDSound::swap() +00326 { +00327 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>; +00328 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> = <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>->getSize(); +00329 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00330 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> = 0; +00331 } +00332 +00333 <font class="comment">// ******************************************************************</font> +00334 +<a name="l00335"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_2">00335</a> <font class="keywordtype">bool</font> CSourceDSound::play() +00336 { +00337 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00338 +00339 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> == 0 || ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>)->getData() == 0) +00340 { +00341 <font class="comment">// the sample has been unloaded, can't play!</font> +00342 +00343 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00344 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00345 } +00346 +00347 +00348 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: Enter, buffer state = %u"</font>, <font class="keyword">this</font>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a>)); +00349 <font class="keywordflow">switch</font> (_SecondaryBufferState) +00350 { +00351 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a27">NL_DSOUND_FILLING</a>: +00352 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> != 0) +00353 { +00354 <font class="comment">// crossfade to the new sound </font> +00355 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: XFading 1"</font>, <font class="keyword">this</font>)); +00356 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c7">crossFade</a>(); +00357 } +00358 <font class="keywordflow">break</font>; +00359 +00360 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>: +00361 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> != 0) +00362 { +00363 <font class="keywordflow">if</font> ((<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> != 0) && (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>)) +00364 { +00365 <font class="comment">// crossfade to the new sound</font> +00366 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: XFading 2"</font>, <font class="keyword">this</font>)); +00367 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c7">crossFade</a>(); +00368 } +00369 <font class="keywordflow">else</font> +00370 { +00371 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: Swap & fadein 1"</font>, <font class="keyword">this</font>)); +00372 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c3">swap</a>(); +00373 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c9">fadeIn</a>(); +00374 } +00375 } +00376 <font class="keywordflow">else</font> +00377 { +00378 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: Fadein"</font>, <font class="keyword">this</font>)); +00379 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00380 <font class="comment">// start the old sound again</font> +00381 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c9">fadeIn</a>(); +00382 } +00383 +00384 <font class="keywordflow">break</font>; +00385 +00386 +00387 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a29">NL_DSOUND_SILENCED</a>: +00388 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> != 0) +00389 { +00390 <font class="comment">// fade in to the new sound</font> +00391 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: Swap & fadein 2"</font>, <font class="keyword">this</font>)); +00392 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c3">swap</a>(); +00393 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c9">fadeIn</a>(); +00394 } +00395 <font class="keywordflow">else</font> +00396 { +00397 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: Fadein"</font>, <font class="keyword">this</font>)); +00398 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00399 <font class="comment">// start the old sound again</font> +00400 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c9">fadeIn</a>(); +00401 } +00402 } +00403 +00404 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>; +00405 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PLAY: PLAYING"</font>, <font class="keyword">this</font>)); +00406 +00407 <font class="comment">//nldebug ("NLSOUND: %p play", this);</font> +00408 +00409 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00410 +00411 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00412 } +00413 +00414 +00415 <font class="comment">// ******************************************************************</font> +00416 +<a name="l00417"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_3">00417</a> <font class="keywordtype">void</font> CSourceDSound::stop() +00418 { +00419 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00420 +00421 <a class="code" href="namespaceNLSOUND.html#a85">TSourceDSoundUserState</a> old = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a>; +00422 +00423 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +00424 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] STOP: STOPPED"</font>, <font class="keyword">this</font>)); +00425 +00426 <font class="comment">//nldebug ("NLSOUND: %p stop", this);</font> +00427 +00428 <font class="keywordflow">if</font> (old == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>) +00429 { +00430 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c8">fadeOut</a>(); +00431 } +00432 +00433 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +00434 +00435 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00436 } +00437 +00438 <font class="comment">// ******************************************************************</font> +00439 +<a name="l00440"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_4">00440</a> <font class="keywordtype">void</font> CSourceDSound::pause() +00441 { +00442 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00443 +00444 <a class="code" href="namespaceNLSOUND.html#a85">TSourceDSoundUserState</a> old = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a>; +00445 +00446 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a31">NL_DSOUND_PAUSED</a>; +00447 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] PAUZ: PAUSED"</font>, <font class="keyword">this</font>)); +00448 +00449 <font class="comment">//nldebug ("NLOUND: pause %p", this);</font> +00450 +00451 <font class="keywordflow">if</font> (old == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>) +00452 { +00453 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c8">fadeOut</a>(); +00454 } +00455 +00456 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00457 } +00458 +00459 <font class="comment">// ******************************************************************</font> +00460 +<a name="l00461"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_5">00461</a> <font class="keywordtype">bool</font> CSourceDSound::isPlaying()<font class="keyword"> const</font> +00462 <font class="keyword"></font>{ +00463 <font class="keywordflow">return</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>); +00464 } +00465 +00466 +00467 <font class="comment">// ******************************************************************</font> +00468 +<a name="l00469"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_7">00469</a> <font class="keywordtype">bool</font> CSourceDSound::isPaused()<font class="keyword"> const</font> +00470 <font class="keyword"></font>{ +00471 <font class="keywordflow">return</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a31">NL_DSOUND_PAUSED</a>); +00472 } +00473 +00474 +00475 <font class="comment">// ******************************************************************</font> +00476 +<a name="l00477"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_6">00477</a> <font class="keywordtype">bool</font> CSourceDSound::isStopped()<font class="keyword"> const</font> +00478 <font class="keyword"></font>{ +00479 <font class="keywordflow">return</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>); +00480 } +00481 +00482 +00483 <font class="comment">// ******************************************************************</font> +00484 +<a name="l00485"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c10">00485</a> <font class="keywordtype">bool</font> CSourceDSound::needsUpdate() +00486 { +00487 DWORD playPos, writePos; +00488 uint32 space; +00489 +00490 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +00491 { +00492 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00493 } +00494 +00495 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +00496 +00497 +00498 <font class="keywordflow">if</font> (playPos == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +00499 { +00500 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00501 } +00502 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +00503 { +00504 space = playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +00505 } +00506 <font class="keywordflow">else</font> +00507 { +00508 space = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a> + playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +00509 } +00510 +00511 <font class="comment">// Don't bother if the number of samples is smaller than the copy size.</font> +00512 <font class="keywordflow">return</font> (space > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>); +00513 } +00514 +00515 +00516 +00517 <font class="comment">// ******************************************************************</font> +00518 +<a name="l00519"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_8">00519</a> <font class="keywordtype">void</font> CSourceDSound::update() +00520 { +00521 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_9">update2</a>(); +00522 } +00523 +00524 <font class="comment">// ******************************************************************</font> +00525 +<a name="l00526"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z969_9">00526</a> <font class="keywordtype">bool</font> CSourceDSound::update2() +00527 { +00528 <font class="keywordtype">bool</font> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <font class="keyword">false</font>; +00529 +00530 +00531 +00532 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(start); +00533 +00534 <font class="comment">//</font> +00535 <font class="comment">// Enter critical region</font> +00536 <font class="comment">//</font> +00537 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00538 +00539 +00540 <font class="keywordflow">switch</font> (_SecondaryBufferState) +00541 { +00542 +00543 +00544 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a29">NL_DSOUND_SILENCED</a>: +00545 { +00546 <font class="comment">// Just pretend were writing silence by advancing the next </font> +00547 <font class="comment">// write position.</font> +00548 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> += <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>; +00549 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +00550 { +00551 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +00552 } +00553 } +00554 <font class="keywordflow">break</font>; +00555 +00556 +00557 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a27">NL_DSOUND_FILLING</a>: +00558 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c5">fill</a>(); +00559 <font class="keywordflow">break</font>; +00560 +00561 +00562 <font class="keywordflow">case</font> <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>: +00563 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c6">silence</a>(); +00564 <font class="keywordflow">break</font>; +00565 +00566 } +00567 +00568 +00569 <font class="comment">//</font> +00570 <font class="comment">// Leave critical region</font> +00571 <font class="comment">//</font> +00572 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +00573 +00574 +00575 <font class="preprocessor">#if NLSOUND_PROFILE</font> +00576 <font class="preprocessor"></font> <font class="keywordtype">double</font> dt = CTime::ticksToSecond(CTime::getPerformanceTime() - start);; +00577 _TotalUpdateTime += dt; +00578 _MaxUpdateTime = (dt > _MaxUpdateTime) ? dt : _MaxUpdateTime; +00579 _MinUpdateTime = (dt < _MinUpdateTime) ? dt : _MinUpdateTime; +00580 _UpdateCount++; +00581 <font class="preprocessor">#endif</font> +00582 <font class="preprocessor"></font> +00583 <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>; +00584 } +00585 +00586 +00587 +00588 <font class="comment">// ******************************************************************</font> +00589 +<a name="l00590"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_0">00590</a> <font class="keywordtype">void</font> CSourceDSound::setPos( <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& pos, <font class="keywordtype">bool</font> deferred ) +00591 { +00592 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o20">_Pos</a> = pos; +00593 <font class="comment">// Coordinate system: conversion from NeL to OpenAL/GL:</font> +00594 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != NULL) +00595 { +00596 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetPosition(pos.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, pos.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>, pos.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, deferred ? DS3D_DEFERRED : DS3D_IMMEDIATE) != DS_OK) +00597 { +00598 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"SetPosition failed"</font>); +00599 } +00600 <font class="keywordflow">else</font> +00601 { +00602 <font class="comment">//nlwarning ("%p set source NEL(p:%.2f/%.2f/%.2f) DS(p:%.2f/%.2f/%.2f)", this, pos.x, pos.y, pos.z, pos.x, pos.z, pos.y);</font> +00603 } +00604 } +00605 } +00606 +00607 +00608 <font class="comment">// ******************************************************************</font> +00609 +<a name="l00610"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_1">00610</a> <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &CSourceDSound::getPos()<font class="keyword"> const</font> +00611 <font class="keyword"></font>{ +00612 <font class="keywordflow">return</font> <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o20">_Pos</a>; +00613 <font class="comment">// Coordinate system: conversion from NeL to OpenAL/GL:</font> +00614 <font class="comment">/* if (_3DBuffer != NULL)</font> +00615 <font class="comment"> {</font> +00616 <font class="comment"> D3DVECTOR v;</font> +00617 <font class="comment"> HRESULT hr = _3DBuffer->GetPosition(&v);</font> +00618 <font class="comment"></font> +00619 <font class="comment"> if (hr != DS_OK)</font> +00620 <font class="comment"> {</font> +00621 <font class="comment"> nlwarning ("GetPosition failed");</font> +00622 <font class="comment"> pos.set(0, 0, 0); </font> +00623 <font class="comment"> }</font> +00624 <font class="comment"> else</font> +00625 <font class="comment"> {</font> +00626 <font class="comment"> pos.set(v.x, v.z, v.y);</font> +00627 <font class="comment"> }</font> +00628 <font class="comment"> }</font> +00629 <font class="comment"> else</font> +00630 <font class="comment"> {</font> +00631 <font class="comment"> pos.set(0, 0, 0); </font> +00632 <font class="comment"> }</font> +00633 <font class="comment">*/</font> +00634 } +00635 +00636 +00637 <font class="comment">// ******************************************************************</font> +00638 +<a name="l00639"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_2">00639</a> <font class="keywordtype">void</font> CSourceDSound::setVelocity( <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& vel, <font class="keywordtype">bool</font> deferred ) +00640 { +00641 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != NULL) +00642 { +00643 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetVelocity(vel.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, vel.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>, vel.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, deferred ? DS3D_DEFERRED : DS3D_IMMEDIATE) != DS_OK) +00644 { +00645 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"SetVelocity failed"</font>); +00646 } +00647 } +00648 } +00649 +00650 +00651 <font class="comment">// ******************************************************************</font> +00652 +<a name="l00653"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_3">00653</a> <font class="keywordtype">void</font> CSourceDSound::getVelocity( <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& vel )<font class="keyword"> const</font> +00654 <font class="keyword"></font>{ +00655 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != NULL) +00656 { +00657 D3DVECTOR <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>; +00658 +00659 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetVelocity(&<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>) != DS_OK) +00660 { +00661 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"GetVelocity failed"</font>); +00662 vel.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(0, 0, 0); +00663 } +00664 <font class="keywordflow">else</font> +00665 { +00666 vel.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); +00667 } +00668 } +00669 <font class="keywordflow">else</font> +00670 { +00671 vel.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(0, 0, 0); +00672 } +00673 } +00674 +00675 +00676 <font class="comment">// ******************************************************************</font> +00677 +<a name="l00678"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_4">00678</a> <font class="keywordtype">void</font> CSourceDSound::setDirection( <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& dir ) +00679 { +00680 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00681 { +00682 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetConeOrientation(dir.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, dir.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>, dir.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, DS3D_DEFERRED) != DS_OK) +00683 { +00684 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"SetConeOrientation failed (x=%.2f, y=%.2f, z=%.2f)"</font>, dir.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, dir.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, dir.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>); +00685 } +00686 <font class="keywordflow">else</font> +00687 { +00688 <font class="comment">//nlwarning ("NLSOUND: %p set source direction NEL(p:%.2f/%.2f/%.2f) DS(p:%.2f/%.2f/%.2f)", this, dir.x, dir.y, dir.z, dir.x, dir.z, dir.y);</font> +00689 } +00690 } +00691 } +00692 +00693 +00694 <font class="comment">// ******************************************************************</font> +00695 +<a name="l00696"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_5">00696</a> <font class="keywordtype">void</font> CSourceDSound::getDirection( <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& dir )<font class="keyword"> const</font> +00697 <font class="keyword"></font>{ +00698 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != NULL) +00699 { +00700 D3DVECTOR <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>; +00701 +00702 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetConeOrientation(&<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>) != DS_OK) +00703 { +00704 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetConeOrientation failed"</font>); +00705 dir.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(0, 0, 1); +00706 } +00707 <font class="keywordflow">else</font> +00708 { +00709 dir.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); +00710 } +00711 } +00712 <font class="keywordflow">else</font> +00713 { +00714 dir.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(0, 0, 1); +00715 } +00716 } +00717 +00718 +00719 <font class="comment">// ******************************************************************</font> +00720 +<a name="l00721"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_6">00721</a> <font class="keywordtype">void</font> CSourceDSound::setGain( <font class="keywordtype">float</font> gain ) +00722 { +00723 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(gain, 0.00001f, 1.0f); +00724 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o18">_Gain</a> = gain; +00725 +00726 <font class="comment">/* convert from linear amplitude to hundredths of decibels */</font> +00727 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o17">_Volume</a> = (uint32)(100.0 * 20.0 * log10(gain)); +00728 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o17">_Volume</a>, DSBVOLUME_MIN, DSBVOLUME_MAX); +00729 +00730 <font class="comment">//nlwarning ("set gain %f vol %d", gain, _Volume);</font> +00731 +00732 <font class="comment">/*</font> +00733 <font class="comment"> if ((_SecondaryBuffer != 0) && (_SecondaryBuffer->SetVolume(_Volume) != DS_OK))</font> +00734 <font class="comment"> {</font> +00735 <font class="comment"> nlwarning("SetVolume failed");</font> +00736 <font class="comment"> }</font> +00737 <font class="comment"> */</font> +00738 } +00739 +00740 +00741 <font class="comment">/*</font> +00742 <font class="comment"> * Get the gain</font> +00743 <font class="comment"> */</font> +<a name="l00744"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_7">00744</a> <font class="keywordtype">float</font> CSourceDSound::getGain()<font class="keyword"> const</font> +00745 <font class="keyword"></font>{ +00746 <font class="keywordflow">return</font> <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o18">_Gain</a>; +00747 } +00748 +00749 +00750 <font class="comment">// ******************************************************************</font> +00751 +<a name="l00752"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_8">00752</a> <font class="keywordtype">void</font> CSourceDSound::setPitch( <font class="keywordtype">float</font> coeff ) +00753 { +00754 <font class="comment">// _Freq = coeff;</font> +00755 +00756 <font class="keywordflow">if</font> ((<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> != 0) && (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> != 0)) +00757 { +00758 <a class="code" href="namespaceNLSOUND.html#a83">TSampleFormat</a> <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; +00759 uint freq; +00760 +00761 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>->getFormat(<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, freq); +00762 +00763 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o15">_SampleRate</a> = (uint32) (coeff * (float) freq); +00764 +00765 <font class="comment">//nlwarning("Freq=%d", newfreq);</font> +00766 +00767 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->SetFrequency(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o15">_SampleRate</a>) != DS_OK) +00768 { +00769 <font class="comment">// nlwarning("SetFrequency failed (buffer freq=%d, NeL freq=%.5f, DSound freq=%d)", freq, coeff, newfreq);</font> +00770 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetFrequency"</font>); +00771 } +00772 } +00773 } +00774 +00775 +00776 <font class="comment">// ******************************************************************</font> +00777 +<a name="l00778"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_9">00778</a> <font class="keywordtype">float</font> CSourceDSound::getPitch()<font class="keyword"> const</font> +00779 <font class="keyword"></font>{ +00780 <font class="keywordflow">if</font> ((<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> != 0) && (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> != 0)) +00781 { +00782 <a class="code" href="namespaceNLSOUND.html#a83">TSampleFormat</a> <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; +00783 uint freq0; +00784 DWORD freq; +00785 +00786 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>->getFormat(<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, freq0); +00787 +00788 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetFrequency(&freq) != DS_OK) +00789 { +00790 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetFrequency failed"</font>); +00791 <font class="keywordflow">return</font> 1.0; +00792 } +00793 +00794 <font class="keywordflow">return</font> ((float) freq / (float) freq0); +00795 } +00796 +00797 <font class="keywordflow">return</font> 1.0; +00798 } +00799 +00800 +00801 <font class="comment">// ******************************************************************</font> +00802 +<a name="l00803"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_10">00803</a> <font class="keywordtype">void</font> CSourceDSound::setSourceRelativeMode( <font class="keywordtype">bool</font> mode ) +00804 { +00805 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00806 { +00807 HRESULT hr; +00808 +00809 <font class="keywordflow">if</font> (mode) +00810 { +00811 hr = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetMode(DS3DMODE_HEADRELATIVE, DS3D_IMMEDIATE); +00812 } +00813 <font class="keywordflow">else</font> +00814 { +00815 hr = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetMode(DS3DMODE_NORMAL, DS3D_IMMEDIATE); +00816 } +00817 +00818 <font class="keywordflow">if</font> (hr != DS_OK) +00819 { +00820 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetMode failed"</font>); +00821 } +00822 } +00823 <font class="keywordflow">else</font> +00824 { +00825 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested setSourceRelativeMode on a non-3D source"</font>); +00826 } +00827 } +00828 +00829 +00830 <font class="comment">// ******************************************************************</font> +00831 +<a name="l00832"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_11">00832</a> <font class="keywordtype">bool</font> CSourceDSound::getSourceRelativeMode()<font class="keyword"> const</font> +00833 <font class="keyword"></font>{ +00834 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00835 { +00836 DWORD mode; +00837 +00838 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetMode(&mode) != DS_OK) +00839 { +00840 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetMode failed"</font>); +00841 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00842 } +00843 +00844 <font class="keywordflow">return</font> (mode == DS3DMODE_HEADRELATIVE); +00845 } +00846 <font class="keywordflow">else</font> +00847 { +00848 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested setSourceRelativeMode on a non-3D source"</font>); +00849 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00850 } +00851 } +00852 +00853 +00854 <font class="comment">// ******************************************************************</font> +00855 +<a name="l00856"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_12">00856</a> <font class="keywordtype">void</font> CSourceDSound::setMinMaxDistances( <font class="keywordtype">float</font> mindist, <font class="keywordtype">float</font> maxdist, <font class="keywordtype">bool</font> deferred ) +00857 { +00858 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00859 { +00860 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetMinDistance(mindist, deferred ? DS3D_DEFERRED : DS3D_IMMEDIATE) != DS_OK) +00861 { +00862 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetMinDistance (%f) failed"</font>, mindist); +00863 } +00864 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetMaxDistance(maxdist, deferred ? DS3D_DEFERRED : DS3D_IMMEDIATE) != DS_OK) +00865 { +00866 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetMaxDistance (%f) failed"</font>, maxdist); +00867 } +00868 } +00869 <font class="keywordflow">else</font> +00870 { +00871 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested setMinMaxDistances on a non-3D source"</font>); +00872 } +00873 } +00874 +00875 +00876 <font class="comment">// ******************************************************************</font> +00877 +<a name="l00878"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_13">00878</a> <font class="keywordtype">void</font> CSourceDSound::getMinMaxDistances( <font class="keywordtype">float</font>& mindist, <font class="keywordtype">float</font>& maxdist )<font class="keyword"> const</font> +00879 <font class="keyword"></font>{ +00880 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00881 { +00882 D3DVALUE <a class="code" href="bit__set_8cpp.html#a0">min</a>, max; +00883 +00884 <font class="keywordflow">if</font> ((<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetMinDistance(&<a class="code" href="bit__set_8cpp.html#a0">min</a>) != DS_OK) +00885 || (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetMaxDistance(&max) != DS_OK)) +00886 { +00887 mindist = 0.0f; +00888 maxdist = 0.0f; +00889 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetMinDistance or GetMaxDistance failed"</font>); +00890 } +00891 <font class="keywordflow">else</font> +00892 { +00893 mindist = <a class="code" href="bit__set_8cpp.html#a0">min</a>; +00894 maxdist = max; +00895 } +00896 } +00897 <font class="keywordflow">else</font> +00898 { +00899 mindist = 0.0f; +00900 maxdist = 0.0f; +00901 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested getMinMaxDistances on a non-3D source"</font>); +00902 } +00903 } +00904 +00905 <font class="comment">// ******************************************************************</font> +00906 +<a name="l00907"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a6">00907</a> <font class="keywordtype">void</font> CSourceDSound::updateVolume( <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& listener ) +00908 { +00909 CVector pos = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_1">getPos</a>(); +00910 pos -= listener; +00911 +00912 <font class="keywordtype">float</font> sqrdist = pos.<a class="code" href="classNLMISC_1_1CVector.html#z331_3">sqrnorm</a>(); +00913 <font class="keywordtype">float</font> <a class="code" href="bit__set_8cpp.html#a0">min</a>, max; +00914 +00915 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_13">getMinMaxDistances</a>(<a class="code" href="bit__set_8cpp.html#a0">min</a>, max); +00916 +00917 <font class="keywordflow">if</font> (sqrdist < <a class="code" href="bit__set_8cpp.html#a0">min</a> * <a class="code" href="bit__set_8cpp.html#a0">min</a>) +00918 { +00919 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->SetVolume(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o17">_Volume</a>); +00920 <font class="comment">//nlwarning("VOLUME = %ddB, rolloff = %0.2f", _Volume/100, CListenerDSound::instance()->getRolloffFactor());</font> +00921 } +00922 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (sqrdist > max * max) +00923 { +00924 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->SetVolume(DSBVOLUME_MIN); +00925 <font class="comment">//nlwarning("VOLUME = %ddB, rolloff = %0.2f", DSBVOLUME_MIN/100, CListenerDSound::instance()->getRolloffFactor());</font> +00926 } +00927 <font class="keywordflow">else</font> +00928 { +00929 sint32 db = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o17">_Volume</a>; +00930 +00931 <font class="keywordtype">double</font> dist = (double) sqrt(sqrdist); +00932 +00933 <font class="comment">// linearly descending volume on a dB scale</font> +00934 <font class="keywordtype">double</font> db1 = DSBVOLUME_MIN * (dist - <a class="code" href="bit__set_8cpp.html#a0">min</a>) / (max - <a class="code" href="bit__set_8cpp.html#a0">min</a>); +00935 +00936 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> == 0.0) { +00937 db += (sint32) db1; +00938 +00939 } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> > 0.0) { +00940 <font class="keywordtype">double</font> amp2 = 0.0001 + 0.9999 * (max - dist) / (max - <a class="code" href="bit__set_8cpp.html#a0">min</a>); <font class="comment">// linear amp between 0.00001 and 1.0</font> +00941 <font class="keywordtype">double</font> db2 = 2000.0 * log10(amp2); <font class="comment">// covert to 1/100th decibels</font> +00942 db += (sint32) ((1.0 - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a>) * db1 + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> * db2); +00943 +00944 } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> < 0.0) { +00945 <font class="keywordtype">double</font> amp3 = <a class="code" href="bit__set_8cpp.html#a0">min</a> / dist; <font class="comment">// linear amplitude is 1/distance</font> +00946 <font class="keywordtype">double</font> db3 = 2000.0 * log10(amp3); <font class="comment">// covert to 1/100th decibels</font> +00947 db += (sint32) ((1.0 + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a>) * db1 - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o19">_Alpha</a> * db3); +00948 } +00949 +00950 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(db, DSBVOLUME_MIN, DSBVOLUME_MAX); +00951 +00952 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->SetVolume(db); +00953 +00954 <font class="comment">/* LONG tmp;</font> +00955 <font class="comment"> _SecondaryBuffer->GetVolume(&tmp);</font> +00956 <font class="comment">*/</font> +00957 +00958 <font class="comment">//nlwarning("VOLUME = %d dB, rolloff = %0.2f", db/100, CListenerDSound::instance()->getRolloffFactor());</font> +00959 } +00960 +00961 } +00962 +00963 <font class="comment">// ******************************************************************</font> +00964 +<a name="l00965"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_14">00965</a> <font class="keywordtype">void</font> CSourceDSound::setCone( <font class="keywordtype">float</font> innerAngle, <font class="keywordtype">float</font> outerAngle, <font class="keywordtype">float</font> outerGain ) +00966 { +00967 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +00968 { +00969 <font class="comment">// Set the cone angles</font> +00970 +00971 <font class="comment">// Convert from radians to degrees</font> +00972 DWORD inner = (DWORD)(180.0 * innerAngle / <a class="code" href="namespaceNLMISC.html#a7">Pi</a>); +00973 DWORD outer = (DWORD)(180.0 * outerAngle / <a class="code" href="namespaceNLMISC.html#a7">Pi</a>); +00974 +00975 +00976 <font class="comment">// Sanity check: wrap the angles in the [0,360] interval</font> +00977 <font class="keywordflow">if</font> (outer < inner) +00978 { +00979 outer = inner; +00980 } +00981 +00982 <font class="keywordflow">while</font> (inner < DS3D_MINCONEANGLE) +00983 { +00984 inner += 360; +00985 } +00986 +00987 <font class="keywordflow">while</font> (inner > DS3D_MAXCONEANGLE) +00988 { +00989 inner -= 360; +00990 } +00991 +00992 <font class="keywordflow">while</font> (outer < DS3D_MINCONEANGLE) +00993 { +00994 outer += 360; +00995 } +00996 +00997 <font class="keywordflow">while</font> (outer > DS3D_MAXCONEANGLE) +00998 { +00999 outer -= 360; +01000 } +01001 +01002 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetConeAngles(inner, outer, DS3D_DEFERRED) != DS_OK) +01003 { +01004 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetConeAngles failed"</font>); +01005 } +01006 +01007 <font class="comment">// Set the outside volume</font> +01008 <font class="keywordflow">if</font> (outerGain < 0.00001f) +01009 { +01010 outerGain = 0.00001f; +01011 } +01012 +01013 <font class="comment">// convert from linear amplitude to hundredths of decibels </font> +01014 LONG volume = (LONG)(100.0 * 20.0 * log10(outerGain)); +01015 +01016 <font class="keywordflow">if</font> (volume < DSBVOLUME_MIN) +01017 { +01018 volume = DSBVOLUME_MIN; +01019 } +01020 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (volume > DSBVOLUME_MAX) +01021 { +01022 volume = DSBVOLUME_MAX; +01023 } +01024 +01025 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->SetConeOutsideVolume(volume, DS3D_DEFERRED) != DS_OK) +01026 { +01027 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"SetConeOutsideVolume failed"</font>); +01028 } +01029 +01030 } +01031 <font class="keywordflow">else</font> +01032 { +01033 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested setCone on a non-3D source"</font>); +01034 } +01035 } +01036 +01037 <font class="comment">// ******************************************************************</font> +01038 +<a name="l01039"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_15">01039</a> <font class="keywordtype">void</font> CSourceDSound::getCone( <font class="keywordtype">float</font>& innerAngle, <font class="keywordtype">float</font>& outerAngle, <font class="keywordtype">float</font>& outerGain )<font class="keyword"> const</font> +01040 <font class="keyword"></font>{ +01041 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a> != 0) +01042 { +01043 DWORD inner, outer; +01044 LONG volume; +01045 +01046 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetConeAngles(&inner, &outer) != DS_OK) +01047 { +01048 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetConeAngles failed"</font>); +01049 innerAngle = outerAngle = (float)(2.0 * <a class="code" href="namespaceNLMISC.html#a7">Pi</a>); +01050 } +01051 <font class="keywordflow">else</font> +01052 { +01053 innerAngle = (float)(<a class="code" href="namespaceNLMISC.html#a7">Pi</a> * inner / 180.0); +01054 outerAngle = (float)(<a class="code" href="namespaceNLMISC.html#a7">Pi</a> * outer / 180.0); +01055 } +01056 +01057 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o7">_3DBuffer</a>->GetConeOutsideVolume(&volume) != DS_OK) +01058 { +01059 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"GetConeOutsideVolume failed"</font>); +01060 outerGain = 0.0f; +01061 } +01062 <font class="keywordflow">else</font> +01063 { +01064 outerGain = (float) pow(10, (<font class="keywordtype">double</font>) volume / 20.0 / 100.0); +01065 } +01066 } +01067 <font class="keywordflow">else</font> +01068 { +01069 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Requested getCone on a non-3D source"</font>); +01070 } +01071 } +01072 +01073 <font class="comment">// ******************************************************************</font> +01074 +<a name="l01075"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_16">01075</a> <font class="keywordtype">void</font> CSourceDSound::setEAXProperty( uint prop, <font class="keywordtype">void</font> *<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, uint valuesize ) +01076 { +01077 <font class="preprocessor">#ifdef EAX_AVAILABLE</font> +01078 <font class="preprocessor"></font> <font class="keywordflow">if</font> ( EAXSetProp != NULL ) +01079 { +01080 EAXSetProp( &DSPROPSETID_EAX_SourceProperties, prop, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o0">_SourceName</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, valuesize ); +01081 } +01082 <font class="preprocessor">#endif</font> +01083 <font class="preprocessor"></font>} +01084 +01085 +01086 <font class="comment">// ******************************************************************</font> +01087 +<a name="l01088"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#a4">01088</a> IBuffer *CSourceDSound::getBuffer() +01089 { +01090 <font class="keywordflow">return</font> <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>; +01091 } +01092 +01093 +01094 <font class="comment">// ******************************************************************</font> +01095 +<a name="l01096"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c1">01096</a> <font class="keywordtype">bool</font> CSourceDSound::lock(uint32 writePos, uint32 size, uint8* &ptr1, DWORD &bytes1, uint8* &ptr2, DWORD &bytes2) +01097 { +01098 HRESULT hr = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Lock(writePos, size, (LPVOID*) &ptr1, &bytes1, (LPVOID*) &ptr2, &bytes2, 0); +01099 +01100 <font class="keywordflow">if</font> (hr == DSERR_BUFFERLOST) +01101 { +01102 <font class="comment">// If the buffer got lost somehow, try to restore it.</font> +01103 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Restore())) +01104 { +01105 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Lock failed (1)"</font>); +01106 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01107 } +01108 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Lock(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>, (LPVOID*) &ptr1, &bytes1, (LPVOID*) &ptr2, &bytes2, 0))) +01109 { +01110 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Lock failed (2)"</font>); +01111 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01112 } +01113 } +01114 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (hr != DS_OK) +01115 { +01116 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Lock failed (3)"</font>); +01117 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01118 } +01119 +01120 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01121 } +01122 +01123 <font class="comment">// ******************************************************************</font> +01124 +<a name="l01125"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c2">01125</a> <font class="keywordtype">bool</font> CSourceDSound::unlock(uint8* ptr1, DWORD bytes1, uint8* ptr2, DWORD bytes2) +01126 { +01127 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +01128 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01129 } +01130 +01131 +01132 +01133 <font class="comment">/***************************************************************************</font> +01134 <font class="comment"> </font> +01135 <font class="comment"></font> +01136 <font class="comment"> Buffer operations</font> +01137 <font class="comment"></font> +01138 <font class="comment"> There are five buffer operation: fill, silence, fadeOut, crossFade</font> +01139 <font class="comment"> and fadeIn. fill and silence are called by the update function. The</font> +01140 <font class="comment"> others are called by the user state functions (play, stop, pause).</font> +01141 <font class="comment"></font> +01142 <font class="comment"></font> +01143 <font class="comment"> NW P W</font> +01144 <font class="comment"> +--------+------+---+-----------------------+</font> +01145 <font class="comment"> |........| |xxx|.......................|</font> +01146 <font class="comment"> +--------+------+---+-----------------------+</font> +01147 <font class="comment"></font> +01148 <font class="comment"> The source maintains the next write position (_NextWritePos, NW in figure</font> +01149 <font class="comment"> above). That is the position at which new samples or silemce is written.</font> +01150 <font class="comment"> DirectSound maintaines a play cursor and a write cursor (P and W in figure).</font> +01151 <font class="comment"> The data between P and W is scheduled for playing and cannot be touched.</font> +01152 <font class="comment"> The data between W and NW are unplayed sample data that the source copied</font> +01153 <font class="comment"> into the DirectSound buffer.</font> +01154 <font class="comment"></font> +01155 <font class="comment"> The update functions (fill, silence) refresh the buffer with new samples</font> +01156 <font class="comment"> or silence. That insert the sample data at the next write position NW. This </font> +01157 <font class="comment"> write position is maintained as closely behind the DirectSound play cursor </font> +01158 <font class="comment"> as possible to keep the buffer filled with data.</font> +01159 <font class="comment"></font> +01160 <font class="comment"> The user functions (the fades) modify the sample data that is right after</font> +01161 <font class="comment"> the write cursor W maintained by DirectSound. The data has to be written </font> +01162 <font class="comment"> after W to hear the changes as soon as possible. When a fade is done, the</font> +01163 <font class="comment"> date already written in the buffer has to be overwritten. The function</font> +01164 <font class="comment"> getFadeOutSize() helps to found out how many samples are writen between</font> +01165 <font class="comment"> W and NW and to what section of the original audio data they correspond.</font> +01166 <font class="comment"></font> +01167 <font class="comment"> All the buffer functions below have the same pattern:</font> +01168 <font class="comment"></font> +01169 <font class="comment"> - get current play and write cursors (P and W)</font> +01170 <font class="comment"> - lock the buffer</font> +01171 <font class="comment"> - copy samples</font> +01172 <font class="comment"> - unlock buffer</font> +01173 <font class="comment"> - update state variables</font> +01174 <font class="comment"></font> +01175 <font class="comment"> The differences between the functions are due to different operation</font> +01176 <font class="comment"> (fades), position and size of the buffer to lock, handling of silence</font> +01177 <font class="comment"> and looping.</font> +01178 <font class="comment"></font> +01179 <font class="comment"> Enjoy!</font> +01180 <font class="comment"></font> +01181 <font class="comment"> PH</font> +01182 <font class="comment"></font> +01183 <font class="comment"></font> +01184 <font class="comment">************************************************************************/</font> +01185 +<a name="l01186"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c5">01186</a> <font class="keywordtype">bool</font> CSourceDSound::fill() +01187 { +01188 <font class="keywordtype">bool</font> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <font class="keyword">false</font>; +01189 uint8 *ptr1, *ptr2; +01190 DWORD bytes1, bytes2; +01191 DWORD playPos, writePos; +01192 uint32 space; +01193 +01194 +01195 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> == NULL) +01196 { +01197 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +01198 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +01199 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01200 } +01201 +01202 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +01203 { +01204 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01205 } +01206 +01207 +01208 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startPos); +01209 +01210 +01211 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +01212 +01213 <font class="keywordflow">if</font> (playPos == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +01214 { +01215 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01216 } +01217 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +01218 { +01219 space = playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +01220 } +01221 <font class="keywordflow">else</font> +01222 { +01223 space = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a> + playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +01224 } +01225 +01226 <font class="comment">// Don't bother if the number of samples that can be written is too small.</font> +01227 <font class="keywordflow">if</font> (space < <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>) +01228 { +01229 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01230 } +01231 +01232 +01233 uint8* <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> = ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>)->getData(); +01234 uint32 available = (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> < <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>) ? <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> : 0; +01235 +01236 +01237 <font class="comment">// The number of samples bytes that will be copied. If bytes is 0</font> +01238 <font class="comment">// than write silence to the buffer.</font> +01239 uint32 bytes = <a class="code" href="source__dsound_8cpp.html#a2">NLSOUND_MIN</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>, available); +01240 uint32 clear = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a> - available; +01241 +01242 +01243 <font class="comment">// Lock the buffer</font> +01244 +01245 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startLock); +01246 +01247 +01248 <font class="keywordflow">if</font> (!<a class="code" href="classNLSOUND_1_1CSourceDSound.html#c1">lock</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>, ptr1, bytes1, ptr2, bytes2)) +01249 { +01250 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01251 } +01252 +01253 +01254 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startCopy); +01255 +01256 <font class="comment">// Start copying the samples</font> +01257 +01258 <font class="keywordflow">if</font> (bytes1 <= bytes) { +01259 +01260 CFastMem::memcpy(ptr1, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes1); +01261 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes1; +01262 bytes -= bytes1; +01263 +01264 <font class="keywordflow">if</font> (ptr2) +01265 { +01266 <font class="keywordflow">if</font> (bytes > 0) +01267 { +01268 CFastMem::memcpy(ptr2, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes); +01269 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes; +01270 } +01271 +01272 <font class="keywordflow">if</font> (bytes < bytes2) +01273 { +01274 <font class="keywordflow">if</font> (_Loop) +01275 { +01276 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: LOOP"</font>, <font class="keyword">this</font>)); +01277 +01278 CFastMem::memcpy(ptr2 + bytes, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a>, bytes2 - bytes); +01279 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes2 - bytes; +01280 } +01281 <font class="keywordflow">else</font> +01282 { +01283 memset(ptr2 + bytes, 0, bytes2 - bytes); +01284 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes2 - bytes; +01285 } +01286 } +01287 } +01288 } +01289 <font class="keywordflow">else</font> +01290 { +01291 <font class="keywordflow">if</font> (bytes > 0) +01292 { +01293 CFastMem::memcpy(ptr1, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes); +01294 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes; +01295 } +01296 +01297 <font class="keywordflow">if</font> (_Loop) +01298 { +01299 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: LOOP"</font>, <font class="keyword">this</font>)); +01300 +01301 CFastMem::memcpy(ptr1 + bytes, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a>, bytes1 - bytes); +01302 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes1 - bytes; +01303 +01304 <font class="keywordflow">if</font> (ptr2) +01305 { +01306 CFastMem::memcpy(ptr2, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes2); +01307 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes2; +01308 } +01309 +01310 } +01311 <font class="keywordflow">else</font> +01312 { +01313 memset(ptr1 + bytes, 0, bytes1 - bytes); +01314 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes1 - bytes; +01315 +01316 <font class="keywordflow">if</font> (ptr2) +01317 { +01318 memset(ptr2, 0, bytes2); +01319 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> += bytes2; +01320 } +01321 } +01322 +01323 } +01324 +01325 +01326 +01327 +01328 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startUnlock); +01329 +01330 <font class="comment">// Unlock the buffer</font> +01331 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +01332 +01333 +01334 <font class="comment">// Update the state variables</font> +01335 +01336 <font class="comment">// Check if we've reached the end of the file</font> +01337 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>) +01338 { +01339 <font class="keywordflow">if</font> (_Loop) +01340 { +01341 <font class="comment">// If we're looping, start all over again</font> +01342 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: LOOP"</font>, <font class="keyword">this</font>)); +01343 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +01344 } +01345 <font class="keywordflow">else</font> +01346 { +01347 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +01348 +01349 <font class="comment">// Keep track of where tha last sample was written and the position</font> +01350 <font class="comment">// of the play cursor relative to the end position. if the _EndState</font> +01351 <font class="comment">// is 0, the play cursor is after the end position, 1 otherwise.</font> +01352 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> = writePos + bytes; +01353 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +01354 { +01355 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +01356 } +01357 +01358 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>)? <a class="code" href="namespaceNLSOUND.html#a86a33">NL_DSOUND_TAIL1</a> : <a class="code" href="namespaceNLSOUND.html#a86a34">NL_DSOUND_TAIL2</a>; +01359 +01360 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: SILENCING"</font>, <font class="keyword">this</font>)); +01361 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: ENDSTATE=%d, E=%d, P=%d"</font>, <font class="keyword">this</font>, (<font class="keywordtype">int</font>) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>, playPos)); +01362 } +01363 } +01364 +01365 +01366 <font class="comment">// Update the write pointer</font> +01367 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> += bytes1 + bytes2; +01368 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +01369 { +01370 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +01371 } +01372 +01373 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: P=%d, W=%d, NW=%d, SZ=%d, BW=%d, S=%d, B=%d"</font>, <font class="keyword">this</font>, playPos, writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>, bytes1 + bytes2)); +01374 +01375 +01376 <font class="preprocessor">#if NLSOUND_PROFILE</font> +01377 <font class="preprocessor"></font> _TotalUpdateSize += bytes1 + bytes2; +01378 _PosTime += CTime::ticksToSecond(startLock - startPos); +01379 _LockTime += CTime::ticksToSecond(startCopy - startLock); +01380 _CopyTime += CTime::ticksToSecond(startUnlock - startCopy); +01381 _UnlockTime += CTime::ticksToSecond(CTime::getPerformanceTime() - startUnlock); +01382 _CopyCount++; +01383 <font class="preprocessor">#endif</font> +01384 <font class="preprocessor"></font> +01385 +01386 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01387 } +01388 +01389 +01390 +01391 +01392 <font class="comment">// ******************************************************************</font> +01393 +<a name="l01394"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c6">01394</a> <font class="keywordtype">bool</font> CSourceDSound::silence() +01395 { +01396 uint8 *ptr1, *ptr2; +01397 DWORD bytes1, bytes2; +01398 DWORD playPos, writePos; +01399 uint32 space; +01400 +01401 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +01402 { +01403 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01404 } +01405 +01406 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startPos); +01407 +01408 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +01409 +01410 <font class="keywordflow">if</font> (playPos == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +01411 { +01412 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01413 } +01414 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>) +01415 { +01416 space = playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +01417 } +01418 <font class="keywordflow">else</font> +01419 { +01420 space = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a> + playPos - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>; +01421 } +01422 +01423 <font class="comment">// Don't bother if the number of samples that can be written is too small.</font> +01424 <font class="keywordflow">if</font> (space < <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>) +01425 { +01426 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01427 } +01428 +01429 <font class="comment">// Lock the buffer</font> +01430 +01431 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startLock); +01432 +01433 <font class="keywordflow">if</font> (!<a class="code" href="classNLSOUND_1_1CSourceDSound.html#c1">lock</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r0">_UpdateCopySize</a>, ptr1, bytes1, ptr2, bytes2)) +01434 { +01435 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01436 } +01437 +01438 +01439 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startCopy); +01440 +01441 <font class="comment">// Silence the buffer</font> +01442 memset(ptr1, 0, bytes1); +01443 memset(ptr2, 0, bytes2); +01444 +01445 <font class="comment">// Unlock the buffer</font> +01446 +01447 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startUnlock); +01448 +01449 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +01450 +01451 +01452 <font class="comment">// Update the next write position</font> +01453 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> += bytes1 + bytes2; +01454 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +01455 { +01456 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +01457 } +01458 +01459 +01460 <font class="comment">// Check if all the samples in the buffer are played</font> +01461 <font class="keywordflow">if</font> ((playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>) && (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> == <a class="code" href="namespaceNLSOUND.html#a86a34">NL_DSOUND_TAIL2</a>)) +01462 { +01463 <font class="comment">// The buffer played passed the last sample. Flag the source as stopped.</font> +01464 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = <a class="code" href="namespaceNLSOUND.html#a86a35">NL_DSOUND_ENDED</a>; +01465 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] SLNC: ENDED"</font>, <font class="keyword">this</font>)); +01466 +01467 <font class="comment">// If the buffer was playing, mark it as stopped</font> +01468 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>) +01469 { +01470 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +01471 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] SLNC: STOPPED"</font>, <font class="keyword">this</font>)); +01472 } +01473 } +01474 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ((playPos < <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>) && (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> == <a class="code" href="namespaceNLSOUND.html#a86a33">NL_DSOUND_TAIL1</a>)) +01475 { +01476 <font class="comment">// The play cursor wrapped around the buffer and is now before the end position</font> +01477 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = <a class="code" href="namespaceNLSOUND.html#a86a34">NL_DSOUND_TAIL2</a>; +01478 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FILL: ENDSTATE=%d, E=%d, P=%d"</font>, <font class="keyword">this</font>, (<font class="keywordtype">int</font>) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>, playPos)); +01479 } +01480 +01481 +01482 <font class="comment">// Update the amount of silence written</font> +01483 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> += bytes1 + bytes2; +01484 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +01485 { +01486 <font class="comment">// The buffer is now completely filled with silence</font> +01487 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a29">NL_DSOUND_SILENCED</a>; +01488 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] SLNC: SILENCED"</font>, <font class="keyword">this</font>)); +01489 +01490 <font class="comment">// If the buffer was playing, mark it as stopped</font> +01491 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> == <a class="code" href="namespaceNLSOUND.html#a85a30">NL_DSOUND_PLAYING</a>) +01492 { +01493 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +01494 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] SLNC: STOPPED*"</font>, <font class="keyword">this</font>)); +01495 } +01496 } +01497 +01498 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] SLNC: P=%d, W=%d, NW=%d, SZ=%d, BW=%d, S=%d, B=%d"</font>, <font class="keyword">this</font>, playPos, writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>, bytes1 + bytes2)); +01499 +01500 +01501 <font class="preprocessor">#if NLSOUND_PROFILE</font> +01502 <font class="preprocessor"></font> _TotalUpdateSize += bytes1 + bytes2; +01503 _PosTime += CTime::ticksToSecond(startLock - startPos); +01504 _LockTime += CTime::ticksToSecond(startCopy - startLock); +01505 _CopyTime += CTime::ticksToSecond(startUnlock - startCopy); +01506 _UnlockTime += CTime::ticksToSecond(CTime::getPerformanceTime() - startUnlock); +01507 _CopyCount++; +01508 <font class="preprocessor">#endif</font> +01509 <font class="preprocessor"></font> +01510 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01511 } +01512 +01513 +01514 <font class="comment">// ******************************************************************</font> +01515 +<a name="l01524"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c4">01524</a> <font class="keywordtype">void</font> CSourceDSound::getFadeOutSize(uint32 writePos, uint32 &xfadeSize, sint16* &in1, uint32 &writtenTooMuch) +01525 { +01526 <font class="comment">// The number of samples over which we will do the crossfade</font> +01527 xfadeSize = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r5">_XFadeSize</a>; +01528 +01529 +01530 <font class="comment">// The tricky part of this method is to figger out how many samples of the old</font> +01531 <font class="comment">// buffer were written after the write cursor and figger our with what position </font> +01532 <font class="comment">// in the old buffer the write cursor corresponds. We have to consider the following</font> +01533 <font class="comment">// cases:</font> +01534 <font class="comment">//</font> +01535 <font class="comment">// - the old buffer just looped, </font> +01536 <font class="comment">// - the old buffer is finished, but stil has samples in the DirectSound buffer</font> +01537 <font class="comment">// - the default case, i.e. the old buffer is playing somewhere in the middle.</font> +01538 <font class="comment">//</font> +01539 +01540 <font class="comment">// How many bytes did we write after the write position?</font> +01541 +01542 writtenTooMuch = <a class="code" href="source__dsound_8cpp.html#a3">NLSOUND_DISTANCE</a>(writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>); +01543 +01544 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FADE: TOO=%d"</font>, <font class="keyword">this</font>, writtenTooMuch)); +01545 +01546 +01547 uint8* <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> = ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>)->getData(); +01548 +01549 <font class="comment">// If the sound is finished and all the samples are written in the</font> +01550 <font class="comment">// buffer, it's possible that there are still samples after the write</font> +01551 <font class="comment">// position. If this is the case, we have to do a fade out. If there is</font> +01552 <font class="comment">// only silence, we only need to copy without fade.</font> +01553 +01554 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> > 0) +01555 { +01556 +01557 <font class="keywordflow">if</font> (writtenTooMuch > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>) +01558 { +01559 writtenTooMuch -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>; +01560 in1 = (sint16*) (<a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - writtenTooMuch) ; +01561 +01562 <font class="keywordflow">if</font> (writtenTooMuch < 2 * xfadeSize) +01563 { +01564 xfadeSize = writtenTooMuch / 2; +01565 } +01566 } +01567 <font class="keywordflow">else</font> +01568 { +01569 xfadeSize = 0; +01570 } +01571 +01572 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FADE: END, TOO=%d, S=%d, F=%d"</font>, <font class="keyword">this</font>, writtenTooMuch, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>, xfadeSize)); +01573 } +01574 +01575 <font class="comment">// If the sound looped, it's possible that the number of samples</font> +01576 <font class="comment">// written is small. In that case, the write cursor is still inside</font> +01577 <font class="comment">// the previous loop. All we have to do is fade out the last part</font> +01578 <font class="comment">// of the previous loop. </font> +01579 +01580 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (writtenTooMuch >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>) +01581 { +01582 +01583 writtenTooMuch -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>; +01584 +01585 in1 = (sint16*) (<a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - writtenTooMuch) ; +01586 +01587 <font class="keywordflow">if</font> (writtenTooMuch < 2 * xfadeSize) +01588 { +01589 xfadeSize = writtenTooMuch / 2; +01590 } +01591 +01592 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FADE: LOOPED, TOO=%d, F=%d"</font>, <font class="keyword">this</font>, writtenTooMuch, xfadeSize)); +01593 +01594 } +01595 +01596 <font class="comment">// This is the default case. Simply fade from the previous to the next buffer.</font> +01597 <font class="comment">// The variable writtenTooMuch tells us how much of the previous sound has</font> +01598 <font class="comment">// been written after the current write cursor. We just have to check there</font> +01599 <font class="comment">// are enough samples available for the fade.</font> +01600 +01601 <font class="keywordflow">else</font> +01602 { +01603 in1 = (sint16*) (<a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + (sint32) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> - writtenTooMuch); +01604 +01605 <font class="keywordflow">if</font> (xfadeSize > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>) +01606 { +01607 xfadeSize = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>; +01608 } +01609 +01610 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FADE: STD, TOO=%d, F=%d"</font>, <font class="keyword">this</font>, writtenTooMuch, xfadeSize)); +01611 } +01612 } +01613 +01614 +01615 +01616 <font class="comment">// ******************************************************************</font> +01617 +<a name="l01618"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c7">01618</a> <font class="keywordtype">void</font> CSourceDSound::crossFade() +01619 { +01620 uint8 *ptr1, *ptr2; +01621 DWORD bytes1, bytes2; +01622 DWORD playPos, writePos; +01623 uint32 i; +01624 +01625 +01626 +01627 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> == NULL) +01628 { +01629 <font class="keywordflow">return</font>; +01630 } +01631 +01632 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +01633 { +01634 <font class="keywordflow">return</font>; +01635 } +01636 +01637 +01638 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(start); +01639 +01640 +01641 EnterCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +01642 +01643 +01644 +01645 <font class="comment">// The source is currently playing an other buffer. We will do a hot</font> +01646 <font class="comment">// swap between the old and the new buffer. DirectSound maintains two</font> +01647 <font class="comment">// cursors into the buffer: the play cursor and the write cursor.</font> +01648 <font class="comment">// The write cursor indicates where we can start writing the new samples.</font> +01649 <font class="comment">// To avoid clicks, we have to do a cross fade between the old buffer and</font> +01650 <font class="comment">// the new buffer.</font> +01651 +01652 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +01653 +01654 +01655 <font class="comment">// The number of bytes we will write to the DirectSound buffer</font> +01656 uint32 bytes = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r1">_SwapCopySize</a>; +01657 <font class="keywordflow">if</font> (bytes > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>->getSize()) +01658 { +01659 bytes = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>->getSize(); +01660 } +01661 +01662 +01663 <font class="comment">// Lock the DirectSound buffer</font> +01664 +01665 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Lock(writePos, bytes, (LPVOID*) &ptr1, &bytes1, (LPVOID*) &ptr2, &bytes2, 0))) +01666 { +01667 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +01668 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Failed to lock the DirectSound secondary buffer"</font>); +01669 } +01670 +01671 +01672 sint16* in1; +01673 uint8* data1 = ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>)->getData(); +01674 uint8* data2 = ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>)->getData(); +01675 sint16* in2 = (sint16*) data2; +01676 sint16* out = (sint16*) ptr1; +01677 +01678 <font class="comment">// The number of samples over which we will do the crossfade</font> +01679 uint32 xfadeSize; +01680 uint32 xfadeByteSize; +01681 uint32 writtenTooMuch; +01682 +01683 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c4">getFadeOutSize</a>(writePos, xfadeSize, in1, writtenTooMuch); +01684 xfadeByteSize = 2 * xfadeSize; +01685 +01686 <font class="preprocessor">#define MIX 1</font> +01687 <font class="preprocessor"></font> +01688 +01689 <font class="preprocessor">#if MIX</font> +01690 <font class="preprocessor"></font> <font class="keywordtype">float</font> incr, amp1, amp2; +01691 +01692 <font class="keywordflow">if</font> (xfadeSize == 0) +01693 { +01694 amp1 = 0.0f; +01695 amp2 = 1.0f; +01696 incr = 0.0f; +01697 } +01698 <font class="keywordflow">else</font> +01699 { +01700 amp1 = 1.0f; +01701 amp2 = 0.0f; +01702 incr = 1.0f / xfadeSize; +01703 } +01704 +01705 <font class="preprocessor">#else</font> +01706 <font class="preprocessor"></font> <font class="keywordtype">float</font> incr, amp1; +01707 +01708 <font class="keywordflow">if</font> (xfadeSize == 0) +01709 { +01710 amp1 = 0.0f; +01711 incr = 0.0f; +01712 } +01713 <font class="keywordflow">else</font> +01714 { +01715 amp1 = 1.0f; +01716 incr = 1.0f / xfadeSize; +01717 } +01718 +01719 <font class="preprocessor">#endif</font> +01720 <font class="preprocessor"></font> +01721 +01722 <font class="comment">// Start copying the samples</font> +01723 +01724 +01725 <font class="comment">// In the first case, the cross fade is completely contained in the first buffer</font> +01726 <font class="comment">// pointed to by ptr1.</font> +01727 <font class="keywordflow">if</font> (xfadeByteSize < bytes1) +01728 { +01729 +01730 <font class="comment">// Do cross fade</font> +01731 +01732 <font class="keywordflow">for</font> (i = 0; i < xfadeSize; i++) +01733 { +01734 <font class="preprocessor">#if MIX</font> +01735 <font class="preprocessor"></font> out[i] = (sint16) (amp1 * in1[i] + amp2 * in2[i]); +01736 amp1 -= incr; +01737 amp2 += incr; +01738 <font class="preprocessor">#else</font> +01739 <font class="preprocessor"></font> out[i] = (sint16) (amp1 * in1[i]); +01740 amp1 -= incr; +01741 <font class="preprocessor">#endif</font> +01742 <font class="preprocessor"></font> } +01743 +01744 <font class="comment">// Copy remaining samples</font> +01745 +01746 <font class="preprocessor">#if MIX</font> +01747 <font class="preprocessor"></font> CFastMem::memcpy(ptr1 + xfadeByteSize, data2 + xfadeByteSize, bytes1 - xfadeByteSize); +01748 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes1; +01749 <font class="preprocessor">#else</font> +01750 <font class="preprocessor"></font> CFastMem::memcpy(ptr1 + xfadeByteSize, data2, bytes1 - xfadeByteSize); +01751 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes1 - xfadeByteSize; +01752 <font class="preprocessor">#endif</font> +01753 <font class="preprocessor"></font> +01754 <font class="keywordflow">if</font> (ptr2) +01755 { +01756 CFastMem::memcpy(ptr2, data2 + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes2); +01757 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes2; +01758 } +01759 +01760 } +01761 +01762 <font class="comment">// In the second case, the cross fade stretches over the first and the second buffers.</font> +01763 <font class="keywordflow">else</font> +01764 { +01765 +01766 uint32 fade1 = bytes1 / 2; +01767 uint32 fade2 = xfadeSize - fade1; +01768 +01769 <font class="comment">// Do cross fade</font> +01770 +01771 <font class="comment">// Part 1, start at ptr1</font> +01772 <font class="keywordflow">for</font> (i = 0; i < fade1; i++) +01773 { +01774 <font class="preprocessor">#if MIX</font> +01775 <font class="preprocessor"></font> out[i] = (sint16) (amp1 * in1[i] + amp2 * in2[i]); +01776 amp1 -= incr; +01777 amp2 += incr; +01778 <font class="preprocessor">#else</font> +01779 <font class="preprocessor"></font> out[i] = (sint16) (amp1 * in1[i]); +01780 amp1 -= incr; +01781 <font class="preprocessor">#endif</font> +01782 <font class="preprocessor"></font> } +01783 <font class="preprocessor">#if MIX</font> +01784 <font class="preprocessor"></font> <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes1; +01785 <font class="preprocessor">#else</font> +01786 <font class="preprocessor"></font> <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +01787 <font class="preprocessor">#endif</font> +01788 <font class="preprocessor"></font> +01789 +01790 <font class="keywordflow">if</font> (ptr2) +01791 { +01792 out = (sint16*) ptr2; +01793 +01794 <font class="comment">// Part 2, ontinue at ptr2</font> +01795 <font class="keywordflow">for</font> (uint32 k = 0; i < xfadeSize; i++, k++) +01796 { +01797 <font class="preprocessor">#if MIX</font> +01798 <font class="preprocessor"></font> out[k] = (sint16) (amp1 * in1[i] + amp2 * in2[i]); +01799 amp1 -= incr; +01800 amp2 += incr; +01801 <font class="preprocessor">#else</font> +01802 <font class="preprocessor"></font> out[k] = (sint16) (amp1 * in1[i]); +01803 amp1 -= incr; +01804 <font class="preprocessor">#endif</font> +01805 <font class="preprocessor"></font> } +01806 +01807 <font class="comment">// Copy remaining samples</font> +01808 <font class="preprocessor">#if MIX</font> +01809 <font class="preprocessor"></font> CFastMem::memcpy(ptr2 + 2 * k, data2 + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> + 2 * k, bytes2 - 2 * k); +01810 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes2; +01811 <font class="preprocessor">#else</font> +01812 <font class="preprocessor"></font> CFastMem::memcpy(ptr2 + 2 * k, data2, bytes2 - 2 * k); +01813 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes2 - 2 * k; +01814 <font class="preprocessor">#endif</font> +01815 <font class="preprocessor"></font> } +01816 } +01817 +01818 +01819 <font class="comment">// Unlock the DirectSound buffer</font> +01820 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +01821 +01822 +01823 <font class="comment">// Update the state variables</font> +01824 +01825 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = 0; +01826 +01827 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> = (writePos + bytes1 + bytes2); +01828 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +01829 { +01830 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +01831 } +01832 +01833 +01834 +01835 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a27">NL_DSOUND_FILLING</a>; +01836 +01837 +01838 <font class="comment">// Swap the two buffers</font> +01839 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>->getSize(); +01840 <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a>; +01841 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o2">_SwapBuffer</a> = 0; +01842 +01843 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_8">setPitch</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o14">_Freq</a>); +01844 +01845 <font class="comment">// Check if we've reached the end of the file</font> +01846 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>) +01847 { +01848 <font class="keywordflow">if</font> (_Loop) +01849 { +01850 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +01851 } +01852 <font class="keywordflow">else</font> +01853 { +01854 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +01855 } +01856 } +01857 +01858 +01859 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] XFADE"</font>, <font class="keyword">this</font>)); +01860 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] P=%d, W=%d, NW=%d, SZ=%d, BW=%d, B=%d"</font>, <font class="keyword">this</font>, playPos, writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes1 + bytes2)); +01861 +01862 +01863 +01864 LeaveCriticalSection(&<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o8">_CriticalSection</a>); +01865 +01866 +01867 <font class="preprocessor">#if NLSOUND_PROFILE</font> +01868 <font class="preprocessor"></font> _LastSwapTime = CTime::ticksToSecond(CTime::getPerformanceTime() - start); +01869 _TotalSwapTime += _LastSwapTime; +01870 _MaxSwapTime = (_LastSwapTime > _MaxSwapTime) ? _LastSwapTime : _MaxSwapTime; +01871 _MinSwapTime = (_LastSwapTime < _MinSwapTime) ? _LastSwapTime : _MinSwapTime; +01872 _SwapCount++; +01873 <font class="preprocessor">#endif</font> +01874 <font class="preprocessor"></font> +01875 } +01876 +01877 +01878 +01879 <font class="comment">// ******************************************************************</font> +01880 +<a name="l01881"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c8">01881</a> <font class="keywordtype">void</font> CSourceDSound::fadeOut() +01882 { +01883 uint8 *ptr1, *ptr2; +01884 DWORD bytes1, bytes2; +01885 DWORD playPos, writePos; +01886 uint32 i; +01887 +01888 +01889 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> == NULL) +01890 { +01891 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +01892 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +01893 <font class="keywordflow">return</font>; +01894 } +01895 +01896 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +01897 { +01898 <font class="keywordflow">return</font>; +01899 } +01900 +01901 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(start); +01902 +01903 +01904 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +01905 +01906 +01907 <font class="comment">// Lock the DirectSound buffer</font> +01908 +01909 <font class="keywordflow">if</font> (FAILED(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Lock(writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r1">_SwapCopySize</a>, (LPVOID*) &ptr1, &bytes1, (LPVOID*) &ptr2, &bytes2, 0))) +01910 { +01911 <font class="keywordflow">throw</font> ESoundDriver(<font class="stringliteral">"Failed to lock the DirectSound secondary buffer"</font>); +01912 } +01913 +01914 +01915 +01916 <font class="comment">// in1 points to the position in the old buffer where the fade out starts</font> +01917 sint16* in1; +01918 sint16* out = (sint16*) ptr1; +01919 +01920 <font class="comment">// The number of samples over which we will do the crossfade</font> +01921 uint32 xfadeSize; +01922 uint32 xfadeByteSize; +01923 uint32 writtenTooMuch; +01924 +01925 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#c4">getFadeOutSize</a>(writePos, xfadeSize, in1, writtenTooMuch); +01926 xfadeByteSize = 2 * xfadeSize; +01927 +01928 <font class="keywordtype">float</font> amp1, incr; +01929 +01930 <font class="keywordflow">if</font> (xfadeSize == 0) +01931 { +01932 amp1 = 0.0f; +01933 incr = 0.0f; +01934 } +01935 <font class="keywordflow">else</font> +01936 { +01937 amp1 = 1.0f; +01938 incr = 1.0f / xfadeSize; +01939 } +01940 +01941 +01942 <font class="keywordflow">if</font> (writtenTooMuch > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>) +01943 { +01944 <font class="comment">// The buffer looped. Count backwards from the end of the file.</font> +01945 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - writtenTooMuch; +01946 } +01947 <font class="keywordflow">else</font> +01948 { +01949 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> -= writtenTooMuch; +01950 } +01951 +01952 +01953 <font class="comment">// Start copying the samples</font> +01954 +01955 +01956 <font class="comment">// In the first case, the fade out is completely contained in the first buffer</font> +01957 <font class="comment">// pointed to by ptr1.</font> +01958 <font class="keywordflow">if</font> (xfadeByteSize < bytes1) +01959 { +01960 +01961 <font class="comment">// Do cross fade</font> +01962 +01963 <font class="keywordflow">for</font> (i = 0; i < xfadeSize; i++) +01964 { +01965 out[i] = (sint16) (amp1 * in1[i]); +01966 amp1 -= incr; +01967 } +01968 +01969 <font class="comment">// Copy remaining samples</font> +01970 +01971 memset(ptr1 + xfadeByteSize, 0, bytes1 - xfadeByteSize); +01972 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes1 - xfadeByteSize; +01973 +01974 <font class="keywordflow">if</font> (ptr2) +01975 { +01976 memset(ptr2, 0, bytes2); +01977 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> += bytes2; +01978 } +01979 +01980 } +01981 +01982 <font class="comment">// In the second case, the fade out stretches over the first and the second buffers.</font> +01983 <font class="keywordflow">else</font> +01984 { +01985 +01986 uint32 fade1 = bytes1 / 2; +01987 uint32 fade2 = xfadeSize - fade1; +01988 +01989 <font class="comment">// Do cross fade</font> +01990 +01991 <font class="comment">// Part 1, start at ptr1</font> +01992 <font class="keywordflow">for</font> (i = 0; i < fade1; i++) +01993 { +01994 out[i] = (sint16) (amp1 * in1[i]); +01995 amp1 -= incr; +01996 } +01997 +01998 +01999 <font class="keywordflow">if</font> (ptr2) +02000 { +02001 out = (sint16*) ptr2; +02002 +02003 <font class="comment">// Part 2, continue at ptr2</font> +02004 <font class="keywordflow">for</font> (uint32 k = 0; i < xfadeSize; i++, k++) +02005 { +02006 out[k] = (sint16) (amp1 * in1[i]); +02007 amp1 -= incr; +02008 } +02009 +02010 <font class="comment">// Clear remaining samples</font> +02011 memset(ptr2 + 2 * k, 0, bytes2 - 2 * k); +02012 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes2 - 2 * k; +02013 } +02014 +02015 } +02016 +02017 +02018 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += xfadeByteSize; +02019 +02020 +02021 <font class="comment">// Unlock the DirectSound buffer</font> +02022 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +02023 +02024 +02025 <font class="comment">// Update the next write position</font> +02026 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> = (writePos + bytes1 + bytes2); +02027 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +02028 { +02029 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +02030 } +02031 +02032 +02033 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +02034 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDOU: SILENCING"</font>, <font class="keyword">this</font>)); +02035 +02036 <font class="comment">// Keep track of where tha last sample was written and the position</font> +02037 <font class="comment">// of the play cursor relative to the end position. if the _EndState</font> +02038 <font class="comment">// is 0, the play cursor is after the end position, 1 otherwise.</font> +02039 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> = writePos + xfadeSize; +02040 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +02041 { +02042 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +02043 } +02044 +02045 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>)? <a class="code" href="namespaceNLSOUND.html#a86a33">NL_DSOUND_TAIL1</a> : <a class="code" href="namespaceNLSOUND.html#a86a34">NL_DSOUND_TAIL2</a>; +02046 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDOU: ENDSTATE=%d, E=%d, P=%d"</font>, <font class="keyword">this</font>, (<font class="keywordtype">int</font>) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>, playPos)); +02047 +02048 +02049 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDOU: P=%d, W=%d, NW=%d, SZ=%d, BW=%d, S=%d, B=%d"</font>, <font class="keyword">this</font>, playPos, writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>, bytes1 + bytes2)); +02050 +02051 +02052 +02053 <font class="preprocessor">#if NLSOUND_PROFILE</font> +02054 <font class="preprocessor"></font> _LastSwapTime = CTime::ticksToSecond(CTime::getPerformanceTime() - start); +02055 _TotalSwapTime += _LastSwapTime; +02056 _MaxSwapTime = (_LastSwapTime > _MaxSwapTime) ? _LastSwapTime : _MaxSwapTime; +02057 _MinSwapTime = (_LastSwapTime < _MinSwapTime) ? _LastSwapTime : _MinSwapTime; +02058 _SwapCount++; +02059 <font class="preprocessor">#endif</font> +02060 <font class="preprocessor"></font> +02061 } +02062 +02063 <font class="comment">// ******************************************************************</font> +02064 +<a name="l02065"></a><a class="code" href="classNLSOUND_1_1CSourceDSound.html#c9">02065</a> <font class="keywordtype">void</font> CSourceDSound::fadeIn() +02066 { +02067 <font class="keywordtype">bool</font> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <font class="keyword">false</font>; +02068 uint8 *ptr1, *ptr2; +02069 DWORD bytes1, bytes2; +02070 DWORD playPos, writePos; +02071 +02072 +02073 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a> == NULL) +02074 { +02075 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +02076 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o4">_UserState</a> = <a class="code" href="namespaceNLSOUND.html#a85a32">NL_DSOUND_STOPPED</a>; +02077 <font class="keywordflow">return</font>; +02078 } +02079 +02080 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a> == 0) +02081 { +02082 <font class="keywordflow">return</font>; +02083 } +02084 +02085 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startPos); +02086 +02087 <font class="comment">// Set the correct pitch for this sound</font> +02088 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#z970_8">setPitch</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o14">_Freq</a>); +02089 +02090 <font class="comment">// Set the correct volume</font> +02091 <font class="comment">// FIXME: a bit of a hack</font> +02092 <font class="keyword">const</font> CVector &pos = CListenerDSound::instance()->getPos(); +02093 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#a6">updateVolume</a>(pos); +02094 +02095 +02096 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->GetCurrentPosition(&playPos, &writePos); +02097 +02098 uint8* <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> = ((CBufferDSound*) <a class="code" href="classNLSOUND_1_1ISource.html#n0">_Buffer</a>)->getData(); +02099 uint32 available = (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> < <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>) ? <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a> - <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> : 0; +02100 uint32 bytes = <a class="code" href="source__dsound_8cpp.html#a2">NLSOUND_MIN</a>(<a class="code" href="classNLSOUND_1_1CSourceDSound.html#r1">_SwapCopySize</a>, available); +02101 <font class="comment">// uint32 clear = _SwapCopySize - available;</font> +02102 +02103 +02104 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = 0; +02105 +02106 <font class="comment">// Lock the buffer</font> +02107 +02108 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startLock); +02109 +02110 +02111 <font class="keywordflow">if</font> (!<a class="code" href="classNLSOUND_1_1CSourceDSound.html#c1">lock</a>(writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r1">_SwapCopySize</a>, ptr1, bytes1, ptr2, bytes2)) +02112 { +02113 <font class="keywordflow">return</font>; +02114 } +02115 +02116 +02117 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startCopy); +02118 +02119 <font class="comment">// Start copying the samples</font> +02120 +02121 <font class="keywordflow">if</font> (bytes1 <= bytes) { +02122 +02123 CFastMem::memcpy(ptr1, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes1); +02124 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes1; +02125 bytes -= bytes1; +02126 +02127 <font class="keywordflow">if</font> (ptr2) +02128 { +02129 <font class="keywordflow">if</font> (bytes > 0) +02130 { +02131 CFastMem::memcpy(ptr2, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes); +02132 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes; +02133 } +02134 +02135 <font class="keywordflow">if</font> (bytes < bytes2) +02136 { +02137 <font class="keywordflow">if</font> (_Loop) +02138 { +02139 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: LOOP"</font>, <font class="keyword">this</font>)); +02140 +02141 CFastMem::memcpy(ptr2 + bytes, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a>, bytes2 - bytes); +02142 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes2 - bytes; +02143 } +02144 <font class="keywordflow">else</font> +02145 { +02146 memset(ptr2 + bytes, 0, bytes2 - bytes); +02147 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes2 - bytes; +02148 } +02149 } +02150 } +02151 } +02152 <font class="keywordflow">else</font> +02153 { +02154 <font class="keywordflow">if</font> (bytes > 0) +02155 { +02156 CFastMem::memcpy(ptr1, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes); +02157 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes; +02158 } +02159 +02160 <font class="keywordflow">if</font> (_Loop) +02161 { +02162 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: LOOP"</font>, <font class="keyword">this</font>)); +02163 +02164 CFastMem::memcpy(ptr1 + bytes, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a>, bytes1 - bytes); +02165 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = bytes1 - bytes; +02166 +02167 <font class="keywordflow">if</font> (ptr2) +02168 { +02169 CFastMem::memcpy(ptr2, <a class="code" href="driver__opengl__extension__def_8h.html#a394">data</a> + <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, bytes2); +02170 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> += bytes2; +02171 } +02172 } +02173 <font class="keywordflow">else</font> +02174 { +02175 memset(ptr1 + bytes, 0, bytes1 - bytes); +02176 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> = bytes1 - bytes; +02177 +02178 <font class="keywordflow">if</font> (ptr2) +02179 { +02180 memset(ptr2, 0, bytes2); +02181 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a> += bytes2; +02182 } +02183 } +02184 } +02185 +02186 +02187 <a class="code" href="source__dsound_8cpp.html#a0">INITTIME</a>(startUnlock); +02188 +02189 <font class="comment">// Unlock the buffer</font> +02190 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o5">_SecondaryBuffer</a>->Unlock(ptr1, bytes1, ptr2, bytes2); +02191 +02192 +02193 <font class="comment">// Update the state variables</font> +02194 +02195 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a27">NL_DSOUND_FILLING</a>; +02196 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: FILLING"</font>, <font class="keyword">this</font>)); +02197 +02198 +02199 <font class="comment">// Check if we've reached the end of the file</font> +02200 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> == <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>) +02201 { +02202 <font class="keywordflow">if</font> (_Loop) +02203 { +02204 <font class="comment">// If we're looping, start all over again</font> +02205 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: LOOP"</font>, <font class="keyword">this</font>)); +02206 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a> = 0; +02207 } +02208 <font class="keywordflow">else</font> +02209 { +02210 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o6">_SecondaryBufferState</a> = <a class="code" href="namespaceNLSOUND.html#a84a28">NL_DSOUND_SILENCING</a>; +02211 +02212 <font class="comment">// Keep track of where tha last sample was written and the position</font> +02213 <font class="comment">// of the play cursor relative to the end position. if the _EndState</font> +02214 <font class="comment">// is NL_DSOUND_TAIL1, the play cursor is after the end position, </font> +02215 <font class="comment">// NL_DSOUND_TAIL2 otherwise.</font> +02216 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> = writePos + bytes; +02217 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +02218 { +02219 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +02220 } +02221 +02222 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a> = (playPos > <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>)? <a class="code" href="namespaceNLSOUND.html#a86a33">NL_DSOUND_TAIL1</a> : <a class="code" href="namespaceNLSOUND.html#a86a34">NL_DSOUND_TAIL2</a>; +02223 +02224 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: SILENCING"</font>, <font class="keyword">this</font>)); +02225 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: ENDSTATE=%d, E=%d, P=%d"</font>, <font class="keyword">this</font>, (<font class="keywordtype">int</font>) <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o13">_EndState</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o12">_EndPosition</a>, playPos)); +02226 } +02227 } +02228 +02229 +02230 <font class="comment">// Update the write pointer</font> +02231 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> = writePos + bytes1 + bytes2; +02232 <font class="keywordflow">if</font> (<a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> >= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>) +02233 { +02234 <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a> -= <a class="code" href="classNLSOUND_1_1CSourceDSound.html#r6">_SecondaryBufferSize</a>; +02235 } +02236 +02237 <a class="code" href="source__dsound_8cpp.html#a1">DBGPOS</a>((<font class="stringliteral">"[%p] FDIN: P=%d, W=%d, NW=%d, SZ=%d, BW=%d, S=%d, B=%d"</font>, <font class="keyword">this</font>, playPos, writePos, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o9">_NextWritePos</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o1">_BufferSize</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o10">_BytesWritten</a>, <a class="code" href="classNLSOUND_1_1CSourceDSound.html#o11">_SilenceWritten</a>, bytes1 + bytes2)); +02238 +02239 +02240 <font class="preprocessor">#if NLSOUND_PROFILE</font> +02241 <font class="preprocessor"></font> _TotalUpdateSize += bytes1 + bytes2; +02242 _PosTime += CTime::ticksToSecond(startLock - startPos); +02243 _LockTime += CTime::ticksToSecond(startCopy - startLock); +02244 _CopyTime += CTime::ticksToSecond(startUnlock - startCopy); +02245 _UnlockTime += CTime::ticksToSecond(CTime::getPerformanceTime() - startUnlock); +02246 _CopyCount++; +02247 <font class="preprocessor">#endif</font> +02248 <font class="preprocessor"></font> +02249 +02250 } +02251 +02252 +02253 +02254 } <font class="comment">// NLSOUND</font> +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |