llaudioengine.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:14k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file audioengine.h
  3.  * @brief Definition of LLAudioEngine base class abstracting the audio support
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_AUDIOENGINE_H
  33. #define LL_AUDIOENGINE_H
  34. #include <list>
  35. #include <map>
  36. #include "v3math.h"
  37. #include "v3dmath.h"
  38. #include "lltimer.h"
  39. #include "lluuid.h"
  40. #include "llframetimer.h"
  41. #include "llassettype.h"
  42. #include "lllistener.h"
  43. const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
  44. const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f; //  How much sounds are weaker under water
  45. const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
  46. const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f;
  47. const F32 DEFAULT_MIN_DISTANCE = 2.0f;
  48. #define MAX_CHANNELS 30
  49. #define MAX_BUFFERS 40 // Some extra for preloading, maybe?
  50. // This define is intended to allow us to switch from os based wav
  51. // file loading to vfs based wav file loading. The problem is that I
  52. // am unconvinced that the LLWaveFile works for loading sounds from
  53. // memory. So, until that is fixed up, changed, whatever, this remains
  54. // undefined.
  55. //#define USE_WAV_VFILE
  56. class LLVFS;
  57. class LLAudioSource;
  58. class LLAudioData;
  59. class LLAudioChannel;
  60. class LLAudioChannelOpenAL;
  61. class LLAudioBuffer;
  62. class LLStreamingAudioInterface;
  63. //
  64. //  LLAudioEngine definition
  65. //
  66. class LLAudioEngine 
  67. {
  68. friend class LLAudioChannelOpenAL; // bleh. channel needs some listener methods.
  69. public:
  70. enum LLAudioType
  71. {
  72. AUDIO_TYPE_NONE    = 0,
  73. AUDIO_TYPE_SFX     = 1,
  74. AUDIO_TYPE_UI      = 2,
  75. AUDIO_TYPE_AMBIENT = 3,
  76. AUDIO_TYPE_COUNT   = 4 // last
  77. };
  78. enum LLAudioPlayState
  79. {
  80. // isInternetStreamPlaying() returns an *int*, with
  81. // 0 = stopped, 1 = playing, 2 = paused.
  82. AUDIO_STOPPED = 0,
  83. AUDIO_PLAYING = 1,
  84. AUDIO_PAUSED = 2
  85. };
  86. LLAudioEngine();
  87. virtual ~LLAudioEngine();
  88. // initialization/startup/shutdown
  89. virtual bool init(const S32 num_channels, void *userdata);
  90. virtual std::string getDriverName(bool verbose) = 0;
  91. virtual void shutdown();
  92. // Used by the mechanics of the engine
  93. //virtual void processQueue(const LLUUID &sound_guid);
  94. virtual void setListener(LLVector3 pos,LLVector3 vel,LLVector3 up,LLVector3 at);
  95. virtual void updateWind(LLVector3 direction, F32 camera_height_above_water) = 0;
  96. virtual void idle(F32 max_decode_time = 0.f);
  97. virtual void updateChannels();
  98. //
  99. // "End user" functionality
  100. //
  101. virtual bool isWindEnabled();
  102. virtual void enableWind(bool state_b);
  103. // Use these for temporarily muting the audio system.
  104. // Does not change buffers, initialization, etc. but
  105. // stops playing new sounds.
  106. virtual void setMuted(bool muted);
  107. virtual bool getMuted() const { return mMuted; }
  108. #ifdef USE_PLUGIN_MEDIA
  109. LLPluginClassMedia* initializeMedia(const std::string& media_type);
  110. #endif
  111. F32 getMasterGain();
  112. void setMasterGain(F32 gain);
  113. F32 getSecondaryGain(S32 type);
  114. void setSecondaryGain(S32 type, F32 gain);
  115. F32 getInternetStreamGain();
  116. virtual void setDopplerFactor(F32 factor);
  117. virtual F32 getDopplerFactor();
  118. virtual void setRolloffFactor(F32 factor);
  119. virtual F32 getRolloffFactor();
  120. virtual void setMaxWindGain(F32 gain);
  121. // Methods actually related to setting up and removing sounds
  122. // Owner ID is the owner of the object making the request
  123. void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
  124.   const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
  125.   const LLVector3d &pos_global = LLVector3d::zero);
  126. bool preloadSound(const LLUUID &id);
  127. void addAudioSource(LLAudioSource *asp);
  128. void cleanupAudioSource(LLAudioSource *asp);
  129. LLAudioSource *findAudioSource(const LLUUID &source_id);
  130. LLAudioData *getAudioData(const LLUUID &audio_uuid);
  131. // Internet stream implementation manipulation
  132. LLStreamingAudioInterface *getStreamingAudioImpl();
  133. void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
  134. // Internet stream methods - these will call down into the *mStreamingAudioImpl if it exists
  135. void startInternetStream(const std::string& url);
  136. void stopInternetStream();
  137. void pauseInternetStream(int pause);
  138. void updateInternetStream(); // expected to be called often
  139. LLAudioPlayState isInternetStreamPlaying();
  140. // use a value from 0.0 to 1.0, inclusive
  141. void setInternetStreamGain(F32 vol);
  142. std::string getInternetStreamURL();
  143. // For debugging usage
  144. virtual LLVector3 getListenerPos();
  145. LLAudioBuffer *getFreeBuffer(); // Get a free buffer, or flush an existing one if you have to.
  146. LLAudioChannel *getFreeChannel(const F32 priority); // Get a free channel or flush an existing one if your priority is higher
  147. void cleanupBuffer(LLAudioBuffer *bufferp);
  148. bool hasDecodedFile(const LLUUID &uuid);
  149. bool hasLocalFile(const LLUUID &uuid);
  150. bool updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid = LLUUID::null);
  151. // Asset callback when we're retrieved a sound from the asset server.
  152. void startNextTransfer();
  153. static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
  154. friend class LLPipeline; // For debugging
  155. public:
  156. F32 mMaxWindGain; // Hack.  Public to set before fade in?
  157. protected:
  158. virtual LLAudioBuffer *createBuffer() = 0;
  159. virtual LLAudioChannel *createChannel() = 0;
  160. virtual void initWind() = 0;
  161. virtual void cleanupWind() = 0;
  162. virtual void setInternalGain(F32 gain) = 0;
  163. void commitDeferredChanges();
  164. virtual void allocateListener() = 0;
  165. // listener methods
  166. virtual void setListenerPos(LLVector3 vec);
  167. virtual void setListenerVelocity(LLVector3 vec);
  168. virtual void orientListener(LLVector3 up, LLVector3 at);
  169. virtual void translateListener(LLVector3 vec);
  170. F64 mapWindVecToGain(LLVector3 wind_vec);
  171. F64 mapWindVecToPitch(LLVector3 wind_vec);
  172. F64 mapWindVecToPan(LLVector3 wind_vec);
  173. protected:
  174. LLListener *mListenerp;
  175. bool mMuted;
  176. void* mUserData;
  177. S32 mLastStatus;
  178. S32 mNumChannels;
  179. bool mEnableWind;
  180. LLUUID mCurrentTransfer; // Audio file currently being transferred by the system
  181. LLFrameTimer mCurrentTransferTimer;
  182. // A list of all audio sources that are known to the viewer at this time.
  183. // This is most likely a superset of the ones that we actually have audio
  184. // data for, or are playing back.
  185. typedef std::map<LLUUID, LLAudioSource *> source_map;
  186. typedef std::map<LLUUID, LLAudioData *> data_map;
  187. source_map mAllSources;
  188. data_map mAllData;
  189. LLAudioChannel *mChannels[MAX_CHANNELS];
  190. // Buffers needs to change into a different data structure, as the number of buffers
  191. // that we have active should be limited by RAM usage, not count.
  192. LLAudioBuffer *mBuffers[MAX_BUFFERS];
  193. F32 mMasterGain;
  194. F32 mSecondaryGain[AUDIO_TYPE_COUNT];
  195. F32 mNextWindUpdate;
  196. LLFrameTimer mWindUpdateTimer;
  197. private:
  198. void setDefaults();
  199. LLStreamingAudioInterface *mStreamingAudioImpl;
  200. };
  201. //
  202. // Standard audio source.  Can be derived from for special sources, such as those attached to objects.
  203. //
  204. class LLAudioSource
  205. {
  206. public:
  207. // owner_id is the id of the agent responsible for making this sound
  208. // play, for example, the owner of the object currently playing it
  209. LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain, const S32 type = LLAudioEngine::AUDIO_TYPE_NONE);
  210. virtual ~LLAudioSource();
  211. virtual void update(); // Update this audio source
  212. void updatePriority();
  213. void preload(const LLUUID &audio_id); // Only used for preloading UI sounds, now.
  214. void addAudioData(LLAudioData *adp, bool set_current = TRUE);
  215. void setAmbient(const bool ambient) { mAmbient = ambient; }
  216. bool isAmbient() const { return mAmbient; }
  217. void setLoop(const bool loop) { mLoop = loop; }
  218. bool isLoop() const { return mLoop; }
  219. void setSyncMaster(const bool master) { mSyncMaster = master; }
  220. bool isSyncMaster() const { return mSyncMaster; }
  221. void setSyncSlave(const bool slave) { mSyncSlave = slave; }
  222. bool isSyncSlave() const { return mSyncSlave; }
  223. void setQueueSounds(const bool queue) { mQueueSounds = queue; }
  224. bool isQueueSounds() const { return mQueueSounds; }
  225. void setPlayedOnce(const bool played_once) { mPlayedOnce = played_once; }
  226. void setType(S32 type)                                  { mType = type; }
  227. S32 getType()                                           { return mType; }
  228. void setPositionGlobal(const LLVector3d &position_global) { mPositionGlobal = position_global; }
  229. LLVector3d getPositionGlobal() const { return mPositionGlobal; }
  230. LLVector3 getVelocity() const { return mVelocity; }
  231. F32 getPriority() const { return mPriority; }
  232. // Gain should always be clamped between 0 and 1.
  233. F32 getGain() const { return mGain; }
  234. virtual void setGain(const F32 gain) { mGain = llclamp(gain, 0.f, 1.f); }
  235. const LLUUID &getID() const { return mID; }
  236. bool isDone();
  237. LLAudioData *getCurrentData();
  238. LLAudioData *getQueuedData();
  239. LLAudioBuffer *getCurrentBuffer();
  240. bool setupChannel();
  241. bool play(const LLUUID &audio_id); // Start the audio source playing
  242. bool hasPendingPreloads() const; // Has preloads that haven't been done yet
  243. friend class LLAudioEngine;
  244. friend class LLAudioChannel;
  245. protected:
  246. void setChannel(LLAudioChannel *channelp);
  247. LLAudioChannel *getChannel() const { return mChannelp; }
  248. protected:
  249. LLUUID mID; // The ID of the source is that of the object if it's attached to an object.
  250. LLUUID mOwnerID; // owner of the object playing the sound
  251. F32 mPriority;
  252. F32 mGain;
  253. bool mAmbient;
  254. bool mLoop;
  255. bool mSyncMaster;
  256. bool mSyncSlave;
  257. bool mQueueSounds;
  258. bool mPlayedOnce;
  259. S32             mType;
  260. LLVector3d mPositionGlobal;
  261. LLVector3 mVelocity;
  262. //LLAudioSource *mSyncMasterp; // If we're a slave, the source that we're synced to.
  263. LLAudioChannel *mChannelp; // If we're currently playing back, this is the channel that we're assigned to.
  264. LLAudioData *mCurrentDatap;
  265. LLAudioData *mQueuedDatap;
  266. typedef std::map<LLUUID, LLAudioData *> data_map;
  267. data_map mPreloadMap;
  268. LLFrameTimer mAgeTimer;
  269. };
  270. //
  271. // Generic metadata about a particular piece of audio data.
  272. // The actual data is handled by the derived LLAudioBuffer classes which are
  273. // derived for each audio engine.
  274. //
  275. class LLAudioData
  276. {
  277. public:
  278. LLAudioData(const LLUUID &uuid);
  279. bool load();
  280. LLUUID getID() const { return mID; }
  281. LLAudioBuffer *getBuffer() const { return mBufferp; }
  282. bool hasLocalData() const { return mHasLocalData; }
  283. bool hasDecodedData() const { return mHasDecodedData; }
  284. bool hasValidData() const { return mHasValidData; }
  285. void setHasLocalData(const bool hld) { mHasLocalData = hld; }
  286. void setHasDecodedData(const bool hdd) { mHasDecodedData = hdd; }
  287. void setHasValidData(const bool hvd) { mHasValidData = hvd; }
  288. friend class LLAudioEngine; // Severe laziness, bad.
  289. protected:
  290. LLUUID mID;
  291. LLAudioBuffer *mBufferp; // If this data is being used by the audio system, a pointer to the buffer will be set here.
  292. bool mHasLocalData;
  293. bool mHasDecodedData;
  294. bool mHasValidData;
  295. };
  296. //
  297. // Base class for an audio channel, i.e. a channel which is capable of playing back a sound.
  298. // Management of channels is done generically, methods for actually manipulating the channel
  299. // are derived for each audio engine.
  300. //
  301. class LLAudioChannel
  302. {
  303. public:
  304. LLAudioChannel();
  305. virtual ~LLAudioChannel();
  306. virtual void setSource(LLAudioSource *sourcep);
  307. LLAudioSource *getSource() const { return mCurrentSourcep; }
  308. void setSecondaryGain(F32 gain)             { mSecondaryGain = gain; }
  309. F32 getSecondaryGain()                      { return mSecondaryGain; }
  310. friend class LLAudioEngine;
  311. friend class LLAudioSource;
  312. protected:
  313. virtual void play() = 0;
  314. virtual void playSynced(LLAudioChannel *channelp) = 0;
  315. virtual void cleanup() = 0;
  316. virtual bool isPlaying() = 0;
  317. void setWaiting(const bool waiting) { mWaiting = waiting; }
  318. bool isWaiting() const { return mWaiting; }
  319. virtual bool updateBuffer(); // Check to see if the buffer associated with the source changed, and update if necessary.
  320. virtual void update3DPosition() = 0;
  321. virtual void updateLoop() = 0; // Update your loop/completion status, for use by queueing/syncing.
  322. protected:
  323. LLAudioSource *mCurrentSourcep;
  324. LLAudioBuffer *mCurrentBufferp;
  325. bool mLoopedThisFrame;
  326. bool mWaiting; // Waiting for sync.
  327. F32             mSecondaryGain;
  328. };
  329. // Basically an interface class to the engine-specific implementation
  330. // of audio data that's ready for playback.
  331. // Will likely get more complex as we decide to do stuff like real streaming audio.
  332. class LLAudioBuffer
  333. {
  334. public:
  335. virtual ~LLAudioBuffer() {};
  336. virtual bool loadWAV(const std::string& filename) = 0;
  337. virtual U32 getLength() = 0;
  338. friend class LLAudioEngine;
  339. friend class LLAudioChannel;
  340. friend class LLAudioData;
  341. protected:
  342. bool mInUse;
  343. LLAudioData *mAudioDatap;
  344. LLFrameTimer mLastUseTimer;
  345. };
  346. extern LLAudioEngine* gAudiop;
  347. #endif