SoundStream.hpp
00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00025 #ifndef SFML_SOUNDSTREAM_HPP
00026 #define SFML_SOUNDSTREAM_HPP
00027 
00029 // Headers
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     // Member data
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 } // namespace sf
00294 
00295 
00296 #endif // SFML_SOUNDSTREAM_HPP
00297 
00298