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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llaudiodecodemgr.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2003-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "llaudiodecodemgr.h"
  33. #include "llaudioengine.h"
  34. #include "lllfsthread.h"
  35. #include "llvfile.h"
  36. #include "llstring.h"
  37. #include "lldir.h"
  38. #include "llendianswizzle.h"
  39. #include "llassetstorage.h"
  40. #include "llrefcount.h"
  41. #include "llvorbisencode.h"
  42. #include "vorbis/codec.h"
  43. #include "vorbis/vorbisfile.h"
  44. extern LLAudioEngine *gAudiop;
  45. LLAudioDecodeMgr *gAudioDecodeMgrp = NULL;
  46. static const S32 WAV_HEADER_SIZE = 44;
  47. //////////////////////////////////////////////////////////////////////////////
  48. class LLVorbisDecodeState : public LLRefCount
  49. {
  50. public:
  51. class WriteResponder : public LLLFSThread::Responder
  52. {
  53. public:
  54. WriteResponder(LLVorbisDecodeState* decoder) : mDecoder(decoder) {}
  55. ~WriteResponder() {}
  56. void completed(S32 bytes)
  57. {
  58. mDecoder->ioComplete(bytes);
  59. }
  60. LLPointer<LLVorbisDecodeState> mDecoder;
  61. };
  62. LLVorbisDecodeState(const LLUUID &uuid, const std::string &out_filename);
  63. BOOL initDecode();
  64. BOOL decodeSection(); // Return TRUE if done.
  65. BOOL finishDecode();
  66. void flushBadFile();
  67. void ioComplete(S32 bytes) { mBytesRead = bytes; }
  68. BOOL isValid() const { return mValid; }
  69. BOOL isDone() const { return mDone; }
  70. const LLUUID &getUUID() const { return mUUID; }
  71. protected:
  72. virtual ~LLVorbisDecodeState();
  73. BOOL mValid;
  74. BOOL mDone;
  75. LLAtomicS32 mBytesRead;
  76. LLUUID mUUID;
  77. std::vector<U8> mWAVBuffer;
  78. #if !defined(USE_WAV_VFILE)
  79. std::string mOutFilename;
  80. LLLFSThread::handle_t mFileHandle;
  81. #endif
  82. LLVFile *mInFilep;
  83. OggVorbis_File mVF;
  84. S32 mCurrentSection;
  85. };
  86. size_t vfs_read(void *ptr, size_t size, size_t nmemb, void *datasource)
  87. {
  88. LLVFile *file = (LLVFile *)datasource;
  89. if (file->read((U8*)ptr, (S32)(size * nmemb))) /*Flawfinder: ignore*/
  90. {
  91. S32 read = file->getLastBytesRead();
  92. return  read / size; /*Flawfinder: ignore*/
  93. }
  94. else
  95. {
  96. return 0;
  97. }
  98. }
  99. int vfs_seek(void *datasource, ogg_int64_t offset, int whence)
  100. {
  101. LLVFile *file = (LLVFile *)datasource;
  102. // vfs has 31-bit files
  103. if (offset > S32_MAX)
  104. {
  105. return -1;
  106. }
  107. S32 origin;
  108. switch (whence) {
  109. case SEEK_SET:
  110. origin = 0;
  111. break;
  112. case SEEK_END:
  113. origin = file->getSize();
  114. break;
  115. case SEEK_CUR:
  116. origin = -1;
  117. break;
  118. default:
  119. llerrs << "Invalid whence argument to vfs_seek" << llendl;
  120. return -1;
  121. }
  122. if (file->seek((S32)offset, origin))
  123. {
  124. return 0;
  125. }
  126. else
  127. {
  128. return -1;
  129. }
  130. }
  131. int vfs_close (void *datasource)
  132. {
  133. LLVFile *file = (LLVFile *)datasource;
  134. delete file;
  135. return 0;
  136. }
  137. long vfs_tell (void *datasource)
  138. {
  139. LLVFile *file = (LLVFile *)datasource;
  140. return file->tell();
  141. }
  142. LLVorbisDecodeState::LLVorbisDecodeState(const LLUUID &uuid, const std::string &out_filename)
  143. {
  144. mDone = FALSE;
  145. mValid = FALSE;
  146. mBytesRead = -1;
  147. mUUID = uuid;
  148. mInFilep = NULL;
  149. mCurrentSection = 0;
  150. #if !defined(USE_WAV_VFILE)
  151. mOutFilename = out_filename;
  152. mFileHandle = LLLFSThread::nullHandle();
  153. #endif
  154. // No default value for mVF, it's an ogg structure?
  155. // Hey, let's zero it anyway, for predictability.
  156. memset(&mVF, 0, sizeof(mVF));
  157. }
  158. LLVorbisDecodeState::~LLVorbisDecodeState()
  159. {
  160. if (!mDone)
  161. {
  162. delete mInFilep;
  163. mInFilep = NULL;
  164. }
  165. }
  166. BOOL LLVorbisDecodeState::initDecode()
  167. {
  168. ov_callbacks vfs_callbacks;
  169. vfs_callbacks.read_func = vfs_read;
  170. vfs_callbacks.seek_func = vfs_seek;
  171. vfs_callbacks.close_func = vfs_close;
  172. vfs_callbacks.tell_func = vfs_tell;
  173. //llinfos << "Initing decode from vfile: " << mUUID << llendl;
  174. mInFilep = new LLVFile(gVFS, mUUID, LLAssetType::AT_SOUND);
  175. if (!mInFilep || !mInFilep->getSize())
  176. {
  177. llwarns << "unable to open vorbis source vfile for reading" << llendl;
  178. delete mInFilep;
  179. mInFilep = NULL;
  180. return FALSE;
  181. }
  182. int r = ov_open_callbacks(mInFilep, &mVF, NULL, 0, vfs_callbacks);
  183. if(r < 0) 
  184. {
  185. llwarns << r << " Input to vorbis decode does not appear to be an Ogg bitstream: " << mUUID << llendl;
  186. return(FALSE);
  187. }
  188. S32 sample_count = ov_pcm_total(&mVF, -1);
  189. size_t size_guess = (size_t)sample_count;
  190. vorbis_info* vi = ov_info(&mVF, -1);
  191. size_guess *= vi->channels;
  192. size_guess *= 2;
  193. size_guess += 2048;
  194. bool abort_decode = false;
  195. if( vi->channels < 1 || vi->channels > LLVORBIS_CLIP_MAX_CHANNELS )
  196. {
  197. abort_decode = true;
  198. llwarns << "Bad channel count: " << vi->channels << llendl;
  199. }
  200. if( (size_t)sample_count > LLVORBIS_CLIP_REJECT_SAMPLES )
  201. {
  202. abort_decode = true;
  203. llwarns << "Illegal sample count: " << sample_count << llendl;
  204. }
  205. if( size_guess > LLVORBIS_CLIP_REJECT_SIZE )
  206. {
  207. abort_decode = true;
  208. llwarns << "Illegal sample size: " << size_guess << llendl;
  209. }
  210. if( abort_decode )
  211. {
  212. llwarns << "Canceling initDecode. Bad asset: " << mUUID << llendl;
  213. llwarns << "Bad asset encoded by: " << ov_comment(&mVF,-1)->vendor << llendl;
  214. delete mInFilep;
  215. mInFilep = NULL;
  216. return FALSE;
  217. }
  218. mWAVBuffer.reserve(size_guess);
  219. mWAVBuffer.resize(WAV_HEADER_SIZE);
  220. {
  221. // write the .wav format header
  222. //"RIFF"
  223. mWAVBuffer[0] = 0x52;
  224. mWAVBuffer[1] = 0x49;
  225. mWAVBuffer[2] = 0x46;
  226. mWAVBuffer[3] = 0x46;
  227. // length = datalen + 36 (to be filled in later)
  228. mWAVBuffer[4] = 0x00;
  229. mWAVBuffer[5] = 0x00;
  230. mWAVBuffer[6] = 0x00;
  231. mWAVBuffer[7] = 0x00;
  232. //"WAVE"
  233. mWAVBuffer[8] = 0x57;
  234. mWAVBuffer[9] = 0x41;
  235. mWAVBuffer[10] = 0x56;
  236. mWAVBuffer[11] = 0x45;
  237. // "fmt "
  238. mWAVBuffer[12] = 0x66;
  239. mWAVBuffer[13] = 0x6D;
  240. mWAVBuffer[14] = 0x74;
  241. mWAVBuffer[15] = 0x20;
  242. // chunk size = 16
  243. mWAVBuffer[16] = 0x10;
  244. mWAVBuffer[17] = 0x00;
  245. mWAVBuffer[18] = 0x00;
  246. mWAVBuffer[19] = 0x00;
  247. // format (1 = PCM)
  248. mWAVBuffer[20] = 0x01;
  249. mWAVBuffer[21] = 0x00;
  250. // number of channels
  251. mWAVBuffer[22] = 0x01;
  252. mWAVBuffer[23] = 0x00;
  253. // samples per second
  254. mWAVBuffer[24] = 0x44;
  255. mWAVBuffer[25] = 0xAC;
  256. mWAVBuffer[26] = 0x00;
  257. mWAVBuffer[27] = 0x00;
  258. // average bytes per second
  259. mWAVBuffer[28] = 0x88;
  260. mWAVBuffer[29] = 0x58;
  261. mWAVBuffer[30] = 0x01;
  262. mWAVBuffer[31] = 0x00;
  263. // bytes to output at a single time
  264. mWAVBuffer[32] = 0x02;
  265. mWAVBuffer[33] = 0x00;
  266.  
  267. // 16 bits per sample
  268. mWAVBuffer[34] = 0x10;
  269. mWAVBuffer[35] = 0x00;
  270. // "data"
  271. mWAVBuffer[36] = 0x64;
  272. mWAVBuffer[37] = 0x61;
  273. mWAVBuffer[38] = 0x74;
  274. mWAVBuffer[39] = 0x61;
  275. // these are the length of the data chunk, to be filled in later
  276. mWAVBuffer[40] = 0x00;
  277. mWAVBuffer[41] = 0x00;
  278. mWAVBuffer[42] = 0x00;
  279. mWAVBuffer[43] = 0x00;
  280. }
  281. //{
  282. //char **ptr=ov_comment(&mVF,-1)->user_comments;
  283. // vorbis_info *vi=ov_info(&vf,-1);
  284. //while(*ptr){
  285. // fprintf(stderr,"%sn",*ptr);
  286. // ++ptr;
  287. //}
  288. //    fprintf(stderr,"nBitstream is %d channel, %ldHzn",vi->channels,vi->rate);
  289. //    fprintf(stderr,"nDecoded length: %ld samplesn", (long)ov_pcm_total(&vf,-1));
  290. //    fprintf(stderr,"Encoded by: %snn",ov_comment(&vf,-1)->vendor);
  291. //}
  292. return TRUE;
  293. }
  294. BOOL LLVorbisDecodeState::decodeSection()
  295. {
  296. if (!mInFilep)
  297. {
  298. llwarns << "No VFS file to decode in vorbis!" << llendl;
  299. return TRUE;
  300. }
  301. if (mDone)
  302. {
  303. //  llwarns << "Already done with decode, aborting!" << llendl;
  304. return TRUE;
  305. }
  306. char pcmout[4096]; /*Flawfinder: ignore*/
  307. BOOL eof = FALSE;
  308. long ret=ov_read(&mVF, pcmout, sizeof(pcmout), 0, 2, 1, &mCurrentSection);
  309. if (ret == 0)
  310. {
  311. /* EOF */
  312. eof = TRUE;
  313. mDone = TRUE;
  314. mValid = TRUE;
  315. // llinfos << "Vorbis EOF" << llendl;
  316. }
  317. else if (ret < 0)
  318. {
  319. /* error in the stream.  Not a problem, just reporting it in
  320.    case we (the app) cares.  In this case, we don't. */
  321. llwarns << "BAD vorbis decode in decodeSection." << llendl;
  322. mValid = FALSE;
  323. mDone = TRUE;
  324. // We're done, return TRUE.
  325. return TRUE;
  326. }
  327. else
  328. {
  329. // llinfos << "Vorbis read " << ret << "bytes" << llendl;
  330. /* we don't bother dealing with sample rate changes, etc, but.
  331.    you'll have to*/
  332. std::copy(pcmout, pcmout+ret, std::back_inserter(mWAVBuffer));
  333. }
  334. return eof;
  335. }
  336. BOOL LLVorbisDecodeState::finishDecode()
  337. {
  338. if (!isValid())
  339. {
  340. llwarns << "Bogus vorbis decode state for " << getUUID() << ", aborting!" << llendl;
  341. return TRUE; // We've finished
  342. }
  343. #if !defined(USE_WAV_VFILE)
  344. if (mFileHandle == LLLFSThread::nullHandle())
  345. #endif
  346. {
  347. ov_clear(&mVF);
  348.   
  349. // write "data" chunk length, in little-endian format
  350. S32 data_length = mWAVBuffer.size() - WAV_HEADER_SIZE;
  351. mWAVBuffer[40] = (data_length) & 0x000000FF;
  352. mWAVBuffer[41] = (data_length >> 8) & 0x000000FF;
  353. mWAVBuffer[42] = (data_length >> 16) & 0x000000FF;
  354. mWAVBuffer[43] = (data_length >> 24) & 0x000000FF;
  355. // write overall "RIFF" length, in little-endian format
  356. data_length += 36;
  357. mWAVBuffer[4] = (data_length) & 0x000000FF;
  358. mWAVBuffer[5] = (data_length >> 8) & 0x000000FF;
  359. mWAVBuffer[6] = (data_length >> 16) & 0x000000FF;
  360. mWAVBuffer[7] = (data_length >> 24) & 0x000000FF;
  361. //
  362. // FUDGECAKES!!! Vorbis encode/decode messes up loop point transitions (pop)
  363. // do a cheap-and-cheesy crossfade 
  364. //
  365. {
  366. S16 *samplep;
  367. S32 i;
  368. S32 fade_length;
  369. char pcmout[4096]; /*Flawfinder: ignore*/ 
  370. fade_length = llmin((S32)128,(S32)(data_length-36)/8);
  371. if((S32)mWAVBuffer.size() >= (WAV_HEADER_SIZE + 2* fade_length))
  372. {
  373. memcpy(pcmout, &mWAVBuffer[WAV_HEADER_SIZE], (2 * fade_length)); /*Flawfinder: ignore*/
  374. }
  375. llendianswizzle(&pcmout, 2, fade_length);
  376. samplep = (S16 *)pcmout;
  377. for (i = 0 ;i < fade_length; i++)
  378. {
  379. *samplep = llfloor((F32)*samplep * ((F32)i/(F32)fade_length));
  380. samplep++;
  381. }
  382. llendianswizzle(&pcmout, 2, fade_length);
  383. if((WAV_HEADER_SIZE+(2 * fade_length)) < (S32)mWAVBuffer.size())
  384. {
  385. memcpy(&mWAVBuffer[WAV_HEADER_SIZE], pcmout, (2 * fade_length)); /*Flawfinder: ignore*/
  386. }
  387. S32 near_end = mWAVBuffer.size() - (2 * fade_length);
  388. if ((S32)mWAVBuffer.size() >= ( near_end + 2* fade_length))
  389. {
  390. memcpy(pcmout, &mWAVBuffer[near_end], (2 * fade_length)); /*Flawfinder: ignore*/
  391. }
  392. llendianswizzle(&pcmout, 2, fade_length);
  393. samplep = (S16 *)pcmout;
  394. for (i = fade_length-1 ; i >=  0; i--)
  395. {
  396. *samplep = llfloor((F32)*samplep * ((F32)i/(F32)fade_length));
  397. samplep++;
  398. }
  399. llendianswizzle(&pcmout, 2, fade_length);
  400. if (near_end + (2 * fade_length) < (S32)mWAVBuffer.size())
  401. {
  402. memcpy(&mWAVBuffer[near_end], pcmout, (2 * fade_length));/*Flawfinder: ignore*/
  403. }
  404. }
  405. if (36 == data_length)
  406. {
  407. llwarns << "BAD Vorbis decode in finishDecode!" << llendl;
  408. mValid = FALSE;
  409. return TRUE; // we've finished
  410. }
  411. #if !defined(USE_WAV_VFILE)
  412. mBytesRead = -1;
  413. mFileHandle = LLLFSThread::sLocal->write(mOutFilename, &mWAVBuffer[0], 0, mWAVBuffer.size(),
  414.  new WriteResponder(this));
  415. #endif
  416. }
  417. if (mFileHandle != LLLFSThread::nullHandle())
  418. {
  419. if (mBytesRead >= 0)
  420. {
  421. if (mBytesRead == 0)
  422. {
  423. llwarns << "Unable to write file in LLVorbisDecodeState::finishDecode" << llendl;
  424. mValid = FALSE;
  425. return TRUE; // we've finished
  426. }
  427. }
  428. else
  429. {
  430. return FALSE; // not done
  431. }
  432. }
  433. mDone = TRUE;
  434. #if defined(USE_WAV_VFILE)
  435. // write the data.
  436. LLVFile output(gVFS, mUUID, LLAssetType::AT_SOUND_WAV);
  437. output.write(&mWAVBuffer[0], mWAVBuffer.size());
  438. #endif
  439. //llinfos << "Finished decode for " << getUUID() << llendl;
  440. return TRUE;
  441. }
  442. void LLVorbisDecodeState::flushBadFile()
  443. {
  444. if (mInFilep)
  445. {
  446. llwarns << "Flushing bad vorbis file from VFS for " << mUUID << llendl;
  447. mInFilep->remove();
  448. }
  449. }
  450. //////////////////////////////////////////////////////////////////////////////
  451. class LLAudioDecodeMgr::Impl
  452. {
  453. friend class LLAudioDecodeMgr;
  454. public:
  455. Impl() {};
  456. ~Impl() {};
  457. void processQueue(const F32 num_secs = 0.005);
  458. protected:
  459. LLLinkedQueue<LLUUID> mDecodeQueue;
  460. LLPointer<LLVorbisDecodeState> mCurrentDecodep;
  461. };
  462. void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
  463. {
  464. LLUUID uuid;
  465. LLTimer decode_timer;
  466. BOOL done = FALSE;
  467. while (!done)
  468. {
  469. if (mCurrentDecodep)
  470. {
  471. BOOL res;
  472. // Decode in a loop until we're done or have run out of time.
  473. while(!(res = mCurrentDecodep->decodeSection()) && (decode_timer.getElapsedTimeF32() < num_secs))
  474. {
  475. // decodeSection does all of the work above
  476. }
  477. if (mCurrentDecodep->isDone() && !mCurrentDecodep->isValid())
  478. {
  479. // We had an error when decoding, abort.
  480. llwarns << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << llendl;
  481. mCurrentDecodep->flushBadFile();
  482. LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
  483. adp->setHasValidData(FALSE);
  484. mCurrentDecodep = NULL;
  485. done = TRUE;
  486. }
  487. if (!res)
  488. {
  489. // We've used up out time slice, bail...
  490. done = TRUE;
  491. }
  492. else if (mCurrentDecodep)
  493. {
  494. if (mCurrentDecodep->finishDecode())
  495. {
  496. // We finished!
  497. if (mCurrentDecodep->isValid() && mCurrentDecodep->isDone())
  498. {
  499. LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
  500. adp->setHasDecodedData(TRUE);
  501. adp->setHasValidData(TRUE);
  502. // At this point, we could see if anyone needs this sound immediately, but
  503. // I'm not sure that there's a reason to - we need to poll all of the playing
  504. // sounds anyway.
  505. //llinfos << "Finished the vorbis decode, now what?" << llendl;
  506. }
  507. else
  508. {
  509. llinfos << "Vorbis decode failed!!!" << llendl;
  510. }
  511. mCurrentDecodep = NULL;
  512. }
  513. done = TRUE; // done for now
  514. }
  515. }
  516. if (!done)
  517. {
  518. if (!mDecodeQueue.getLength())
  519. {
  520. // Nothing else on the queue.
  521. done = TRUE;
  522. }
  523. else
  524. {
  525. LLUUID uuid;
  526. mDecodeQueue.pop(uuid);
  527. if (gAudiop->hasDecodedFile(uuid))
  528. {
  529. // This file has already been decoded, don't decode it again.
  530. continue;
  531. }
  532. lldebugs << "Decoding " << uuid << " from audio queue!" << llendl;
  533. std::string uuid_str;
  534. std::string d_path;
  535. LLTimer timer;
  536. timer.reset();
  537. uuid.toString(uuid_str);
  538. d_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf";
  539. mCurrentDecodep = new LLVorbisDecodeState(uuid, d_path);
  540. if (!mCurrentDecodep->initDecode())
  541. {
  542. mCurrentDecodep = NULL;
  543. }
  544. }
  545. }
  546. }
  547. }
  548. //////////////////////////////////////////////////////////////////////////////
  549. LLAudioDecodeMgr::LLAudioDecodeMgr()
  550. {
  551. mImpl = new Impl;
  552. }
  553. LLAudioDecodeMgr::~LLAudioDecodeMgr()
  554. {
  555. delete mImpl;
  556. }
  557. void LLAudioDecodeMgr::processQueue(const F32 num_secs)
  558. {
  559. mImpl->processQueue(num_secs);
  560. }
  561. BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
  562. {
  563. if (gAudiop->hasDecodedFile(uuid))
  564. {
  565. // Already have a decoded version, don't need to decode it.
  566. return TRUE;
  567. }
  568. if (gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
  569. {
  570. // Just put it on the decode queue.
  571. mImpl->mDecodeQueue.push(uuid);
  572. return TRUE;
  573. }
  574. return FALSE;
  575. }