Go to the documentation of this file.00001
00002
00003
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
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
00062
00063
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
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;
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
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;
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
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;
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
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