00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025 #ifndef SFML_SOUNDSTREAM_HPP
00026 #define SFML_SOUNDSTREAM_HPP
00027
00029
00031 #include <SFML/Audio/SoundSource.hpp>
00032 #include <SFML/System/Thread.hpp>
00033 #include <cstdlib>
00034
00035
00036 namespace sf
00037 {
00042 class SFML_API SoundStream : public SoundSource
00043 {
00044 public :
00045
00050 struct Chunk
00051 {
00052 const Int16* Samples;
00053 std::size_t NbSamples;
00054 };
00055
00060 virtual ~SoundStream();
00061
00074 void Play();
00075
00085 void Pause();
00086
00097 void Stop();
00098
00107 unsigned int GetChannelsCount() const;
00108
00118 unsigned int GetSampleRate() const;
00119
00126 Status GetStatus() const;
00127
00139 void SetPlayingOffset(Uint32 timeOffset);
00140
00149 Uint32 GetPlayingOffset() const;
00150
00164 void SetLoop(bool loop);
00165
00174 bool GetLoop() const;
00175
00176 protected :
00177
00184 SoundStream();
00185
00200 void Initialize(unsigned int channelsCount, unsigned int sampleRate);
00201
00202 private :
00203
00211 void Stream();
00212
00227 virtual bool OnGetData(Chunk& data) = 0;
00228
00238 virtual void OnSeek(Uint32 timeOffset) = 0;
00239
00253 bool FillAndPushBuffer(unsigned int bufferNum);
00254
00264 bool FillQueue();
00265
00272 void ClearQueue();
00273
00274 enum
00275 {
00276 BuffersCount = 3
00277 };
00278
00280
00282 Thread myThread;
00283 bool myIsStreaming;
00284 unsigned int myBuffers[BuffersCount];
00285 unsigned int myChannelsCount;
00286 unsigned int mySampleRate;
00287 unsigned long myFormat;
00288 bool myLoop;
00289 Uint64 mySamplesProcessed;
00290 bool myEndBuffers[BuffersCount];
00291 };
00292
00293 }
00294
00295
00296 #endif // SFML_SOUNDSTREAM_HPP
00297
00298