summaryrefslogtreecommitdiff
path: root/doc/html/SoundStream_8cpp-source.htm
blob: 7cb7ece58305f8a2c1ec2880b353727cdd51320a (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
<!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 buffers</span>
<a name="l00192"></a>00192     ALCheck(alGenBuffers(BuffersCount, myBuffers));
<a name="l00193"></a>00193     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EndBuffer = 0xFFFF;
<a name="l00194"></a>00194 
<a name="l00195"></a>00195     <span class="comment">// Fill the queue</span>
<a name="l00196"></a>00196     <span class="keywordtype">bool</span> RequestStop = FillQueue();
<a name="l00197"></a>00197 
<a name="l00198"></a>00198     <span class="comment">// Play the sound</span>
<a name="l00199"></a>00199     <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">Sound::Play</a>();
<a name="l00200"></a>00200 
<a name="l00201"></a>00201     <span class="keywordflow">while</span> (myIsStreaming)
<a name="l00202"></a>00202     {
<a name="l00203"></a>00203         <span class="comment">// The stream has been interrupted !</span>
<a name="l00204"></a>00204         <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="l00205"></a>00205         {
<a name="l00206"></a>00206             <span class="keywordflow">if</span> (!RequestStop)
<a name="l00207"></a>00207             {
<a name="l00208"></a>00208                 <span class="comment">// Just continue</span>
<a name="l00209"></a>00209                 <a class="code" href="classsf_1_1SoundStream.htm#4d8437ef9a952fe3798bd239ff20d9bf" title="Start playing the audio stream.">Sound::Play</a>();
<a name="l00210"></a>00210             }
<a name="l00211"></a>00211             <span class="keywordflow">else</span>
<a name="l00212"></a>00212             {
<a name="l00213"></a>00213                 <span class="comment">// End streaming</span>
<a name="l00214"></a>00214                 myIsStreaming = <span class="keyword">false</span>;
<a name="l00215"></a>00215             }
<a name="l00216"></a>00216         }
<a name="l00217"></a>00217 
<a name="l00218"></a>00218         <span class="comment">// Get the number of buffers that have been processed (ie. ready for reuse)</span>
<a name="l00219"></a>00219         ALint NbProcessed;
<a name="l00220"></a>00220         ALCheck(alGetSourcei(Sound::mySource, AL_BUFFERS_PROCESSED, &amp;NbProcessed));
<a name="l00221"></a>00221 
<a name="l00222"></a>00222         <span class="keywordflow">while</span> (NbProcessed--)
<a name="l00223"></a>00223         {
<a name="l00224"></a>00224             <span class="comment">// Pop the first unused buffer from the queue</span>
<a name="l00225"></a>00225             ALuint Buffer;
<a name="l00226"></a>00226             ALCheck(alSourceUnqueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00227"></a>00227 
<a name="l00228"></a>00228             <span class="comment">// Retrieve its size and add it to the samples count</span>
<a name="l00229"></a>00229             <span class="keywordflow">if</span> (Buffer == EndBuffer)
<a name="l00230"></a>00230             {
<a name="l00231"></a>00231                 <span class="comment">// This was the last buffer: reset the sample count</span>
<a name="l00232"></a>00232                 mySamplesProcessed = 0;
<a name="l00233"></a>00233                 EndBuffer = 0xFFFF;
<a name="l00234"></a>00234             }
<a name="l00235"></a>00235             <span class="keywordflow">else</span>
<a name="l00236"></a>00236             {
<a name="l00237"></a>00237                 ALint Size;
<a name="l00238"></a>00238                 ALCheck(alGetBufferi(Buffer, AL_SIZE, &amp;Size));
<a name="l00239"></a>00239                 mySamplesProcessed += Size / <span class="keyword">sizeof</span>(Int16);
<a name="l00240"></a>00240             }
<a name="l00241"></a>00241 
<a name="l00242"></a>00242             <span class="comment">// Fill it and push it back into the playing queue</span>
<a name="l00243"></a>00243             <span class="keywordflow">if</span> (!RequestStop)
<a name="l00244"></a>00244             {
<a name="l00245"></a>00245                 <span class="keywordflow">if</span> (FillAndPushBuffer(Buffer))
<a name="l00246"></a>00246                 {
<a name="l00247"></a>00247                     <span class="comment">// User requested to stop: check if we must loop or really stop</span>
<a name="l00248"></a>00248                     <span class="keywordflow">if</span> (myLoop &amp;&amp; OnStart())
<a name="l00249"></a>00249                     {
<a name="l00250"></a>00250                         <span class="comment">// Looping: mark the current buffer as the last one</span>
<a name="l00251"></a>00251                         <span class="comment">// (to know when to reset the sample count)</span>
<a name="l00252"></a>00252                         EndBuffer = Buffer;
<a name="l00253"></a>00253                     }
<a name="l00254"></a>00254                     <span class="keywordflow">else</span>
<a name="l00255"></a>00255                     {
<a name="l00256"></a>00256                         <span class="comment">// Not looping or restart failed: request stop</span>
<a name="l00257"></a>00257                         RequestStop = <span class="keyword">true</span>;
<a name="l00258"></a>00258                     }
<a name="l00259"></a>00259                 }
<a name="l00260"></a>00260             }
<a name="l00261"></a>00261         }
<a name="l00262"></a>00262 
<a name="l00263"></a>00263         <span class="comment">// Leave some time for the other threads if the stream is still playing</span>
<a name="l00264"></a>00264         <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="l00265"></a>00265             Sleep(0.1f);
<a name="l00266"></a>00266     }
<a name="l00267"></a>00267 
<a name="l00268"></a>00268     <span class="comment">// Stop the playback</span>
<a name="l00269"></a>00269     <a class="code" href="classsf_1_1SoundStream.htm#53c9e9b160bcbcc89c93c1682b4525df" title="Stop playing the audio stream.">Sound::Stop</a>();
<a name="l00270"></a>00270 
<a name="l00271"></a>00271     <span class="comment">// Unqueue any buffer left in the queue</span>
<a name="l00272"></a>00272     ClearQueue();
<a name="l00273"></a>00273 
<a name="l00274"></a>00274     <span class="comment">// Delete the buffers</span>
<a name="l00275"></a>00275     ALCheck(alSourcei(Sound::mySource, AL_BUFFER, 0));
<a name="l00276"></a>00276     ALCheck(alDeleteBuffers(BuffersCount, myBuffers));
<a name="l00277"></a>00277 }
<a name="l00278"></a>00278 
<a name="l00279"></a>00279 
<a name="l00284"></a>00284 <span class="keywordtype">bool</span> SoundStream::FillAndPushBuffer(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Buffer)
<a name="l00285"></a>00285 {
<a name="l00286"></a>00286     <span class="keywordtype">bool</span> RequestStop = <span class="keyword">false</span>;
<a name="l00287"></a>00287 
<a name="l00288"></a>00288     <span class="comment">// Acquire audio data</span>
<a name="l00289"></a>00289     Chunk Data = {NULL, 0};
<a name="l00290"></a>00290     <span class="keywordflow">if</span> (!OnGetData(Data))
<a name="l00291"></a>00291         RequestStop = <span class="keyword">true</span>;
<a name="l00292"></a>00292 
<a name="l00293"></a>00293     <span class="comment">// Create and fill the buffer, and push it to the queue</span>
<a name="l00294"></a>00294     <span class="keywordflow">if</span> (Data.Samples &amp;&amp; Data.NbSamples)
<a name="l00295"></a>00295     {
<a name="l00296"></a>00296         <span class="comment">// Fill the buffer</span>
<a name="l00297"></a>00297         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="l00298"></a>00298         ALCheck(alBufferData(Buffer, myFormat, Data.Samples, Size, mySampleRate));
<a name="l00299"></a>00299 
<a name="l00300"></a>00300         <span class="comment">// Push it into the sound queue</span>
<a name="l00301"></a>00301         ALCheck(alSourceQueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00302"></a>00302     }
<a name="l00303"></a>00303 
<a name="l00304"></a>00304     <span class="keywordflow">return</span> RequestStop;
<a name="l00305"></a>00305 }
<a name="l00306"></a>00306 
<a name="l00307"></a>00307 
<a name="l00311"></a>00311 <span class="keywordtype">bool</span> SoundStream::FillQueue()
<a name="l00312"></a>00312 {
<a name="l00313"></a>00313     <span class="comment">// Fill and enqueue all the available buffers</span>
<a name="l00314"></a>00314     <span class="keywordtype">bool</span> RequestStop = <span class="keyword">false</span>;
<a name="l00315"></a>00315     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; (i &lt; BuffersCount) &amp;&amp; !RequestStop; ++i)
<a name="l00316"></a>00316     {
<a name="l00317"></a>00317         <span class="keywordflow">if</span> (FillAndPushBuffer(myBuffers[i]))
<a name="l00318"></a>00318             RequestStop = <span class="keyword">true</span>;
<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">void</span> SoundStream::ClearQueue()
<a name="l00329"></a>00329 {
<a name="l00330"></a>00330     <span class="comment">// Get the number of buffers still in the queue</span>
<a name="l00331"></a>00331     ALint NbQueued;
<a name="l00332"></a>00332     ALCheck(alGetSourcei(Sound::mySource, AL_BUFFERS_QUEUED, &amp;NbQueued));
<a name="l00333"></a>00333 
<a name="l00334"></a>00334     <span class="comment">// Unqueue them all</span>
<a name="l00335"></a>00335     ALuint Buffer;
<a name="l00336"></a>00336     <span class="keywordflow">for</span> (ALint i = 0; i &lt; NbQueued; ++i)
<a name="l00337"></a>00337         ALCheck(alSourceUnqueueBuffers(Sound::mySource, 1, &amp;Buffer));
<a name="l00338"></a>00338 }
<a name="l00339"></a>00339 
<a name="l00340"></a>00340 
<a name="l00344"></a>00344 <span class="keywordtype">bool</span> SoundStream::OnStart()
<a name="l00345"></a>00345 {
<a name="l00346"></a>00346     <span class="comment">// Does nothing by default</span>
<a name="l00347"></a>00347 
<a name="l00348"></a>00348     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00349"></a>00349 }
<a name="l00350"></a>00350 
<a name="l00351"></a>00351 } <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>