Source.h

Go to the documentation of this file.
00001 
00002 //Luke Lenhart, 2008
00003 //See /docs/License.txt for details on how this code may be used.
00004 
00005 #pragma once
00006 
00007 #include "../base/Setup.h"
00008 
00009 #ifdef MPMA_COMPILE_AUDIO
00010 
00011 #include "../base/Types.h"
00012 #include "../base/ReferenceCount.h"
00013 #include "../base/Locks.h"
00014 
00015 #include <string>
00016 
00017 //forward declarations
00018 struct OggVorbis_File;
00019 
00020 namespace AUDIO
00021 {
00023     const nuint FINITE_DATA=(nuint)(0-2);
00025     const nuint INFINITE_DATA=(nuint)(0-1);
00026 
00028     class Source
00029     {
00030     public:
00031         Source();
00032         virtual ~Source();
00033 
00035         virtual nuint FillData(void *data, nuint maxSamples)=0;
00036 
00038         virtual nuint GetRemainingSamples() const=0;
00039 
00041         virtual bool IsStereo() const=0;
00042 
00044         virtual nuint GetSampleRate() const=0;
00045 
00047         virtual void Seek(nuint sampleNumber=0);
00048 
00050         virtual Source* Duplicate()=0;
00051 
00053         virtual void FreeDuplicate(Source *source)=0;
00054 
00056         inline nuint GetSampleSize() const
00057             { return IsStereo()?4:2; }
00058     };
00059 
00060 
00061     // -- below are a several convenient implementations of Source
00062 
00063     //used by LoopSource to store its state.
00064     struct SharedLoopSourceData
00065     {
00066         Source *source;
00067         nuint loopStart;
00068         nuint loopEnd;
00069         nuint currentSample;
00070 
00071         inline SharedLoopSourceData(): source(0)
00072         {}
00073         ~SharedLoopSourceData();
00074     };
00075 
00077     class LoopSource: public Source, public MPMA::ReferenceCountedData<SharedLoopSourceData>
00078     {
00079     public:
00081         LoopSource(Source &source, nuint loopStartSample=0, nuint loopEndSample=~0);
00082 
00083         virtual nuint FillData(void *data, nuint maxSamples);
00084         inline nuint GetRemainingSamples() const { return INFINITE_DATA; }
00085         inline bool IsStereo() const { return Data().source->IsStereo(); }
00086         inline nuint GetSampleRate() const { return Data().source->GetSampleRate(); }
00087         virtual LoopSource* Duplicate();
00088         virtual void FreeDuplicate(Source *source);
00089     };
00090 
00091     //used by WavFileSource to store its state.
00092     struct SharedWavFileSourceData
00093     {
00094         inline SharedWavFileSourceData(): fileHandle(0), rate(0), sourceBits(0), isStereo(false), dataStartSeekPos(0), hitEof(false), bad(0)
00095             {}
00096 
00097         void *fileHandle;
00098         std::string filename;
00099         nuint rate;
00100         nuint sourceBits;
00101         bool isStereo;
00102         nuint dataStartSeekPos;
00103 
00104         bool hitEof;
00105 
00106         Source *bad; //bad source to use if we failed to load
00107         MPMA::SpinLock lock;
00108     };
00109 
00111     class WavFileSource: public Source, public MPMA::ReferenceCountedData<SharedWavFileSourceData>
00112     {
00113     public:
00115         WavFileSource(const std::string &filename);
00116         virtual ~WavFileSource();
00117 
00119         inline bool IsLoaded() const
00120             { return Data().fileHandle!=0; }
00121 
00122         virtual nuint FillData(void *data, nuint maxSamples);
00123         virtual nuint GetRemainingSamples() const;
00124         virtual bool IsStereo() const;
00125         virtual nuint GetSampleRate() const;
00126         virtual WavFileSource* Duplicate();
00127         virtual void FreeDuplicate(Source *source);
00128         virtual void Seek(nuint sampleNumber=0);
00129 
00130     private:
00131         void LoadFailed();
00132     };
00133 
00134 #ifdef AUDIO_OGG_VORBIS_ENABLED
00135     //used by VorbisFileSource to store its state.
00136     struct SharedVorbisFileSourceData
00137     {
00138         inline SharedVorbisFileSourceData(): vorbisFile(0), rate(0), sourceBits(0), isStereo(false), hitEof(false), bad(0)
00139             {}
00140 
00141         OggVorbis_File *vorbisFile;
00142         std::string filename;
00143         nuint rate;
00144         nuint sourceBits;
00145         bool isStereo;
00146 
00147         bool hitEof;
00148 
00149         Source *bad; //bad source to use if we failed to load
00150         MPMA::SpinLock lock;
00151     };
00152 
00154     class VorbisFileSource: public Source, public MPMA::ReferenceCountedData<SharedVorbisFileSourceData>
00155     {
00156     public:
00158         VorbisFileSource(const std::string &filename);
00159         virtual ~VorbisFileSource();
00160 
00162         inline bool IsLoaded() const
00163             { return Data().vorbisFile!=0; }
00164 
00165         virtual nuint FillData(void *data, nuint maxSamples);
00166         virtual nuint GetRemainingSamples() const;
00167         virtual bool IsStereo() const;
00168         virtual nuint GetSampleRate() const;
00169         virtual VorbisFileSource* Duplicate();
00170         virtual void FreeDuplicate(Source *source);
00171         virtual void Seek(nuint sampleNumber=0);
00172     };
00173 #endif
00174 
00175 #ifdef AUDIO_OGG_FLAC_ENABLED
00176     class InternalMpmaFlacDecoder;
00177 
00178     //used by FlacFileSource to store its state.
00179     struct SharedFlacFileSourceData
00180     {
00181         inline SharedFlacFileSourceData(): flac(0), hitEof(false), bad(0)
00182             {}
00183 
00184         InternalMpmaFlacDecoder *flac;
00185         std::string filename;
00186 
00187         bool hitEof;
00188 
00189         Source *bad; //bad source to use if we failed to load
00190         MPMA::SpinLock lock;
00191     };
00192 
00194     class FlacFileSource: public Source, public MPMA::ReferenceCountedData<SharedFlacFileSourceData>
00195     {
00196     public:
00198         FlacFileSource(const std::string &filename);
00199         virtual ~FlacFileSource();
00200 
00202         inline bool IsLoaded() const
00203             { return Data().flac!=0; }
00204 
00205         virtual nuint FillData(void *data, nuint maxSamples);
00206         virtual nuint GetRemainingSamples() const;
00207         virtual bool IsStereo() const;
00208         virtual nuint GetSampleRate() const;
00209         virtual FlacFileSource* Duplicate();
00210         virtual void FreeDuplicate(Source *source);
00211         virtual void Seek(nuint sampleNumber=0);
00212     };
00213 #endif
00214 
00215     //used by MonoToStereoSource to store its state
00216     struct SharedMonoToStereoSourceData
00217     {
00218         Source *sourceL, *sourceR;
00219 
00220         inline SharedMonoToStereoSourceData(): sourceL(0), sourceR(0)
00221             {}
00222         inline ~SharedMonoToStereoSourceData()
00223         {
00224             if (sourceL) sourceL->FreeDuplicate(sourceL);
00225             if (sourceR) sourceR->FreeDuplicate(sourceR);
00226         }
00227     };
00228 
00230     class MonoToStereoSource: public Source, public MPMA::ReferenceCountedData<SharedMonoToStereoSourceData>
00231     {
00232     public:
00234         MonoToStereoSource(Source &sourceLeft, Source &sourceRight);
00235 
00236         virtual nuint FillData(void *data, nuint maxSamples);
00237         virtual nuint GetRemainingSamples() const;
00238         virtual bool IsStereo() const;
00239         virtual nuint GetSampleRate() const;
00240         virtual MonoToStereoSource* Duplicate();
00241         virtual void FreeDuplicate(Source *source);
00242         virtual void Seek(nuint sampleNumber=0);
00243     };
00244 
00246     class EmptySource: public Source
00247     {
00248     public:
00249         virtual nuint FillData(void *data, nuint maxSamples);
00250         virtual nuint GetRemainingSamples() const;
00251         virtual bool IsStereo() const;
00252         virtual nuint GetSampleRate() const;
00253         virtual EmptySource* Duplicate();
00254         virtual void FreeDuplicate(Source *source);
00255     };
00256 
00258     class WhiteNoiseSource: public Source
00259     {
00260     public:
00262         WhiteNoiseSource(float seconds=0, nuint sampleRate=44100);
00263 
00264         virtual nuint FillData(void *data, nuint maxSamples);
00265         virtual nuint GetRemainingSamples() const;
00266         virtual bool IsStereo() const;
00267         virtual nuint GetSampleRate() const;
00268         virtual WhiteNoiseSource* Duplicate();
00269         virtual void FreeDuplicate(Source *source);
00270         virtual void Seek(nuint sampleNumber=0);
00271 
00272     private:
00273         nuint samplesRemaining;
00274         nuint rate;
00275         float origTimeLeft;
00276         uint32 lastSample;
00277     };
00278 }
00279 
00280 #endif //#ifdef MPMA_COMPILE_AUDIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends