summaryrefslogtreecommitdiff
path: root/doc/html/SoundStream_8cpp-source.htm
blob: 0b0effd53d6ddab6d8e2c4cb25d08e054e33a0c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>SFML - Simple and Fast Multimedia Library</title>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <link href="doxygen.css" rel="stylesheet" type="text/css" />
        <link href="tabs.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div id="logo">
            <img src="./logo.jpg" width="770" height="200" title="SFML home" alt="SFML logo" />
        </div>
<!-- Generated by Doxygen 1.5.8 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.htm"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.htm"><span>Namespaces</span></a></li>
      <li><a href="annotated.htm"><span>Classes</span></a></li>
      <li class="current"><a href="files.htm"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.htm"><span>File&nbsp;List</span></a></li>
    </ul>
  </div>
<h1>SoundStream.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// SFML - Simple and Fast Multimedia Library</span>
<a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)</span>
<a name="l00005"></a>00005 <span class="comment">//</span>
<a name="l00006"></a>00006 <span class="comment">// This software is provided 'as-is', without any express or implied warranty.</span>
<a name="l00007"></a>00007 <span class="comment">// In no event will the authors be held liable for any damages arising from the use of this software.</span>
<a name="l00008"></a>00008 <span class="comment">//</span>
<a name="l00009"></a>00009 <span class="comment">// Permission is granted to anyone to use this software for any purpose,</span>
<a name="l00010"></a>00010 <span class="comment">// including commercial applications, and to alter it and redistribute it freely,</span>
<a name="l00011"></a>00011 <span class="comment">// subject to the following restrictions:</span>
<a name="l00012"></a>00012 <span class="comment">//</span>
<a name="l00013"></a>00013 <span class="comment">// 1. The origin of this software must not be misrepresented;</span>
<a name="l00014"></a>00014 <span class="comment">//    you must not claim that you wrote the original software.</span>
<a name="l00015"></a>00015 <span class="comment">//    If you use this software in a product, an acknowledgment</span>
<a name="l00016"></a>00016 <span class="comment">//    in the product documentation would be appreciated but is not required.</span>
<a name="l00017"></a>00017 <span class="comment">//</span>
<a name="l00018"></a>00018 <span class="comment">// 2. Altered source versions must be plainly marked as such,</span>
<a name="l00019"></a>00019 <span class="comment">//    and must not be misrepresented as being the original software.</span>
<a name="l00020"></a>00020 <span class="comment">//</span>
<a name="l00021"></a>00021 <span class="comment">// 3. This notice may not be removed or altered from any source distribution.</span>
<a name="l00022"></a>00022 <span class="comment">//</span>
<a name="l00024"></a>00024 <span class="comment"></span>
<a name="l00026"></a>00026 <span class="comment">// Headers</span>
<a name="l00028"></a>00028 <span class="comment"></span><span class="preprocessor">#include &lt;SFML/Audio/SoundStream.hpp&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;SFML/Audio/AudioDevice.hpp&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;SFML/Audio/OpenAL.hpp&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;SFML/System/Sleep.hpp&gt;</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="keyword">namespace </span>sf
<a name="l00035"></a>00035 {
<a name="l00039"></a><a class="code" href="classsf_1_1SoundStream.htm#769d08f4c3c6b4340ef3a838329d2e5c">00039</a> <a class="code" href="classsf_1_1SoundStream.htm#769d08f4c3c6b4340ef3a838329d2e5c" title="Default constructor.">SoundStream::SoundStream</a>() :
<a name="l00040"></a>00040 myIsStreaming     (false),
<a name="l00041"></a>00041 myChannelsCount   (0),
<a name="l00042"></a>00042 mySampleRate      (0),
<a name="l00043"></a>00043 myFormat          (0),
<a name="l00044"></a>00044 myLoop            (false),
<a name="l00045"></a>00045 mySamplesProcessed(0)
<a name="l00046"></a>00046 {
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 }
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 
<a name="l00054"></a><a class="code" href="classsf_1_1SoundStream.htm#5b14ec6669440e4dbd5650f0fb6b0674">00054</a> <a class="code" href="classsf_1_1SoundStream.htm#5b14ec6669440e4dbd5650f0fb6b0674" title="Virtual destructor.">SoundStream::~SoundStream</a>()
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056     <span class="comment">// Stop the sound if it was playing</span>
<a name="l00057"></a>00057     <a class="code" href="classsf_1_1SoundStream.htm#53c9e9b160bcbcc89c93c1682b4525df" title="Stop playing the audio stream.">Stop</a>();
<a name="l00058"></a>00058 }
<a name="l00059"></a>00059 
<a name="l00060"></a>00060 
<a name="l00064"></a><a class="code" href="classsf_1_1SoundStream.htm#ed9b6b06c0fa9c2d0b8c094eb2826793">00064</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1SoundStream.htm#ed9b6b06c0fa9c2d0b8c094eb2826793" title="Set the audio stream parameters, you must call it before Play().">SoundStream::Initialize</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ChannelsCount, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SampleRate)
<a name="l00065"></a>00065 {
<a name="l00066"></a>00066     myChannelsCount = ChannelsCount;
<a name="l00067"></a>00067     mySampleRate    = SampleRate;
<a name="l00068"></a>00068 
<a name="l00069"></a>00069     <span class="comment">// Deduce the format from the number of channels</span>
<a name="l00070"></a>00070     myFormat = priv::AudioDevice::GetInstance().GetFormatFromChannelsCount(ChannelsCount);
<a name="l00071"></a>00071 
<a name="l00072"></a>00072     <span class="comment">// Check if the format is valid</span>
<a name="l00073"></a>00073     <span class="keywordflow">if</span> (myFormat == 0)
<a name="l00074"></a>00074     {
<a name="l00075"></a>00075         myChannelsCount = 0;
<a name="l00076"></a>00076         mySampleRate    = 0;
<a name="l00077"></a>00077         std::cerr &lt;&lt; <span class="stringliteral">"Unsupported number of channels ("</span> &lt;&lt; myChannelsCount &lt;&lt; <span class="stringliteral">")"</span> &lt;&lt; std::endl;
<a name="l00078"></a>00078     }
<a name="l00079"></a>00079 }
<a name="l00080"></a>00080 
<a name="l00081"></a>00081 
<a name="l00085"></a><a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf">00085</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">SoundStream::Play</a>()
<a name="l00086"></a>00086 {
<a name="l00087"></a>00087     <span class="comment">// Check if the sound parameters have been set</span>
<a name="l00088"></a>00088     <span class="keywordflow">if</span> (myFormat == 0)
<a name="l00089"></a>00089     {
<a name="l00090"></a>00090         std::cerr &lt;&lt; <span class="stringliteral">"Failed to play audio stream : sound parameters have not been initialized (call Initialize first)"</span> &lt;&lt; std::endl;
<a name="l00091"></a>00091         <span class="keywordflow">return</span>;
<a name="l00092"></a>00092     }
<a name="l00093"></a>00093 
<a name="l00094"></a>00094     <span class="comment">// If the sound is already playing (probably paused), just resume it</span>
<a name="l00095"></a>00095     <span class="keywordflow">if</span> (myIsStreaming)
<a name="l00096"></a>00096     {
<a name="l00097"></a>00097         <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">Sound::Play</a>();
<a name="l00098"></a>00098         <span class="keywordflow">return</span>;
<a name="l00099"></a>00099     }
<a name="l00100"></a>00100 
<a name="l00101"></a>00101     <span class="comment">// Notify the derived class</span>
<a name="l00102"></a>00102     <span class="keywordflow">if</span> (OnStart())
<a name="l00103"></a>00103     {
<a name="l00104"></a>00104         <span class="comment">// Start updating the stream in a separate thread to avoid blocking the application</span>
<a name="l00105"></a>00105         mySamplesProcessed = 0;
<a name="l00106"></a>00106         myIsStreaming = <span class="keyword">true</span>;
<a name="l00107"></a>00107         <a class="code" href="classsf_1_1Thread.htm#046df871f73d3cf452d1c72bcc143642" title="Create and run the thread.">Launch</a>();
<a name="l00108"></a>00108     }
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 
<a name="l00115"></a><a class="code" href="classsf_1_1SoundStream.htm#53c9e9b160bcbcc89c93c1682b4525df">00115</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1SoundStream.htm#53c9e9b160bcbcc89c93c1682b4525df" title="Stop playing the audio stream.">SoundStream::Stop</a>()
<a name="l00116"></a>00116 {
<a name="l00117"></a>00117     <span class="comment">// Wait for the thread to terminate</span>
<a name="l00118"></a>00118     myIsStreaming = <span class="keyword">false</span>;
<a name="l00119"></a>00119     <a class="code" href="classsf_1_1Thread.htm#67f3c609fdf99688531dbfae461ea4d2" title="Wait until the thread finishes.">Wait</a>();
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121 
<a name="l00122"></a>00122 
<a name="l00126"></a><a class="code" href="classsf_1_1SoundStream.htm#bdcb5c8f3b5884a27e2eb013f5e36858">00126</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classsf_1_1SoundStream.htm#bdcb5c8f3b5884a27e2eb013f5e36858" title="Return the number of channels (1 = mono, 2 = stereo).">SoundStream::GetChannelsCount</a>()<span class="keyword"> const</span>
<a name="l00127"></a>00127 <span class="keyword"></span>{
<a name="l00128"></a>00128     <span class="keywordflow">return</span> myChannelsCount;
<a name="l00129"></a>00129 }
<a name="l00130"></a>00130 
<a name="l00131"></a>00131 
<a name="l00135"></a><a class="code" href="classsf_1_1SoundStream.htm#74dabd1177bb60c8bd64bb6bbedb64bc">00135</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classsf_1_1SoundStream.htm#74dabd1177bb60c8bd64bb6bbedb64bc" title="Get the stream sample rate.">SoundStream::GetSampleRate</a>()<span class="keyword"> const</span>
<a name="l00136"></a>00136 <span class="keyword"></span>{
<a name="l00137"></a>00137     <span class="keywordflow">return</span> mySampleRate;
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 
<a name="l00140"></a>00140 
<a name="l00144"></a><a class="code" href="classsf_1_1SoundStream.htm#cef2468ca4bc3e8ced76b11fb95c7ef2">00144</a> <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b9622195" title="Enumeration of the sound states.">Sound::Status</a> <a class="code" href="classsf_1_1SoundStream.htm#cef2468ca4bc3e8ced76b11fb95c7ef2" title="Get the status of the stream (stopped, paused, playing).">SoundStream::GetStatus</a>()<span class="keyword"> const</span>
<a name="l00145"></a>00145 <span class="keyword"></span>{
<a name="l00146"></a>00146     <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b9622195" title="Enumeration of the sound states.">Status</a> <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b9622195" title="Enumeration of the sound states.">Status</a> = <a class="code" href="classsf_1_1SoundStream.htm#cef2468ca4bc3e8ced76b11fb95c7ef2" title="Get the status of the stream (stopped, paused, playing).">Sound::GetStatus</a>();
<a name="l00147"></a>00147 
<a name="l00148"></a>00148     <span class="comment">// To compensate for the lag between Play() and alSourcePlay()</span>
<a name="l00149"></a>00149     <span class="keywordflow">if</span> ((Status == <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b962219539fd53aa83db9189ca2fff82e0553cf9" title="Sound is not playing.">Stopped</a>) &amp;&amp; myIsStreaming)
<a name="l00150"></a>00150         Status = <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b962219516657b221888cf11e2a076f5b2783288" title="Sound is playing.">Playing</a>;
<a name="l00151"></a>00151 
<a name="l00152"></a>00152     <span class="keywordflow">return</span> Status;
<a name="l00153"></a>00153 }
<a name="l00154"></a>00154 
<a name="l00155"></a>00155 
<a name="l00162"></a><a class="code" href="classsf_1_1SoundStream.htm#d11fee9eb4baba68d6ed9f44bc6170ac">00162</a> <span class="keywordtype">float</span> <a class="code" href="classsf_1_1SoundStream.htm#d11fee9eb4baba68d6ed9f44bc6170ac" title="Get the current playing position of the stream.">SoundStream::GetPlayingOffset</a>()<span class="keyword"> const</span>
<a name="l00163"></a>00163 <span class="keyword"></span>{
<a name="l00164"></a>00164     <span class="keywordflow">return</span> <a class="code" href="classsf_1_1SoundStream.htm#d11fee9eb4baba68d6ed9f44bc6170ac" title="Get the current playing position of the stream.">Sound::GetPlayingOffset</a>() + <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span>(mySamplesProcessed) / mySampleRate / myChannelsCount;
<a name="l00165"></a>00165 }
<a name="l00166"></a>00166 
<a name="l00167"></a>00167 
<a name="l00171"></a><a class="code" href="classsf_1_1SoundStream.htm#1072090152b10d83f43f0cd6bbd82b4e">00171</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1SoundStream.htm#1072090152b10d83f43f0cd6bbd82b4e" title="Set the stream loop state.">SoundStream::SetLoop</a>(<span class="keywordtype">bool</span> Loop)
<a name="l00172"></a>00172 {
<a name="l00173"></a>00173     myLoop = Loop;
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175 
<a name="l00176"></a>00176 
<a name="l00180"></a><a class="code" href="classsf_1_1SoundStream.htm#caecb1c68af4a9d75f9e9ad2d42afa78">00180</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1SoundStream.htm#caecb1c68af4a9d75f9e9ad2d42afa78" title="Tell whether or not the stream is looping.">SoundStream::GetLoop</a>()<span class="keyword"> const</span>
<a name="l00181"></a>00181 <span class="keyword"></span>{
<a name="l00182"></a>00182     <span class="keywordflow">return</span> myLoop;
<a name="l00183"></a>00183 }
<a name="l00184"></a>00184 
<a name="l00185"></a>00185 
<a name="l00189"></a>00189 <span class="keywordtype">void</span> SoundStream::Run()
<a name="l00190"></a>00190 {
<a name="l00191"></a>00191     <span class="comment">// Create the buffers</span>
<a name="l00192"></a>00192     ALCheck(alGenBuffers(BuffersCount, myBuffers));
<a name="l00193"></a>00193     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; BuffersCount; ++i)
<a name="l00194"></a>00194         myEndBuffers[i] = <span class="keyword">false</span>;
<a name="l00195"></a>00195 
<a name="l00196"></a>00196     <span class="comment">// Fill the queue</span>
<a name="l00197"></a>00197     <span class="keywordtype">bool</span> RequestStop = FillQueue();
<a name="l00198"></a>00198 
<a name="l00199"></a>00199     <span class="comment">// Play the sound</span>
<a name="l00200"></a>00200     <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">Sound::Play</a>();
<a name="l00201"></a>00201 
<a name="l00202"></a>00202     <span class="keywordflow">while</span> (myIsStreaming)
<a name="l00203"></a>00203     {
<a name="l00204"></a>00204         <span class="comment">// The stream has been interrupted !</span>
<a name="l00205"></a>00205         <span class="keywordflow">if</span> (<a class="code" href="classsf_1_1Sound.htm#76c97fca3a5092db606eb66461f063af" title="Get the status of the sound (stopped, paused, playing).">Sound::GetStatus</a>() == <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b962219539fd53aa83db9189ca2fff82e0553cf9" title="Sound is not playing.">Stopped</a>)
<a name="l00206"></a>00206         {
<a name="l00207"></a>00207             <span class="keywordflow">if</span> (!RequestStop)
<a name="l00208"></a>00208             {
<a name="l00209"></a>00209                 <span class="comment">// Just continue</span>
<a name="l00210"></a>00210                 <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">Sound::Play</a>();
<a name="l00211"></a>00211             }
<a name="l00212"></a>00212             <span class="keywordflow">else</span>
<a name="l00213"></a>00213             {
<a name="l00214"></a>00214                 <span class="comment">// End streaming</span>
<a name="l00215"></a>00215                 myIsStreaming = <span class="keyword">false</span>;
<a name="l00216"></a>00216             }
<a name="l00217"></a>00217         }
<a name="l00218"></a>00218 
<a name="l00219"></a>00219         <span class="comment">// Get the number of buffers that have been processed (ie. ready for reuse)</span>
<a name="l00220"></a>00220         ALint NbProcessed;
<a name="l00221"></a>00221         ALCheck(alGetSourcei(Sound::mySource, AL_BUFFERS_PROCESSED, &amp;NbProcessed));
<a name="l00222"></a>00222 
<a name="l00223"></a>00223         <span class="keywordflow">while</span> (NbProcessed--)
<a name="l00224"></a>00224         {
<a name="l00225"></a>00225             <span class="comment">// Pop the first unused buffer from the queue</span>
<a name="l00226"></a>00226             ALuint Buffer;
<a name="l00227"></a>00227             ALCheck(alSourceUnqueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00228"></a>00228 
<a name="l00229"></a>00229             <span class="comment">// Find its number</span>
<a name="l00230"></a>00230             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BufferNum = 0;
<a name="l00231"></a>00231             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; BuffersCount; ++i)
<a name="l00232"></a>00232                 <span class="keywordflow">if</span> (myBuffers[i] == Buffer)
<a name="l00233"></a>00233                 {
<a name="l00234"></a>00234                     BufferNum = i;
<a name="l00235"></a>00235                     <span class="keywordflow">break</span>;
<a name="l00236"></a>00236                 }
<a name="l00237"></a>00237 
<a name="l00238"></a>00238             <span class="comment">// Retrieve its size and add it to the samples count</span>
<a name="l00239"></a>00239             <span class="keywordflow">if</span> (myEndBuffers[BufferNum])
<a name="l00240"></a>00240             {
<a name="l00241"></a>00241                 <span class="comment">// This was the last buffer: reset the sample count</span>
<a name="l00242"></a>00242                 mySamplesProcessed = 0;
<a name="l00243"></a>00243                 myEndBuffers[BufferNum] = <span class="keyword">false</span>;
<a name="l00244"></a>00244             }
<a name="l00245"></a>00245             <span class="keywordflow">else</span>
<a name="l00246"></a>00246             {
<a name="l00247"></a>00247                 ALint Size;
<a name="l00248"></a>00248                 ALCheck(alGetBufferi(Buffer, AL_SIZE, &amp;Size));
<a name="l00249"></a>00249                 mySamplesProcessed += Size / <span class="keyword">sizeof</span>(Int16);
<a name="l00250"></a>00250             }
<a name="l00251"></a>00251 
<a name="l00252"></a>00252             <span class="comment">// Fill it and push it back into the playing queue</span>
<a name="l00253"></a>00253             <span class="keywordflow">if</span> (!RequestStop)
<a name="l00254"></a>00254             {
<a name="l00255"></a>00255                 <span class="keywordflow">if</span> (FillAndPushBuffer(BufferNum))
<a name="l00256"></a>00256                     RequestStop = <span class="keyword">true</span>;
<a name="l00257"></a>00257             }
<a name="l00258"></a>00258         }
<a name="l00259"></a>00259 
<a name="l00260"></a>00260         <span class="comment">// Leave some time for the other threads if the stream is still playing</span>
<a name="l00261"></a>00261         <span class="keywordflow">if</span> (<a class="code" href="classsf_1_1Sound.htm#76c97fca3a5092db606eb66461f063af" title="Get the status of the sound (stopped, paused, playing).">Sound::GetStatus</a>() != <a class="code" href="classsf_1_1Sound.htm#28ad2186cde78fed2c79c867b962219539fd53aa83db9189ca2fff82e0553cf9" title="Sound is not playing.">Stopped</a>)
<a name="l00262"></a>00262             Sleep(0.1f);
<a name="l00263"></a>00263     }
<a name="l00264"></a>00264 
<a name="l00265"></a>00265     <span class="comment">// Stop the playback</span>
<a name="l00266"></a>00266     <a class="code" href="classsf_1_1SoundStream.htm#53c9e9b160bcbcc89c93c1682b4525df" title="Stop playing the audio stream.">Sound::Stop</a>();
<a name="l00267"></a>00267 
<a name="l00268"></a>00268     <span class="comment">// Unqueue any buffer left in the queue</span>
<a name="l00269"></a>00269     ClearQueue();
<a name="l00270"></a>00270 
<a name="l00271"></a>00271     <span class="comment">// Delete the buffers</span>
<a name="l00272"></a>00272     ALCheck(alSourcei(Sound::mySource, AL_BUFFER, 0));
<a name="l00273"></a>00273     ALCheck(alDeleteBuffers(BuffersCount, myBuffers));
<a name="l00274"></a>00274 }
<a name="l00275"></a>00275 
<a name="l00276"></a>00276 
<a name="l00281"></a>00281 <span class="keywordtype">bool</span> SoundStream::FillAndPushBuffer(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BufferNum)
<a name="l00282"></a>00282 {
<a name="l00283"></a>00283     <span class="keywordtype">bool</span> RequestStop = <span class="keyword">false</span>;
<a name="l00284"></a>00284 
<a name="l00285"></a>00285     <span class="comment">// Acquire audio data</span>
<a name="l00286"></a>00286     Chunk Data = {NULL, 0};
<a name="l00287"></a>00287     <span class="keywordflow">if</span> (!OnGetData(Data))
<a name="l00288"></a>00288     {
<a name="l00289"></a>00289         <span class="comment">// Mark the buffer as the last one (so that we know when to reset the playing position)</span>
<a name="l00290"></a>00290         myEndBuffers[BufferNum] = <span class="keyword">true</span>;
<a name="l00291"></a>00291 
<a name="l00292"></a>00292         <span class="comment">// Check if the stream must loop or stop</span>
<a name="l00293"></a>00293         <span class="keywordflow">if</span> (myLoop &amp;&amp; OnStart())
<a name="l00294"></a>00294         {
<a name="l00295"></a>00295             <span class="comment">// If we succeeded to restart and we previously had no data, try to fill the buffer once again</span>
<a name="l00296"></a>00296             <span class="keywordflow">if</span> (!Data.Samples || (Data.NbSamples == 0))
<a name="l00297"></a>00297             {
<a name="l00298"></a>00298                 <span class="keywordflow">return</span> FillAndPushBuffer(BufferNum);
<a name="l00299"></a>00299             }
<a name="l00300"></a>00300         }
<a name="l00301"></a>00301         <span class="keywordflow">else</span>
<a name="l00302"></a>00302         {
<a name="l00303"></a>00303             <span class="comment">// Not looping or restart failed: request stop</span>
<a name="l00304"></a>00304             RequestStop = <span class="keyword">true</span>;
<a name="l00305"></a>00305         }
<a name="l00306"></a>00306     }
<a name="l00307"></a>00307 
<a name="l00308"></a>00308     <span class="comment">// Fill the buffer if some data was returned</span>
<a name="l00309"></a>00309     <span class="keywordflow">if</span> (Data.Samples &amp;&amp; Data.NbSamples)
<a name="l00310"></a>00310     {
<a name="l00311"></a>00311         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Buffer = myBuffers[BufferNum];
<a name="l00312"></a>00312 
<a name="l00313"></a>00313         <span class="comment">// Fill the buffer</span>
<a name="l00314"></a>00314         ALsizei Size = <span class="keyword">static_cast&lt;</span>ALsizei<span class="keyword">&gt;</span>(Data.NbSamples) * <span class="keyword">sizeof</span>(Int16);
<a name="l00315"></a>00315         ALCheck(alBufferData(Buffer, myFormat, Data.Samples, Size, mySampleRate));
<a name="l00316"></a>00316 
<a name="l00317"></a>00317         <span class="comment">// Push it into the sound queue</span>
<a name="l00318"></a>00318         ALCheck(alSourceQueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00319"></a>00319     }
<a name="l00320"></a>00320 
<a name="l00321"></a>00321     <span class="keywordflow">return</span> RequestStop;
<a name="l00322"></a>00322 }
<a name="l00323"></a>00323 
<a name="l00324"></a>00324 
<a name="l00328"></a>00328 <span class="keywordtype">bool</span> SoundStream::FillQueue()
<a name="l00329"></a>00329 {
<a name="l00330"></a>00330     <span class="comment">// Fill and enqueue all the available buffers</span>
<a name="l00331"></a>00331     <span class="keywordtype">bool</span> RequestStop = <span class="keyword">false</span>;
<a name="l00332"></a>00332     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; (i &lt; BuffersCount) &amp;&amp; !RequestStop; ++i)
<a name="l00333"></a>00333     {
<a name="l00334"></a>00334         <span class="keywordflow">if</span> (FillAndPushBuffer(i))
<a name="l00335"></a>00335             RequestStop = <span class="keyword">true</span>;
<a name="l00336"></a>00336     }
<a name="l00337"></a>00337 
<a name="l00338"></a>00338     <span class="keywordflow">return</span> RequestStop;
<a name="l00339"></a>00339 }
<a name="l00340"></a>00340 
<a name="l00341"></a>00341 
<a name="l00345"></a>00345 <span class="keywordtype">void</span> SoundStream::ClearQueue()
<a name="l00346"></a>00346 {
<a name="l00347"></a>00347     <span class="comment">// Get the number of buffers still in the queue</span>
<a name="l00348"></a>00348     ALint NbQueued;
<a name="l00349"></a>00349     ALCheck(alGetSourcei(Sound::mySource, AL_BUFFERS_QUEUED, &amp;NbQueued));
<a name="l00350"></a>00350 
<a name="l00351"></a>00351     <span class="comment">// Unqueue them all</span>
<a name="l00352"></a>00352     ALuint Buffer;
<a name="l00353"></a>00353     <span class="keywordflow">for</span> (ALint i = 0; i &lt; NbQueued; ++i)
<a name="l00354"></a>00354         ALCheck(alSourceUnqueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00355"></a>00355 }
<a name="l00356"></a>00356 
<a name="l00357"></a>00357 
<a name="l00361"></a>00361 <span class="keywordtype">bool</span> SoundStream::OnStart()
<a name="l00362"></a>00362 {
<a name="l00363"></a>00363     <span class="comment">// Does nothing by default</span>
<a name="l00364"></a>00364 
<a name="l00365"></a>00365     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00366"></a>00366 }
<a name="l00367"></a>00367 
<a name="l00368"></a>00368 } <span class="comment">// namespace sf</span>
</pre></div></div>

        <p id="footer">
            &nbsp;::&nbsp; Copyright &copy; 2007-2008 Laurent Gomila, all rights reserved &nbsp;::&nbsp;
            Documentation generated by <a href="http://www.doxygen.org/" title="doxygen website">doxygen 1.5.2</a> &nbsp;::&nbsp;
        </p>

    </body>
</html>