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

游戏引擎

开发平台:

C++ Builder

  1.  /** 
  2.  * @file audioengine.cpp
  3.  * @brief implementation of LLAudioEngine class abstracting the Open
  4.  * AL audio support
  5.  *
  6.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2000-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "linden_common.h"
  34. #include "llaudioengine.h"
  35. #include "llstreamingaudio.h"
  36. #include "llerror.h"
  37. #include "llmath.h"
  38. #include "sound_ids.h"  // temporary hack for min/max distances
  39. #include "llvfs.h"
  40. #include "lldir.h"
  41. #include "llaudiodecodemgr.h"
  42. #include "llassetstorage.h"
  43. // necessary for grabbing sounds from sim (implemented in viewer)
  44. extern void request_sound(const LLUUID &sound_guid);
  45. LLAudioEngine* gAudiop = NULL;
  46. //
  47. // LLAudioEngine implementation
  48. //
  49. LLAudioEngine::LLAudioEngine()
  50. {
  51. setDefaults();
  52. }
  53. LLAudioEngine::~LLAudioEngine()
  54. {
  55. }
  56. LLStreamingAudioInterface* LLAudioEngine::getStreamingAudioImpl()
  57. {
  58. return mStreamingAudioImpl;
  59. }
  60. void LLAudioEngine::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
  61. {
  62. mStreamingAudioImpl = impl;
  63. }
  64. void LLAudioEngine::setDefaults()
  65. {
  66. mMaxWindGain = 1.f;
  67. mListenerp = NULL;
  68. mMuted = false;
  69. mUserData = NULL;
  70. mLastStatus = 0;
  71. mNumChannels = 0;
  72. mEnableWind = false;
  73. S32 i;
  74. for (i = 0; i < MAX_CHANNELS; i++)
  75. {
  76. mChannels[i] = NULL;
  77. }
  78. for (i = 0; i < MAX_BUFFERS; i++)
  79. {
  80. mBuffers[i] = NULL;
  81. }
  82. mMasterGain = 1.f;
  83. mNextWindUpdate = 0.f;
  84. mStreamingAudioImpl = NULL;
  85. for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
  86. mSecondaryGain[i] = 1.0f;
  87. }
  88. bool LLAudioEngine::init(const S32 num_channels, void* userdata)
  89. {
  90. setDefaults();
  91. mNumChannels = num_channels;
  92. mUserData = userdata;
  93. allocateListener();
  94. // Initialize the decode manager
  95. gAudioDecodeMgrp = new LLAudioDecodeMgr;
  96. llinfos << "LLAudioEngine::init() AudioEngine successfully initialized" << llendl;
  97. return true;
  98. }
  99. void LLAudioEngine::shutdown()
  100. {
  101. // Clean up decode manager
  102. delete gAudioDecodeMgrp;
  103. gAudioDecodeMgrp = NULL;
  104. // Clean up wind source
  105. cleanupWind();
  106. // Clean up audio sources
  107. source_map::iterator iter_src;
  108. for (iter_src = mAllSources.begin(); iter_src != mAllSources.end(); iter_src++)
  109. {
  110. delete iter_src->second;
  111. }
  112. // Clean up audio data
  113. data_map::iterator iter_data;
  114. for (iter_data = mAllData.begin(); iter_data != mAllData.end(); iter_data++)
  115. {
  116. delete iter_data->second;
  117. }
  118. // Clean up channels
  119. S32 i;
  120. for (i = 0; i < MAX_CHANNELS; i++)
  121. {
  122. delete mChannels[i];
  123. mChannels[i] = NULL;
  124. }
  125. // Clean up buffers
  126. for (i = 0; i < MAX_BUFFERS; i++)
  127. {
  128. delete mBuffers[i];
  129. mBuffers[i] = NULL;
  130. }
  131. }
  132. // virtual
  133. void LLAudioEngine::startInternetStream(const std::string& url)
  134. {
  135. if (mStreamingAudioImpl)
  136. mStreamingAudioImpl->start(url);
  137. }
  138. // virtual
  139. void LLAudioEngine::stopInternetStream()
  140. {
  141. if (mStreamingAudioImpl)
  142. mStreamingAudioImpl->stop();
  143. }
  144. // virtual
  145. void LLAudioEngine::pauseInternetStream(int pause)
  146. {
  147. if (mStreamingAudioImpl)
  148. mStreamingAudioImpl->pause(pause);
  149. }
  150. // virtual
  151. void LLAudioEngine::updateInternetStream()
  152. {
  153. if (mStreamingAudioImpl)
  154. mStreamingAudioImpl->update();
  155. }
  156. // virtual
  157. LLAudioEngine::LLAudioPlayState LLAudioEngine::isInternetStreamPlaying()
  158. {
  159. if (mStreamingAudioImpl)
  160. return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying();
  161. return LLAudioEngine::AUDIO_STOPPED; // Stopped
  162. }
  163. // virtual
  164. void LLAudioEngine::setInternetStreamGain(F32 vol)
  165. {
  166. if (mStreamingAudioImpl)
  167. mStreamingAudioImpl->setGain(vol);
  168. }
  169. // virtual
  170. std::string LLAudioEngine::getInternetStreamURL()
  171. {
  172. if (mStreamingAudioImpl)
  173. return mStreamingAudioImpl->getURL();
  174. else return std::string();
  175. }
  176. void LLAudioEngine::updateChannels()
  177. {
  178. S32 i;
  179. for (i = 0; i < MAX_CHANNELS; i++)
  180. {
  181. if (mChannels[i])
  182. {
  183. mChannels[i]->updateBuffer();
  184. mChannels[i]->update3DPosition();
  185. mChannels[i]->updateLoop();
  186. }
  187. }
  188. }
  189. static const F32 default_max_decode_time = .002f; // 2 ms
  190. void LLAudioEngine::idle(F32 max_decode_time)
  191. {
  192. if (max_decode_time <= 0.f)
  193. {
  194. max_decode_time = default_max_decode_time;
  195. }
  196. // "Update" all of our audio sources, clean up dead ones.
  197. // Primarily does position updating, cleanup of unused audio sources.
  198. // Also does regeneration of the current priority of each audio source.
  199. if (getMuted())
  200. {
  201. setInternalGain(0.f);
  202. }
  203. else
  204. {
  205. setInternalGain(getMasterGain());
  206. }
  207. S32 i;
  208. for (i = 0; i < MAX_BUFFERS; i++)
  209. {
  210. if (mBuffers[i])
  211. {
  212. mBuffers[i]->mInUse = false;
  213. }
  214. }
  215. F32 max_priority = -1.f;
  216. LLAudioSource *max_sourcep = NULL; // Maximum priority source without a channel
  217. source_map::iterator iter;
  218. for (iter = mAllSources.begin(); iter != mAllSources.end();)
  219. {
  220. LLAudioSource *sourcep = iter->second;
  221. // Update this source
  222. sourcep->update();
  223. sourcep->updatePriority();
  224. if (sourcep->isDone())
  225. {
  226. // The source is done playing, clean it up.
  227. delete sourcep;
  228. mAllSources.erase(iter++);
  229. continue;
  230. }
  231. if (!sourcep->getChannel() && sourcep->getCurrentBuffer())
  232. {
  233. // We could potentially play this sound if its priority is high enough.
  234. if (sourcep->getPriority() > max_priority)
  235. {
  236. max_priority = sourcep->getPriority();
  237. max_sourcep = sourcep;
  238. }
  239. }
  240. // Move on to the next source
  241. iter++;
  242. }
  243. // Now, do priority-based organization of audio sources.
  244. // All channels used, check priorities.
  245. // Find channel with lowest priority
  246. if (max_sourcep)
  247. {
  248. LLAudioChannel *channelp = getFreeChannel(max_priority);
  249. if (channelp)
  250. {
  251. //llinfos << "Replacing source in channel due to priority!" << llendl;
  252. max_sourcep->setChannel(channelp);
  253. channelp->setSource(max_sourcep);
  254. if (max_sourcep->isSyncSlave())
  255. {
  256. // A sync slave, it doesn't start playing until it's synced up with the master.
  257. // Flag this channel as waiting for sync, and return true.
  258. channelp->setWaiting(true);
  259. }
  260. else
  261. {
  262. channelp->setWaiting(false);
  263. channelp->play();
  264. }
  265. }
  266. }
  267. // Do this BEFORE we update the channels
  268. // Update the channels to sync up with any changes that the source made,
  269. // such as changing what sound was playing.
  270. updateChannels();
  271. // Update queued sounds (switch to next queued data if the current has finished playing)
  272. for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
  273. {
  274. // This is lame, instead of this I could actually iterate through all the sources
  275. // attached to each channel, since only those with active channels
  276. // can have anything interesting happen with their queue? (Maybe not true)
  277. LLAudioSource *sourcep = iter->second;
  278. if (!sourcep->mQueuedDatap)
  279. {
  280. // Nothing queued, so we don't care.
  281. continue;
  282. }
  283. LLAudioChannel *channelp = sourcep->getChannel();
  284. if (!channelp)
  285. {
  286. // This sound isn't playing, so we just process move the queue
  287. sourcep->mCurrentDatap = sourcep->mQueuedDatap;
  288. sourcep->mQueuedDatap = NULL;
  289. // Reset the timer so the source doesn't die.
  290. sourcep->mAgeTimer.reset();
  291. // Make sure we have the buffer set up if we just decoded the data
  292. if (sourcep->mCurrentDatap)
  293. {
  294. updateBufferForData(sourcep->mCurrentDatap);
  295. }
  296. // Actually play the associated data.
  297. sourcep->setupChannel();
  298. channelp = sourcep->getChannel();
  299. if (channelp)
  300. {
  301. channelp->updateBuffer();
  302. sourcep->getChannel()->play();
  303. }
  304. continue;
  305. }
  306. else
  307. {
  308. // Check to see if the current sound is done playing, or looped.
  309. if (!channelp->isPlaying())
  310. {
  311. sourcep->mCurrentDatap = sourcep->mQueuedDatap;
  312. sourcep->mQueuedDatap = NULL;
  313. // Reset the timer so the source doesn't die.
  314. sourcep->mAgeTimer.reset();
  315. // Make sure we have the buffer set up if we just decoded the data
  316. if (sourcep->mCurrentDatap)
  317. {
  318. updateBufferForData(sourcep->mCurrentDatap);
  319. }
  320. // Actually play the associated data.
  321. sourcep->setupChannel();
  322. channelp->updateBuffer();
  323. sourcep->getChannel()->play();
  324. }
  325. else if (sourcep->isLoop())
  326. {
  327. // It's a loop, we need to check and see if we're done with it.
  328. if (channelp->mLoopedThisFrame)
  329. {
  330. sourcep->mCurrentDatap = sourcep->mQueuedDatap;
  331. sourcep->mQueuedDatap = NULL;
  332. // Actually, should do a time sync so if we're a loop master/slave
  333. // we don't drift away.
  334. sourcep->setupChannel();
  335. sourcep->getChannel()->play();
  336. }
  337. }
  338. }
  339. }
  340. // Lame, update the channels AGAIN.
  341. // Update the channels to sync up with any changes that the source made,
  342. // such as changing what sound was playing.
  343. updateChannels();
  344. // Hack!  For now, just use a global sync master;
  345. LLAudioSource *sync_masterp = NULL;
  346. LLAudioChannel *master_channelp = NULL;
  347. F32 max_sm_priority = -1.f;
  348. for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
  349. {
  350. LLAudioSource *sourcep = iter->second;
  351. if (sourcep->isSyncMaster())
  352. {
  353. if (sourcep->getPriority() > max_sm_priority)
  354. {
  355. sync_masterp = sourcep;
  356. master_channelp = sync_masterp->getChannel();
  357. max_sm_priority = sourcep->getPriority();
  358. }
  359. }
  360. }
  361. if (master_channelp && master_channelp->mLoopedThisFrame)
  362. {
  363. // Synchronize loop slaves with their masters
  364. // Update queued sounds (switch to next queued data if the current has finished playing)
  365. for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
  366. {
  367. LLAudioSource *sourcep = iter->second;
  368. if (!sourcep->isSyncSlave())
  369. {
  370. // Not a loop slave, we don't need to do anything
  371. continue;
  372. }
  373. LLAudioChannel *channelp = sourcep->getChannel();
  374. if (!channelp)
  375. {
  376. // Not playing, don't need to bother.
  377. continue;
  378. }
  379. if (!channelp->isPlaying())
  380. {
  381. // Now we need to check if our loop master has just looped, and
  382. // start playback if that's the case.
  383. if (sync_masterp->getChannel())
  384. {
  385. channelp->playSynced(master_channelp);
  386. channelp->setWaiting(false);
  387. }
  388. }
  389. }
  390. }
  391. // Sync up everything that the audio engine needs done.
  392. commitDeferredChanges();
  393. // Flush unused buffers that are stale enough
  394. for (i = 0; i < MAX_BUFFERS; i++)
  395. {
  396. if (mBuffers[i])
  397. {
  398. if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f)
  399. {
  400. //llinfos << "Flushing unused buffer!" << llendl;
  401. mBuffers[i]->mAudioDatap->mBufferp = NULL;
  402. delete mBuffers[i];
  403. mBuffers[i] = NULL;
  404. }
  405. }
  406. }
  407. // Clear all of the looped flags for the channels
  408. for (i = 0; i < MAX_CHANNELS; i++)
  409. {
  410. if (mChannels[i])
  411. {
  412. mChannels[i]->mLoopedThisFrame = false;
  413. }
  414. }
  415. // Decode audio files
  416. gAudioDecodeMgrp->processQueue(max_decode_time);
  417. // Call this every frame, just in case we somehow
  418. // missed picking it up in all the places that can add
  419. // or request new data.
  420. startNextTransfer();
  421. updateInternetStream();
  422. }
  423. bool LLAudioEngine::updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid)
  424. {
  425. if (!adp)
  426. {
  427. return false;
  428. }
  429. // Update the audio buffer first - load a sound if we have it.
  430. // Note that this could potentially cause us to waste time updating buffers
  431. // for sounds that actually aren't playing, although this should be mitigated
  432. // by the fact that we limit the number of buffers, and we flush buffers based
  433. // on priority.
  434. if (!adp->getBuffer())
  435. {
  436. if (adp->hasDecodedData())
  437. {
  438. adp->load();
  439. }
  440. else if (adp->hasLocalData())
  441. {
  442. if (audio_uuid.notNull())
  443. {
  444. gAudioDecodeMgrp->addDecodeRequest(audio_uuid);
  445. }
  446. }
  447. else
  448. {
  449. return false;
  450. }
  451. }
  452. return true;
  453. }
  454. void LLAudioEngine::enableWind(bool enable)
  455. {
  456. if (enable && (!mEnableWind))
  457. {
  458. initWind();
  459. mEnableWind = enable;
  460. }
  461. else if (mEnableWind && (!enable))
  462. {
  463. mEnableWind = enable;
  464. cleanupWind();
  465. }
  466. }
  467. LLAudioBuffer * LLAudioEngine::getFreeBuffer()
  468. {
  469. S32 i;
  470. for (i = 0; i < MAX_BUFFERS; i++)
  471. {
  472. if (!mBuffers[i])
  473. {
  474. mBuffers[i] = createBuffer();
  475. return mBuffers[i];
  476. }
  477. }
  478. // Grab the oldest unused buffer
  479. F32 max_age = -1.f;
  480. S32 buffer_id = -1;
  481. for (i = 0; i < MAX_BUFFERS; i++)
  482. {
  483. if (mBuffers[i])
  484. {
  485. if (!mBuffers[i]->mInUse)
  486. {
  487. if (mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > max_age)
  488. {
  489. max_age = mBuffers[i]->mLastUseTimer.getElapsedTimeF32();
  490. buffer_id = i;
  491. }
  492. }
  493. }
  494. }
  495. if (buffer_id >= 0)
  496. {
  497. llinfos << "Taking over unused buffer " << buffer_id << llendl;
  498. //llinfos << "Flushing unused buffer!" << llendl;
  499. mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL;
  500. delete mBuffers[buffer_id];
  501. mBuffers[buffer_id] = createBuffer();
  502. return mBuffers[buffer_id];
  503. }
  504. return NULL;
  505. }
  506. LLAudioChannel * LLAudioEngine::getFreeChannel(const F32 priority)
  507. {
  508. S32 i;
  509. for (i = 0; i < mNumChannels; i++)
  510. {
  511. if (!mChannels[i])
  512. {
  513. // No channel allocated here, use it.
  514. mChannels[i] = createChannel();
  515. return mChannels[i];
  516. }
  517. else
  518. {
  519. // Channel is allocated but not playing right now, use it.
  520. if (!mChannels[i]->isPlaying() && !mChannels[i]->isWaiting())
  521. {
  522. mChannels[i]->cleanup();
  523. if (mChannels[i]->getSource())
  524. {
  525. mChannels[i]->getSource()->setChannel(NULL);
  526. }
  527. return mChannels[i];
  528. }
  529. }
  530. }
  531. // All channels used, check priorities.
  532. // Find channel with lowest priority and see if we want to replace it.
  533. F32 min_priority = 10000.f;
  534. LLAudioChannel *min_channelp = NULL;
  535. for (i = 0; i < mNumChannels; i++)
  536. {
  537. LLAudioChannel *channelp = mChannels[i];
  538. LLAudioSource *sourcep = channelp->getSource();
  539. if (sourcep->getPriority() < min_priority)
  540. {
  541. min_channelp = channelp;
  542. min_priority = sourcep->getPriority();
  543. }
  544. }
  545. if (min_priority > priority || !min_channelp)
  546. {
  547. // All playing channels have higher priority, return.
  548. return NULL;
  549. }
  550. // Flush the minimum priority channel, and return it.
  551. min_channelp->cleanup();
  552. min_channelp->getSource()->setChannel(NULL);
  553. return min_channelp;
  554. }
  555. void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)
  556. {
  557. S32 i;
  558. for (i = 0; i < MAX_BUFFERS; i++)
  559. {
  560. if (mBuffers[i] == bufferp)
  561. {
  562. delete mBuffers[i];
  563. mBuffers[i] = NULL;
  564. }
  565. }
  566. }
  567. bool LLAudioEngine::preloadSound(const LLUUID &uuid)
  568. {
  569. gAudiop->getAudioData(uuid); // We don't care about the return value, this is just to make sure
  570. // that we have an entry, which will mean that the audio engine knows about this
  571. if (gAudioDecodeMgrp->addDecodeRequest(uuid))
  572. {
  573. // This means that we do have a local copy, and we're working on decoding it.
  574. return true;
  575. }
  576. // At some point we need to have the audio/asset system check the static VFS
  577. // before it goes off and fetches stuff from the server.
  578. //llwarns << "Used internal preload for non-local sound" << llendl;
  579. return false;
  580. }
  581. bool LLAudioEngine::isWindEnabled()
  582. {
  583. return mEnableWind;
  584. }
  585. void LLAudioEngine::setMuted(bool muted)
  586. {
  587. mMuted = muted;
  588. enableWind(!mMuted);
  589. }
  590. void LLAudioEngine::setMasterGain(const F32 gain)
  591. {
  592. mMasterGain = gain;
  593. setInternalGain(gain);
  594. }
  595. F32 LLAudioEngine::getMasterGain()
  596. {
  597. return mMasterGain;
  598. }
  599. void LLAudioEngine::setSecondaryGain(S32 type, F32 gain)
  600. {
  601. llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT);
  602. mSecondaryGain[type] = gain;
  603. }
  604. F32 LLAudioEngine::getSecondaryGain(S32 type)
  605. {
  606. return mSecondaryGain[type];
  607. }
  608. F32 LLAudioEngine::getInternetStreamGain()
  609. {
  610. if (mStreamingAudioImpl)
  611. return mStreamingAudioImpl->getGain();
  612. else
  613. return 1.0f;
  614. }
  615. void LLAudioEngine::setMaxWindGain(F32 gain)
  616. {
  617. mMaxWindGain = gain;
  618. }
  619. F64 LLAudioEngine::mapWindVecToGain(LLVector3 wind_vec)
  620. {
  621. F64 gain = 0.0;
  622. gain = wind_vec.magVec();
  623. if (gain)
  624. {
  625. if (gain > 20)
  626. {
  627. gain = 20;
  628. }
  629. gain = gain/20.0;
  630. }
  631. return (gain);
  632. F64 LLAudioEngine::mapWindVecToPitch(LLVector3 wind_vec)
  633. {
  634. LLVector3 listen_right;
  635. F64 theta;
  636.   
  637. // Wind frame is in listener-relative coordinates
  638. LLVector3 norm_wind = wind_vec;
  639. norm_wind.normVec();
  640. listen_right.setVec(1.0,0.0,0.0);
  641. // measure angle between wind vec and listener right axis (on 0,PI)
  642. theta = acos(norm_wind * listen_right);
  643. // put it on 0, 1
  644. theta /= F_PI;
  645. // put it on [0, 0.5, 0]
  646. if (theta > 0.5) theta = 1.0-theta;
  647. if (theta < 0) theta = 0;
  648. return (theta);
  649. }
  650. F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
  651. {
  652. LLVector3 listen_right;
  653. F64 theta;
  654.   
  655. // Wind frame is in listener-relative coordinates
  656. listen_right.setVec(1.0,0.0,0.0);
  657. LLVector3 norm_wind = wind_vec;
  658. norm_wind.normVec();
  659. // measure angle between wind vec and listener right axis (on 0,PI)
  660. theta = acos(norm_wind * listen_right);
  661. // put it on 0, 1
  662. theta /= F_PI;
  663. return (theta);
  664. }
  665. void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
  666.  const S32 type, const LLVector3d &pos_global)
  667. {
  668. // Create a new source (since this can't be associated with an existing source.
  669. //llinfos << "Localized: " << audio_uuid << llendl;
  670. if (mMuted)
  671. {
  672. return;
  673. }
  674. LLUUID source_id;
  675. source_id.generate();
  676. LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
  677. gAudiop->addAudioSource(asp);
  678. if (pos_global.isExactlyZero())
  679. {
  680. asp->setAmbient(true);
  681. }
  682. else
  683. {
  684. asp->setPositionGlobal(pos_global);
  685. }
  686. asp->updatePriority();
  687. asp->play(audio_uuid);
  688. }
  689. void LLAudioEngine::setListenerPos(LLVector3 aVec)
  690. {
  691. mListenerp->setPosition(aVec);  
  692. }
  693. LLVector3 LLAudioEngine::getListenerPos()
  694. {
  695. if (mListenerp)
  696. {
  697. return(mListenerp->getPosition());  
  698. }
  699. else
  700. {
  701. return(LLVector3::zero);
  702. }
  703. }
  704. void LLAudioEngine::setListenerVelocity(LLVector3 aVec)
  705. {
  706. mListenerp->setVelocity(aVec);  
  707. }
  708. void LLAudioEngine::translateListener(LLVector3 aVec)
  709. {
  710. mListenerp->translate(aVec);
  711. }
  712. void LLAudioEngine::orientListener(LLVector3 up, LLVector3 at)
  713. {
  714. mListenerp->orient(up, at);  
  715. }
  716. void LLAudioEngine::setListener(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at)
  717. {
  718. mListenerp->set(pos,vel,up,at);  
  719. }
  720. void LLAudioEngine::setDopplerFactor(F32 factor)
  721. {
  722. if (mListenerp)
  723. {
  724. mListenerp->setDopplerFactor(factor);  
  725. }
  726. }
  727. F32 LLAudioEngine::getDopplerFactor()
  728. {
  729. if (mListenerp)
  730. {
  731. return mListenerp->getDopplerFactor();
  732. }
  733. else
  734. {
  735. return 0.f;
  736. }
  737. }
  738. void LLAudioEngine::setRolloffFactor(F32 factor)
  739. {
  740. if (mListenerp)
  741. {
  742. mListenerp->setRolloffFactor(factor);  
  743. }
  744. }
  745. F32 LLAudioEngine::getRolloffFactor()
  746. {
  747. if (mListenerp)
  748. {
  749. return mListenerp->getRolloffFactor();  
  750. }
  751. else
  752. {
  753. return 0.f;
  754. }
  755. }
  756. void LLAudioEngine::commitDeferredChanges()
  757. {
  758. mListenerp->commitDeferredChanges();  
  759. }
  760. LLAudioSource * LLAudioEngine::findAudioSource(const LLUUID &source_id)
  761. {
  762. source_map::iterator iter;
  763. iter = mAllSources.find(source_id);
  764. if (iter == mAllSources.end())
  765. {
  766. return NULL;
  767. }
  768. else
  769. {
  770. return iter->second;
  771. }
  772. }
  773. LLAudioData * LLAudioEngine::getAudioData(const LLUUID &audio_uuid)
  774. {
  775. data_map::iterator iter;
  776. iter = mAllData.find(audio_uuid);
  777. if (iter == mAllData.end())
  778. {
  779. // Create the new audio data
  780. LLAudioData *adp = new LLAudioData(audio_uuid);
  781. mAllData[audio_uuid] = adp;
  782. return adp;
  783. }
  784. else
  785. {
  786. return iter->second;
  787. }
  788. }
  789. void LLAudioEngine::addAudioSource(LLAudioSource *asp)
  790. {
  791. mAllSources[asp->getID()] = asp;
  792. }
  793. void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp)
  794. {
  795. source_map::iterator iter;
  796. iter = mAllSources.find(asp->getID());
  797. if (iter == mAllSources.end())
  798. {
  799. llwarns << "Cleaning up unknown audio source!" << llendl;
  800. return;
  801. }
  802. delete asp;
  803. mAllSources.erase(iter);
  804. }
  805. bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid)
  806. {
  807. std::string uuid_str;
  808. uuid.toString(uuid_str);
  809. std::string wav_path;
  810. wav_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str);
  811. wav_path += ".dsf";
  812. if (gDirUtilp->fileExists(wav_path))
  813. {
  814. return true;
  815. }
  816. else
  817. {
  818. return false;
  819. }
  820. }
  821. bool LLAudioEngine::hasLocalFile(const LLUUID &uuid)
  822. {
  823. // See if it's in the VFS.
  824. return gVFS->getExists(uuid, LLAssetType::AT_SOUND);
  825. }
  826. void LLAudioEngine::startNextTransfer()
  827. {
  828. //llinfos << "LLAudioEngine::startNextTransfer()" << llendl;
  829. if (mCurrentTransfer.notNull() || getMuted())
  830. {
  831. //llinfos << "Transfer in progress, aborting" << llendl;
  832. return;
  833. }
  834. // Get the ID for the next asset that we want to transfer.
  835. // Pick one in the following order:
  836. LLUUID asset_id;
  837. S32 i;
  838. LLAudioSource *asp = NULL;
  839. LLAudioData *adp = NULL;
  840. data_map::iterator data_iter;
  841. // Check all channels for currently playing sounds.
  842. F32 max_pri = -1.f;
  843. for (i = 0; i < MAX_CHANNELS; i++)
  844. {
  845. if (!mChannels[i])
  846. {
  847. continue;
  848. }
  849. asp = mChannels[i]->getSource();
  850. if (!asp)
  851. {
  852. continue;
  853. }
  854. if (asp->getPriority() <= max_pri)
  855. {
  856. continue;
  857. }
  858. if (asp->getPriority() <= max_pri)
  859. {
  860. continue;
  861. }
  862. adp = asp->getCurrentData();
  863. if (!adp)
  864. {
  865. continue;
  866. }
  867. if (!adp->hasLocalData() && adp->hasValidData())
  868. {
  869. asset_id = adp->getID();
  870. max_pri = asp->getPriority();
  871. }
  872. }
  873. // Check all channels for currently queued sounds.
  874. if (asset_id.isNull())
  875. {
  876. max_pri = -1.f;
  877. for (i = 0; i < MAX_CHANNELS; i++)
  878. {
  879. if (!mChannels[i])
  880. {
  881. continue;
  882. }
  883. LLAudioSource *asp;
  884. asp = mChannels[i]->getSource();
  885. if (!asp)
  886. {
  887. continue;
  888. }
  889. if (asp->getPriority() <= max_pri)
  890. {
  891. continue;
  892. }
  893. adp = asp->getQueuedData();
  894. if (!adp)
  895. {
  896. continue;
  897. }
  898. if (!adp->hasLocalData() && adp->hasValidData())
  899. {
  900. asset_id = adp->getID();
  901. max_pri = asp->getPriority();
  902. }
  903. }
  904. }
  905. // Check all live channels for other sounds (preloads).
  906. if (asset_id.isNull())
  907. {
  908. max_pri = -1.f;
  909. for (i = 0; i < MAX_CHANNELS; i++)
  910. {
  911. if (!mChannels[i])
  912. {
  913. continue;
  914. }
  915. LLAudioSource *asp;
  916. asp = mChannels[i]->getSource();
  917. if (!asp)
  918. {
  919. continue;
  920. }
  921. if (asp->getPriority() <= max_pri)
  922. {
  923. continue;
  924. }
  925. for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
  926. {
  927. LLAudioData *adp = data_iter->second;
  928. if (!adp)
  929. {
  930. continue;
  931. }
  932. if (!adp->hasLocalData() && adp->hasValidData())
  933. {
  934. asset_id = adp->getID();
  935. max_pri = asp->getPriority();
  936. }
  937. }
  938. }
  939. }
  940. // Check all sources
  941. if (asset_id.isNull())
  942. {
  943. max_pri = -1.f;
  944. source_map::iterator source_iter;
  945. for (source_iter = mAllSources.begin(); source_iter != mAllSources.end(); source_iter++)
  946. {
  947. asp = source_iter->second;
  948. if (!asp)
  949. {
  950. continue;
  951. }
  952. if (asp->getPriority() <= max_pri)
  953. {
  954. continue;
  955. }
  956. adp = asp->getCurrentData();
  957. if (adp && !adp->hasLocalData() && adp->hasValidData())
  958. {
  959. asset_id = adp->getID();
  960. max_pri = asp->getPriority();
  961. continue;
  962. }
  963. adp = asp->getQueuedData();
  964. if (adp && !adp->hasLocalData() && adp->hasValidData())
  965. {
  966. asset_id = adp->getID();
  967. max_pri = asp->getPriority();
  968. continue;
  969. }
  970. for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
  971. {
  972. LLAudioData *adp = data_iter->second;
  973. if (!adp)
  974. {
  975. continue;
  976. }
  977. if (!adp->hasLocalData() && adp->hasValidData())
  978. {
  979. asset_id = adp->getID();
  980. max_pri = asp->getPriority();
  981. break;
  982. }
  983. }
  984. }
  985. }
  986. if (asset_id.notNull())
  987. {
  988. llinfos << "Getting asset data for: " << asset_id << llendl;
  989. gAudiop->mCurrentTransfer = asset_id;
  990. gAudiop->mCurrentTransferTimer.reset();
  991. gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,
  992. assetCallback, NULL);
  993. }
  994. else
  995. {
  996. //llinfos << "No pending transfers?" << llendl;
  997. }
  998. }
  999. // static
  1000. void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)
  1001. {
  1002. if (result_code)
  1003. {
  1004. llinfos << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << llendl;
  1005. // Need to mark data as bad to avoid constant rerequests.
  1006. LLAudioData *adp = gAudiop->getAudioData(uuid);
  1007. if (adp)
  1008.         {
  1009. adp->setHasValidData(false);
  1010. adp->setHasLocalData(false);
  1011. adp->setHasDecodedData(false);
  1012. }
  1013. }
  1014. else
  1015. {
  1016. LLAudioData *adp = gAudiop->getAudioData(uuid);
  1017. if (!adp)
  1018.         {
  1019. // Should never happen
  1020. llwarns << "Got asset callback without audio data for " << uuid << llendl;
  1021.         }
  1022. else
  1023. {
  1024. adp->setHasValidData(true);
  1025.     adp->setHasLocalData(true);
  1026.     gAudioDecodeMgrp->addDecodeRequest(uuid);
  1027. }
  1028. }
  1029. gAudiop->mCurrentTransfer = LLUUID::null;
  1030. gAudiop->startNextTransfer();
  1031. }
  1032. //
  1033. // LLAudioSource implementation
  1034. //
  1035. LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type)
  1036. : mID(id),
  1037. mOwnerID(owner_id),
  1038. mPriority(0.f),
  1039. mGain(gain),
  1040. mType(type),
  1041. mAmbient(false),
  1042. mLoop(false),
  1043. mSyncMaster(false),
  1044. mSyncSlave(false),
  1045. mQueueSounds(false),
  1046. mPlayedOnce(false),
  1047. mChannelp(NULL),
  1048. mCurrentDatap(NULL),
  1049. mQueuedDatap(NULL)
  1050. {
  1051. }
  1052. LLAudioSource::~LLAudioSource()
  1053. {
  1054. if (mChannelp)
  1055. {
  1056. // Stop playback of this sound
  1057. mChannelp->setSource(NULL);
  1058. mChannelp = NULL;
  1059. }
  1060. }
  1061. void LLAudioSource::setChannel(LLAudioChannel *channelp)
  1062. {
  1063. if (channelp == mChannelp)
  1064. {
  1065. return;
  1066. }
  1067. mChannelp = channelp;
  1068. }
  1069. void LLAudioSource::update()
  1070. {
  1071. if (!getCurrentBuffer())
  1072. {
  1073. if (getCurrentData())
  1074. {
  1075. // Hack - try and load the sound.  Will do this as a callback
  1076. // on decode later.
  1077. if (getCurrentData()->load())
  1078. {
  1079. play(getCurrentData()->getID());
  1080. }
  1081. }
  1082. }
  1083. }
  1084. void LLAudioSource::updatePriority()
  1085. {
  1086. if (isAmbient())
  1087. {
  1088. mPriority = 1.f;
  1089. }
  1090. else
  1091. {
  1092. // Priority is based on distance
  1093. LLVector3 dist_vec;
  1094. dist_vec.setVec(getPositionGlobal());
  1095. dist_vec -= gAudiop->getListenerPos();
  1096. F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());
  1097. mPriority = mGain / dist_squared;
  1098. }
  1099. }
  1100. bool LLAudioSource::setupChannel()
  1101. {
  1102. LLAudioData *adp = getCurrentData();
  1103. if (!adp->getBuffer())
  1104. {
  1105. // We're not ready to play back the sound yet, so don't try and allocate a channel for it.
  1106. //llwarns << "Aborting, no buffer" << llendl;
  1107. return false;
  1108. }
  1109. if (!mChannelp)
  1110. {
  1111. // Update the priority, in case we need to push out another channel.
  1112. updatePriority();
  1113. setChannel(gAudiop->getFreeChannel(getPriority()));
  1114. }
  1115. if (!mChannelp)
  1116. {
  1117. // Ugh, we don't have any free channels.
  1118. // Now we have to reprioritize.
  1119. // For now, just don't play the sound.
  1120. //llwarns << "Aborting, no free channels" << llendl;
  1121. return false;
  1122. }
  1123. mChannelp->setSource(this);
  1124. return true;
  1125. }
  1126. bool LLAudioSource::play(const LLUUID &audio_uuid)
  1127. {
  1128. if (audio_uuid.isNull())
  1129. {
  1130. if (getChannel())
  1131. {
  1132. getChannel()->setSource(NULL);
  1133. setChannel(NULL);
  1134. addAudioData(NULL, true);
  1135. }
  1136. }
  1137. // Reset our age timeout if someone attempts to play the source.
  1138. mAgeTimer.reset();
  1139. LLAudioData *adp = gAudiop->getAudioData(audio_uuid);
  1140. bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid);
  1141. addAudioData(adp);
  1142. if (!has_buffer)
  1143. {
  1144. // Don't bother trying to set up a channel or anything, we don't have an audio buffer.
  1145. return false;
  1146. }
  1147. if (!setupChannel())
  1148. {
  1149. return false;
  1150. }
  1151. if (isSyncSlave())
  1152. {
  1153. // A sync slave, it doesn't start playing until it's synced up with the master.
  1154. // Flag this channel as waiting for sync, and return true.
  1155. getChannel()->setWaiting(true);
  1156. return true;
  1157. }
  1158. getChannel()->play();
  1159. return true;
  1160. }
  1161. bool LLAudioSource::isDone()
  1162. {
  1163. const F32 MAX_AGE = 60.f;
  1164. const F32 MAX_UNPLAYED_AGE = 15.f;
  1165. if (isLoop())
  1166. {
  1167. // Looped sources never die on their own.
  1168. return false;
  1169. }
  1170. if (hasPendingPreloads())
  1171. {
  1172. return false;
  1173. }
  1174. if (mQueuedDatap)
  1175. {
  1176. // Don't kill this sound if we've got something queued up to play.
  1177. return false;
  1178. }
  1179. F32 elapsed = mAgeTimer.getElapsedTimeF32();
  1180. // This is a single-play source
  1181. if (!mChannelp)
  1182. {
  1183. if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce)
  1184. {
  1185. // We don't have a channel assigned, and it's been
  1186. // over 5 seconds since we tried to play it.  Don't bother.
  1187. //llinfos << "No channel assigned, source is done" << llendl;
  1188. return true;
  1189. }
  1190. else
  1191. {
  1192. return false;
  1193. }
  1194. }
  1195. if (mChannelp->isPlaying())
  1196. {
  1197. if (elapsed > MAX_AGE)
  1198. {
  1199. // Arbitarily cut off non-looped sounds when they're old.
  1200. return true;
  1201. }
  1202. else
  1203. {
  1204. // Sound is still playing and we haven't timed out, don't kill it.
  1205. return false;
  1206. }
  1207. }
  1208. if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce)
  1209. {
  1210. // The sound isn't playing back after 5 seconds or we're already done playing it, kill it.
  1211. return true;
  1212. }
  1213. return false;
  1214. }
  1215. void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)
  1216. {
  1217. // Only handle a single piece of audio data associated with a source right now,
  1218. // until I implement prefetch.
  1219. if (set_current)
  1220. {
  1221. if (!mCurrentDatap)
  1222. {
  1223. mCurrentDatap = adp;
  1224. if (mChannelp)
  1225. {
  1226. mChannelp->updateBuffer();
  1227. mChannelp->play();
  1228. }
  1229. // Make sure the audio engine knows that we want to request this sound.
  1230. gAudiop->startNextTransfer();
  1231. return;
  1232. }
  1233. else if (mQueueSounds)
  1234. {
  1235. // If we have current data, and we're queuing, put
  1236. // the object onto the queue.
  1237. if (mQueuedDatap)
  1238. {
  1239. // We only queue one sound at a time, and it's a FIFO.
  1240. // Don't put it onto the queue.
  1241. return;
  1242. }
  1243. if (adp == mCurrentDatap && isLoop())
  1244. {
  1245. // No point in queueing the same sound if
  1246. // we're looping.
  1247. return;
  1248. }
  1249. mQueuedDatap = adp;
  1250. // Make sure the audio engine knows that we want to request this sound.
  1251. gAudiop->startNextTransfer();
  1252. }
  1253. else
  1254. {
  1255. if (mCurrentDatap != adp)
  1256. {
  1257. // Right now, if we're currently playing this sound in a channel, we
  1258. // update the buffer that the channel's associated with
  1259. // and play it.  This may not be the correct behavior.
  1260. mCurrentDatap = adp;
  1261. if (mChannelp)
  1262. {
  1263. mChannelp->updateBuffer();
  1264. mChannelp->play();
  1265. }
  1266. // Make sure the audio engine knows that we want to request this sound.
  1267. gAudiop->startNextTransfer();
  1268. }
  1269. }
  1270. }
  1271. else
  1272. {
  1273. // Add it to the preload list.
  1274. mPreloadMap[adp->getID()] = adp;
  1275. gAudiop->startNextTransfer();
  1276. }
  1277. }
  1278. bool LLAudioSource::hasPendingPreloads() const
  1279. {
  1280. // Check to see if we've got any preloads on deck for this source
  1281. data_map::const_iterator iter;
  1282. for (iter = mPreloadMap.begin(); iter != mPreloadMap.end(); iter++)
  1283. {
  1284. LLAudioData *adp = iter->second;
  1285. // note: a bad UUID will forever be !hasDecodedData()
  1286. // but also !hasValidData(), hence the check for hasValidData()
  1287. if (!adp->hasDecodedData() && adp->hasValidData())
  1288. {
  1289. // This source is still waiting for a preload
  1290. return true;
  1291. }
  1292. }
  1293. return false;
  1294. }
  1295. LLAudioData * LLAudioSource::getCurrentData()
  1296. {
  1297. return mCurrentDatap;
  1298. }
  1299. LLAudioData * LLAudioSource::getQueuedData()
  1300. {
  1301. return mQueuedDatap;
  1302. }
  1303. LLAudioBuffer * LLAudioSource::getCurrentBuffer()
  1304. {
  1305. if (!mCurrentDatap)
  1306. {
  1307. return NULL;
  1308. }
  1309. return mCurrentDatap->getBuffer();
  1310. }
  1311. //
  1312. // LLAudioChannel implementation
  1313. //
  1314. LLAudioChannel::LLAudioChannel() :
  1315. mCurrentSourcep(NULL),
  1316. mCurrentBufferp(NULL),
  1317. mLoopedThisFrame(false),
  1318. mWaiting(false),
  1319. mSecondaryGain(1.0f)
  1320. {
  1321. }
  1322. LLAudioChannel::~LLAudioChannel()
  1323. {
  1324. // Need to disconnect any sources which are using this channel.
  1325. //llinfos << "Cleaning up audio channel" << llendl;
  1326. if (mCurrentSourcep)
  1327. {
  1328. mCurrentSourcep->setChannel(NULL);
  1329. }
  1330. mCurrentBufferp = NULL;
  1331. }
  1332. void LLAudioChannel::setSource(LLAudioSource *sourcep)
  1333. {
  1334. //llinfos << this << ": setSource(" << sourcep << ")" << llendl;
  1335. if (!sourcep)
  1336. {
  1337. // Clearing the source for this channel, don't need to do anything.
  1338. //llinfos << "Clearing source for channel" << llendl;
  1339. cleanup();
  1340. mCurrentSourcep = NULL;
  1341. mWaiting = false;
  1342. return;
  1343. }
  1344. if (sourcep == mCurrentSourcep)
  1345. {
  1346. // Don't reallocate the channel, this will make FMOD goofy.
  1347. //llinfos << "Calling setSource with same source!" << llendl;
  1348. }
  1349. mCurrentSourcep = sourcep;
  1350. updateBuffer();
  1351. update3DPosition();
  1352. }
  1353. bool LLAudioChannel::updateBuffer()
  1354. {
  1355. if (!mCurrentSourcep)
  1356. {
  1357. // This channel isn't associated with any source, nothing
  1358. // to be updated
  1359. return false;
  1360. }
  1361. // Initialize the channel's gain setting for this sound.
  1362. if(gAudiop)
  1363. {
  1364. setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
  1365. }
  1366. LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();
  1367. if (bufferp == mCurrentBufferp)
  1368. {
  1369. if (bufferp)
  1370. {
  1371. // The source hasn't changed what buffer it's playing
  1372. bufferp->mLastUseTimer.reset();
  1373. bufferp->mInUse = true;
  1374. }
  1375. return false;
  1376. }
  1377. //
  1378. // The source changed what buffer it's playing.  We need to clean up
  1379. // the existing channel
  1380. //
  1381. cleanup();
  1382. mCurrentBufferp = bufferp;
  1383. if (bufferp)
  1384. {
  1385. bufferp->mLastUseTimer.reset();
  1386. bufferp->mInUse = true;
  1387. }
  1388. if (!mCurrentBufferp)
  1389. {
  1390. // There's no new buffer to be played, so we just abort.
  1391. return false;
  1392. }
  1393. return true;
  1394. }
  1395. //
  1396. // LLAudioData implementation
  1397. //
  1398. LLAudioData::LLAudioData(const LLUUID &uuid) :
  1399. mID(uuid),
  1400. mBufferp(NULL),
  1401. mHasLocalData(false),
  1402. mHasDecodedData(false),
  1403. mHasValidData(true)
  1404. {
  1405. if (uuid.isNull())
  1406. {
  1407. // This is a null sound.
  1408. return;
  1409. }
  1410. if (gAudiop && gAudiop->hasDecodedFile(uuid))
  1411. {
  1412. // Already have a decoded version, don't need to decode it.
  1413. mHasLocalData = true;
  1414. mHasDecodedData = true;
  1415. }
  1416. else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
  1417. {
  1418. mHasLocalData = true;
  1419. }
  1420. }
  1421. bool LLAudioData::load()
  1422. {
  1423. // For now, just assume we're going to use one buffer per audiodata.
  1424. if (mBufferp)
  1425. {
  1426. // We already have this sound in a buffer, don't do anything.
  1427. llinfos << "Already have a buffer for this sound, don't bother loading!" << llendl;
  1428. return true;
  1429. }
  1430. mBufferp = gAudiop->getFreeBuffer();
  1431. if (!mBufferp)
  1432. {
  1433. // No free buffers, abort.
  1434. llinfos << "Not able to allocate a new audio buffer, aborting." << llendl;
  1435. return false;
  1436. }
  1437. std::string uuid_str;
  1438. std::string wav_path;
  1439. mID.toString(uuid_str);
  1440. wav_path= gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf";
  1441. if (!mBufferp->loadWAV(wav_path))
  1442. {
  1443. // Hrm.  Right now, let's unset the buffer, since it's empty.
  1444. gAudiop->cleanupBuffer(mBufferp);
  1445. mBufferp = NULL;
  1446. return false;
  1447. }
  1448. mBufferp->mAudioDatap = this;
  1449. return true;
  1450. }