SoundStream.hpp
1 //
3 // SFML - Simple and Fast Multimedia Library
4 // Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
5 //
6 // This software is provided 'as-is', without any express or implied warranty.
7 // In no event will the authors be held liable for any damages arising from the use of this software.
8 //
9 // Permission is granted to anyone to use this software for any purpose,
10 // including commercial applications, and to alter it and redistribute it freely,
11 // subject to the following restrictions:
12 //
13 // 1. The origin of this software must not be misrepresented;
14 // you must not claim that you wrote the original software.
15 // If you use this software in a product, an acknowledgment
16 // in the product documentation would be appreciated but is not required.
17 //
18 // 2. Altered source versions must be plainly marked as such,
19 // and must not be misrepresented as being the original software.
20 //
21 // 3. This notice may not be removed or altered from any source distribution.
22 //
24 
25 #ifndef SFML_SOUNDSTREAM_HPP
26 #define SFML_SOUNDSTREAM_HPP
27 
29 // Headers
31 #include <SFML/Audio/Export.hpp>
32 #include <SFML/Audio/SoundSource.hpp>
33 #include <SFML/System/Thread.hpp>
34 #include <SFML/System/Time.hpp>
35 #include <SFML/System/Mutex.hpp>
36 #include <cstdlib>
37 
38 
39 namespace sf
40 {
45 class SFML_AUDIO_API SoundStream : public SoundSource
46 {
47 public:
48 
53  struct Chunk
54  {
55  const Int16* samples;
56  std::size_t sampleCount;
57  };
58 
63  virtual ~SoundStream();
64 
77  void play();
78 
88  void pause();
89 
100  void stop();
101 
110  unsigned int getChannelCount() const;
111 
121  unsigned int getSampleRate() const;
122 
129  Status getStatus() const;
130 
144  void setPlayingOffset(Time timeOffset);
145 
155 
169  void setLoop(bool loop);
170 
179  bool getLoop() const;
180 
181 protected:
182 
183  enum
184  {
185  NoLoop = -1
186  };
187 
195 
210  void initialize(unsigned int channelCount, unsigned int sampleRate);
211 
229  virtual bool onGetData(Chunk& data) = 0;
230 
240  virtual void onSeek(Time timeOffset) = 0;
241 
252  virtual Int64 onLoop();
253 
254 private:
255 
263  void streamData();
264 
279  bool fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop = false);
280 
290  bool fillQueue();
291 
298  void clearQueue();
299 
300  enum
301  {
302  BufferCount = 3,
303  BufferRetries = 2
304  };
305 
307  // Member data
309  Thread m_thread;
310  mutable Mutex m_threadMutex;
311  Status m_threadStartState;
312  bool m_isStreaming;
313  unsigned int m_buffers[BufferCount];
314  unsigned int m_channelCount;
315  unsigned int m_sampleRate;
316  Uint32 m_format;
317  bool m_loop;
318  Uint64 m_samplesProcessed;
319  Int64 m_bufferSeeks[BufferCount];
320 };
321 
322 } // namespace sf
323 
324 
325 #endif // SFML_SOUNDSTREAM_HPP
326 
327 
Blocks concurrent access to shared resources from multiple threads.
Definition: Mutex.hpp:48
Base class defining a sound's properties.
Definition: SoundSource.hpp:43
Status
Enumeration of the sound source states.
Definition: SoundSource.hpp:51
Abstract base class for streamed audio sources.
Definition: SoundStream.hpp:46
void stop()
Stop playing the audio stream.
unsigned int getChannelCount() const
Return the number of channels of the stream.
virtual ~SoundStream()
Destructor.
virtual Int64 onLoop()
Change the current playing position in the stream source to the beginning of the loop.
void setLoop(bool loop)
Set whether or not the stream should loop after reaching the end.
bool getLoop() const
Tell whether or not the stream is in loop mode.
Status getStatus() const
Get the current status of the stream (stopped, paused, playing)
SoundStream()
Default constructor.
unsigned int getSampleRate() const
Get the stream sample rate of the stream.
virtual void onSeek(Time timeOffset)=0
Change the current playing position in the stream source.
void pause()
Pause the audio stream.
virtual bool onGetData(Chunk &data)=0
Request a new chunk of audio samples from the stream source.
void initialize(unsigned int channelCount, unsigned int sampleRate)
Define the audio stream parameters.
Time getPlayingOffset() const
Get the current playing position of the stream.
void setPlayingOffset(Time timeOffset)
Change the current playing position of the stream.
void play()
Start or resume playing the audio stream.
Utility class to manipulate threads.
Definition: Thread.hpp:49
Represents a time value.
Definition: Time.hpp:41
Structure defining a chunk of audio data to stream.
Definition: SoundStream.hpp:54
const Int16 * samples
Pointer to the audio samples.
Definition: SoundStream.hpp:55
std::size_t sampleCount
Number of samples pointed by Samples.
Definition: SoundStream.hpp:56