00001 
00033 #ifndef LL_AUDIOENGINE_H
00034 #define LL_AUDIOENGINE_H
00035 
00036 #include <list>
00037 #include <map>
00038 
00039 #ifndef LL_FMOD
00040 #  define LL_FMOD 1
00041 #endif
00042 
00043 #include "listener.h"
00044 #include "v3math.h"
00045 #include "v3dmath.h"
00046 #include "listener.h"
00047 #include "lltimer.h"
00048 #include "lluuid.h"
00049 #include "llframetimer.h"
00050 #include "llassettype.h"
00051 
00052 const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
00053 const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f;                      
00054 const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
00055 
00056 const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f;
00057 const F32 DEFAULT_MIN_DISTANCE = 2.0f;
00058 
00059 #define MAX_CHANNELS 30
00060 #define MAX_BUFFERS 40  // Some extra for preloading, maybe?
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 class LLVFS;
00070 
00071 class LLAudioSource;
00072 class LLAudioData;
00073 class LLAudioChannel;
00074 class LLAudioBuffer;
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 class LLAudioEngine 
00083 {
00084 public:
00085         LLAudioEngine();
00086         virtual ~LLAudioEngine();
00087 
00088         
00089         
00090 
00091         virtual BOOL init(const S32 num_channels, void *userdata);
00092         virtual void shutdown();
00093 
00094         
00095         
00096         virtual void setListener(LLVector3 pos,LLVector3 vel,LLVector3 up,LLVector3 at);
00097         virtual void updateWind(LLVector3 direction, F32 camera_height_above_water) = 0;
00098         virtual void idle(F32 max_decode_time = 0.f);
00099         virtual void updateChannels();
00100 
00101         
00102         
00103         
00104         virtual BOOL isWindEnabled();
00105         virtual void enableWind(BOOL state_b);
00106 
00107         
00108         
00109         
00110         virtual void setMuted(BOOL muted);
00111         virtual BOOL getMuted() const { return mMuted; }
00112 
00113         F32 getMasterGain();
00114         void setMasterGain(F32 gain);
00115 
00116         F32 getInternetStreamGain();
00117 
00118         virtual void setDopplerFactor(F32 factor);
00119         virtual F32 getDopplerFactor();
00120         virtual void setDistanceFactor(F32 factor);
00121         virtual F32 getDistanceFactor();
00122         virtual void setRolloffFactor(F32 factor);
00123         virtual F32 getRolloffFactor();
00124         virtual void setMaxWindGain(F32 gain);
00125 
00126 
00127         
00128         
00129         void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const LLVector3d &pos_global = LLVector3d::zero);
00130         BOOL preloadSound(const LLUUID &id);
00131 
00132         void addAudioSource(LLAudioSource *asp);
00133         void cleanupAudioSource(LLAudioSource *asp);
00134 
00135         LLAudioSource *findAudioSource(const LLUUID &source_id);
00136         LLAudioData *getAudioData(const LLUUID &audio_uuid);
00137 
00138 
00139         virtual void startInternetStream(const char* url) = 0;
00140         virtual void stopInternetStream() = 0;
00141         virtual void pauseInternetStream(int pause) = 0;
00142         virtual int isInternetStreamPlaying() = 0;
00143         virtual void getInternetStreamInfo(char* artist, char* title) { artist[0] = 0; title[0] = 0; }
00144         
00145         virtual void setInternetStreamGain(F32 vol) { mInternetStreamGain = vol; }
00146         virtual const char* getInternetStreamURL() { return ""; }
00147 
00148         
00149         virtual LLVector3 getListenerPos();
00150 
00151         LLAudioBuffer *getFreeBuffer(); 
00152         LLAudioChannel *getFreeChannel(const F32 priority); 
00153         void cleanupBuffer(LLAudioBuffer *bufferp);
00154 
00155         BOOL hasDecodedFile(const LLUUID &uuid);
00156         BOOL hasLocalFile(const LLUUID &uuid);
00157 
00158         BOOL updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid = LLUUID::null);
00159 
00160 
00161         
00162         void startNextTransfer();
00163         static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
00164 
00165 
00166         friend class LLPipeline; 
00167 public:
00168         F32 mMaxWindGain; 
00169 
00170 protected:
00171         virtual LLAudioBuffer *createBuffer() = 0;
00172         virtual LLAudioChannel *createChannel() = 0;
00173 
00174         virtual void initWind() = 0;
00175         virtual void cleanupWind() = 0;
00176         virtual void setInternalGain(F32 gain) = 0;
00177 
00178         void commitDeferredChanges();
00179 
00180         virtual void allocateListener() = 0;
00181 
00182 
00183         
00184         virtual void initInternetStream() {}
00185         virtual void updateInternetStream() {}
00186 
00187 
00188         
00189         virtual void setListenerPos(LLVector3 vec);
00190         virtual void setListenerVelocity(LLVector3 vec);
00191         virtual void orientListener(LLVector3 up, LLVector3 at);
00192         virtual void translateListener(LLVector3 vec);
00193 
00194 
00195         F64 mapWindVecToGain(LLVector3 wind_vec);
00196         F64 mapWindVecToPitch(LLVector3 wind_vec);
00197         F64 mapWindVecToPan(LLVector3 wind_vec);
00198 
00199 protected:
00200         LLListener *mListenerp;
00201 
00202         BOOL mMuted;
00203         void* mUserData;
00204 
00205         S32 mLastStatus;
00206         
00207         S32 mNumChannels;
00208         BOOL mEnableWind;
00209 
00210         LLUUID mCurrentTransfer; 
00211         LLFrameTimer mCurrentTransferTimer;
00212 
00213         
00214         
00215         
00216         typedef std::map<LLUUID, LLAudioSource *> source_map;
00217         typedef std::map<LLUUID, LLAudioData *> data_map;
00218 
00219         source_map mAllSources;
00220         data_map mAllData;
00221 
00222         LLAudioChannel *mChannels[MAX_CHANNELS];
00223 
00224         
00225         
00226         LLAudioBuffer *mBuffers[MAX_BUFFERS];
00227         
00228         F32 mMasterGain;
00229 
00230         
00231         F32 mInternetStreamGain;
00232 
00233         F32 mNextWindUpdate;
00234 
00235         LLFrameTimer mWindUpdateTimer;
00236 };
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 class LLAudioSource
00247 {
00248 public:
00249         
00250         
00251         LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain);
00252         virtual ~LLAudioSource();
00253 
00254         virtual void update();                                          
00255         void updatePriority();
00256 
00257         void preload(const LLUUID &audio_id); 
00258 
00259         void addAudioData(LLAudioData *adp, BOOL set_current = TRUE);
00260 
00261         void setAmbient(const BOOL ambient)                                             { mAmbient = ambient; }
00262         BOOL isAmbient() const                                                                  { return mAmbient; }
00263 
00264         void setLoop(const BOOL loop)                                                   { mLoop = loop; }
00265         BOOL isLoop() const                                                                             { return mLoop; }
00266 
00267         void setSyncMaster(const BOOL master)                                   { mSyncMaster = master; }
00268         BOOL isSyncMaster() const                                                               { return mSyncMaster; }
00269 
00270         void setSyncSlave(const BOOL slave)                                             { mSyncSlave = slave; }
00271         BOOL isSyncSlave() const                                                                { return mSyncSlave; }
00272 
00273         void setQueueSounds(const BOOL queue)                                   { mQueueSounds = queue; }
00274         BOOL isQueueSounds() const                                                              { return mQueueSounds; }
00275 
00276         void setPlayedOnce(const BOOL played_once)                              { mPlayedOnce = played_once; }
00277 
00278         void setPositionGlobal(const LLVector3d &position_global)               { mPositionGlobal = position_global; }
00279         LLVector3d getPositionGlobal() const                                                    { return mPositionGlobal; }
00280         LLVector3 getVelocity() const                                                                   { return mVelocity; }                           
00281         F32 getPriority() const                                                                                 { return mPriority; }
00282 
00283         
00284         F32 getGain() const                                                                                             { return mGain; }
00285         virtual void setGain(const F32 gain)                                                    { mGain = llclamp(gain, 0.f, 1.f); }
00286 
00287         const LLUUID &getID() const             { return mID; }
00288         BOOL isDone();
00289 
00290         LLAudioData *getCurrentData();
00291         LLAudioData *getQueuedData();
00292         LLAudioBuffer *getCurrentBuffer();
00293 
00294         BOOL setupChannel();
00295         BOOL play(const LLUUID &audio_id);      
00296 
00297         const LLUUID &getOwnerID()              { return mOwnerID; }
00298         BOOL hasPendingPreloads() const;        
00299 
00300         friend class LLAudioEngine;
00301         friend class LLAudioChannel;
00302 protected:
00303         void setChannel(LLAudioChannel *channelp);
00304         LLAudioChannel *getChannel() const                                              { return mChannelp; }
00305 
00306 protected:
00307         LLUUID                  mID; 
00308         LLUUID                  mOwnerID;       
00309         F32                             mPriority;
00310         F32                             mGain;
00311         BOOL                    mAmbient;
00312         BOOL                    mLoop;
00313         BOOL                    mSyncMaster;
00314         BOOL                    mSyncSlave;
00315         BOOL                    mQueueSounds;
00316         BOOL                    mPlayedOnce;
00317         LLVector3d              mPositionGlobal;
00318         LLVector3               mVelocity;
00319 
00320         
00321         LLAudioChannel  *mChannelp;             
00322         LLAudioData             *mCurrentDatap;
00323         LLAudioData             *mQueuedDatap;
00324 
00325         typedef std::map<LLUUID, LLAudioData *> data_map;
00326         data_map mPreloadMap;
00327 
00328         LLFrameTimer mAgeTimer;
00329 };
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 class LLAudioData
00342 {
00343 public:
00344         LLAudioData(const LLUUID &uuid);
00345         BOOL load();
00346 
00347         LLUUID getID() const                            { return mID; }
00348         LLAudioBuffer *getBuffer() const        { return mBufferp; }
00349 
00350         BOOL    hasLocalData() const            { return mHasLocalData; }
00351         BOOL    hasDecodedData() const          { return mHasDecodedData; }
00352         BOOL    hasValidData() const            { return mHasValidData; }
00353 
00354         void    setHasLocalData(const BOOL hld)         { mHasLocalData = hld; }
00355         void    setHasDecodedData(const BOOL hdd)       { mHasDecodedData = hdd; }
00356         void    setHasValidData(const BOOL hvd)         { mHasValidData = hvd; }
00357 
00358         friend class LLAudioEngine; 
00359 
00360 protected:
00361         LLUUID mID;
00362         LLAudioBuffer *mBufferp;        
00363         BOOL mHasLocalData;
00364         BOOL mHasDecodedData;
00365         BOOL mHasValidData;
00366 };
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 class LLAudioChannel
00377 {
00378 public:
00379         LLAudioChannel();
00380         virtual ~LLAudioChannel();
00381 
00382         virtual void setSource(LLAudioSource *sourcep);
00383         LLAudioSource *getSource() const                        { return mCurrentSourcep; }
00384 
00385         friend class LLAudioEngine;
00386         friend class LLAudioSource;
00387 protected:
00388         virtual void play() = 0;
00389         virtual void playSynced(LLAudioChannel *channelp) = 0;
00390         virtual void cleanup() = 0;
00391         virtual BOOL isPlaying() = 0;
00392         void setWaiting(const BOOL waiting)                     { mWaiting = waiting; }
00393         BOOL isWaiting() const                                          { return mWaiting; }
00394 
00395         virtual BOOL updateBuffer(); 
00396         virtual void update3DPosition() = 0;
00397         virtual void updateLoop() = 0; 
00398 protected:
00399         LLAudioSource   *mCurrentSourcep;
00400         LLAudioBuffer   *mCurrentBufferp;
00401         BOOL                    mLoopedThisFrame;
00402         BOOL                    mWaiting;       
00403 };
00404 
00405 
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 class LLAudioBuffer
00414 {
00415 public:
00416         virtual ~LLAudioBuffer() {};
00417         virtual BOOL loadWAV(const char *filename) = 0;
00418         virtual U32 getLength() = 0;
00419 
00420         friend class LLAudioEngine;
00421         friend class LLAudioChannel;
00422         friend class LLAudioData;
00423 protected:
00424         BOOL mInUse;
00425         LLAudioData *mAudioDatap;
00426         LLFrameTimer mLastUseTimer;
00427 };
00428 
00429 
00430 
00431 extern LLAudioEngine* gAudiop;
00432 
00433 #endif