Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

780 lines
23KB

  1. /*
  2. * Carla Native Plugins
  3. * Copyright (C) 2013-2019 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the GPL.txt file
  16. */
  17. #ifndef AUDIO_BASE_HPP_INCLUDED
  18. #define AUDIO_BASE_HPP_INCLUDED
  19. #include "CarlaThread.hpp"
  20. #include "CarlaMathUtils.hpp"
  21. extern "C" {
  22. #include "audio_decoder/ad.h"
  23. }
  24. #include "water/threads/ScopedLock.h"
  25. #include "water/threads/SpinLock.h"
  26. #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
  27. # pragma GCC diagnostic push
  28. # pragma GCC diagnostic ignored "-Weffc++"
  29. #endif
  30. #include "zita-resampler/resampler.h"
  31. #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
  32. # pragma GCC diagnostic pop
  33. #endif
  34. #ifdef CARLA_OS_WIN
  35. # include <windows.h>
  36. # define CARLA_MLOCK(ptr, size) VirtualLock((ptr), (size))
  37. #else
  38. # include <sys/mman.h>
  39. # define CARLA_MLOCK(ptr, size) mlock((ptr), (size))
  40. #endif
  41. typedef struct adinfo ADInfo;
  42. struct AudioFilePool {
  43. float* buffer[2];
  44. float* tmpbuf[2];
  45. uint32_t numFrames;
  46. volatile uint64_t startFrame;
  47. water::SpinLock mutex;
  48. #ifdef CARLA_PROPER_CPP11_SUPPORT
  49. AudioFilePool() noexcept
  50. : buffer{nullptr},
  51. tmpbuf{nullptr},
  52. numFrames(0),
  53. startFrame(0),
  54. mutex() {}
  55. #else
  56. AudioFilePool() noexcept
  57. : numFrames(0),
  58. startFrame(0),
  59. mutex()
  60. {
  61. buffer[0] = buffer[1] = nullptr;
  62. tmpbuf[0] = tmpbuf[1] = nullptr;
  63. }
  64. #endif
  65. ~AudioFilePool()
  66. {
  67. destroy();
  68. }
  69. void create(const uint32_t desiredNumFrames, const bool withTempBuffers)
  70. {
  71. CARLA_ASSERT(buffer[0] == nullptr);
  72. CARLA_ASSERT(buffer[1] == nullptr);
  73. CARLA_ASSERT(tmpbuf[0] == nullptr);
  74. CARLA_ASSERT(tmpbuf[1] == nullptr);
  75. CARLA_ASSERT(startFrame == 0);
  76. CARLA_ASSERT(numFrames == 0);
  77. buffer[0] = new float[desiredNumFrames];
  78. buffer[1] = new float[desiredNumFrames];
  79. CARLA_MLOCK(buffer[0], sizeof(float)*desiredNumFrames);
  80. CARLA_MLOCK(buffer[1], sizeof(float)*desiredNumFrames);
  81. if (withTempBuffers)
  82. {
  83. tmpbuf[0] = new float[desiredNumFrames];
  84. tmpbuf[1] = new float[desiredNumFrames];
  85. CARLA_MLOCK(tmpbuf[0], sizeof(float)*desiredNumFrames);
  86. CARLA_MLOCK(tmpbuf[1], sizeof(float)*desiredNumFrames);
  87. }
  88. reset(desiredNumFrames);
  89. }
  90. void destroy() noexcept
  91. {
  92. {
  93. const water::GenericScopedLock<water::SpinLock> gsl(mutex);
  94. startFrame = 0;
  95. numFrames = 0;
  96. }
  97. if (buffer[0] != nullptr)
  98. {
  99. delete[] buffer[0];
  100. buffer[0] = nullptr;
  101. }
  102. if (buffer[1] != nullptr)
  103. {
  104. delete[] buffer[1];
  105. buffer[1] = nullptr;
  106. }
  107. if (tmpbuf[0] != nullptr)
  108. {
  109. delete[] tmpbuf[0];
  110. tmpbuf[0] = nullptr;
  111. }
  112. if (tmpbuf[1] != nullptr)
  113. {
  114. delete[] tmpbuf[1];
  115. tmpbuf[1] = nullptr;
  116. }
  117. }
  118. void reset(const uint32_t desiredNumFrames) noexcept
  119. {
  120. if (desiredNumFrames != 0)
  121. {
  122. carla_zeroFloats(buffer[0], desiredNumFrames);
  123. carla_zeroFloats(buffer[1], desiredNumFrames);
  124. if (tmpbuf[0] != nullptr)
  125. carla_zeroFloats(tmpbuf[0], desiredNumFrames);
  126. if (tmpbuf[1] != nullptr)
  127. carla_zeroFloats(tmpbuf[1], desiredNumFrames);
  128. }
  129. const water::GenericScopedLock<water::SpinLock> gsl(mutex);
  130. {
  131. startFrame = 0;
  132. numFrames = desiredNumFrames;
  133. }
  134. }
  135. CARLA_DECLARE_NON_COPY_STRUCT(AudioFilePool)
  136. };
  137. class AudioFileReader
  138. {
  139. public:
  140. AudioFileReader()
  141. : fEntireFileLoaded(false),
  142. fLoopingMode(true),
  143. fNeedsFrame(0),
  144. fNeedsRead(false),
  145. fFilePtr(nullptr),
  146. fFileNfo(),
  147. fMaxFrame(0),
  148. fResampleRatio(0.0),
  149. fPollTempData(nullptr),
  150. fPollTempSize(0),
  151. fResampleTempData(nullptr),
  152. fResampleTempSize(0),
  153. fPool(),
  154. fResampler(),
  155. fReaderMutex()
  156. {
  157. static bool adInitiated = false;
  158. if (! adInitiated)
  159. {
  160. ad_init();
  161. adInitiated = true;
  162. }
  163. ad_clear_nfo(&fFileNfo);
  164. }
  165. ~AudioFileReader()
  166. {
  167. cleanup();
  168. }
  169. void cleanup()
  170. {
  171. fPool.destroy();
  172. fEntireFileLoaded = false;
  173. if (fFilePtr != nullptr)
  174. {
  175. ad_close(fFilePtr);
  176. fFilePtr = nullptr;
  177. }
  178. if (fPollTempData != nullptr)
  179. {
  180. delete[] fPollTempData;
  181. fPollTempData = nullptr;
  182. fPollTempSize = 0;
  183. }
  184. if (fResampleTempData != nullptr)
  185. {
  186. delete[] fResampleTempData;
  187. fResampleTempData = nullptr;
  188. fResampleTempSize = 0;
  189. }
  190. }
  191. void destroy()
  192. {
  193. const CarlaMutexLocker cml(fReaderMutex);
  194. fPool.destroy();
  195. fNeedsFrame = 0;
  196. fNeedsRead = false;
  197. }
  198. bool isEntireFileLoaded() const noexcept
  199. {
  200. return fEntireFileLoaded;
  201. }
  202. uint32_t getMaxFrame() const noexcept
  203. {
  204. return fMaxFrame;
  205. }
  206. uint64_t getPoolStartFrame() const noexcept
  207. {
  208. return fPool.startFrame;
  209. }
  210. uint32_t getPoolNumFrames() const noexcept
  211. {
  212. return fPool.numFrames;
  213. }
  214. ADInfo getFileInfo() const noexcept
  215. {
  216. return fFileNfo;
  217. }
  218. void setLoopingMode(const bool on) noexcept
  219. {
  220. fLoopingMode = on;
  221. }
  222. void setNeedsRead(const uint64_t frame) noexcept
  223. {
  224. if (fEntireFileLoaded)
  225. return;
  226. fNeedsFrame = frame;
  227. fNeedsRead = true;
  228. }
  229. bool loadFilename(const char* const filename, const uint32_t sampleRate,
  230. const uint32_t previewDataSize, float* previewData)
  231. {
  232. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && *filename != '\0', false);
  233. const CarlaMutexLocker cml(fReaderMutex);
  234. cleanup();
  235. ad_clear_nfo(&fFileNfo);
  236. // open new
  237. fFilePtr = ad_open(filename, &fFileNfo);
  238. if (fFilePtr == nullptr)
  239. return false;
  240. ad_dump_nfo(99, &fFileNfo);
  241. // Fix for misinformation using libsndfile
  242. if (fFileNfo.frames % fFileNfo.channels)
  243. --fFileNfo.frames;
  244. if (fFileNfo.frames <= 0)
  245. carla_stderr("L: filename \"%s\" has 0 frames", filename);
  246. if ((fFileNfo.channels == 1 || fFileNfo.channels == 2) && fFileNfo.frames > 0)
  247. {
  248. // valid
  249. const uint32_t fileNumFrames = static_cast<uint32_t>(fFileNfo.frames);
  250. const uint32_t maxPoolNumFrames = sampleRate * 30;
  251. const bool needsResample = fFileNfo.sample_rate != sampleRate;
  252. if (needsResample)
  253. {
  254. if (! fResampler.setup(fFileNfo.sample_rate, sampleRate, fFileNfo.channels, 32))
  255. {
  256. ad_clear_nfo(&fFileNfo);
  257. ad_close(fFilePtr);
  258. fFilePtr = nullptr;
  259. carla_stderr2("loadFilename error, resampler setup failed");
  260. return false;
  261. }
  262. fResampleRatio = static_cast<double>(sampleRate) / static_cast<double>(fFileNfo.sample_rate);
  263. }
  264. else
  265. {
  266. fResampler.clear();
  267. fResampleRatio = 0.0;
  268. }
  269. if (fileNumFrames <= maxPoolNumFrames)
  270. {
  271. // entire file fits in a small pool, lets read it now
  272. fPool.create(needsResample ? static_cast<uint32_t>(static_cast<double>(fileNumFrames) * fResampleRatio + 0.5)
  273. : fileNumFrames, false);
  274. readEntireFileIntoPool(needsResample);
  275. ad_close(fFilePtr);
  276. fFilePtr = nullptr;
  277. const float fileNumFramesF = static_cast<float>(fileNumFrames);
  278. const float previewDataSizeF = static_cast<float>(previewDataSize);
  279. for (uint i=0; i<previewDataSize; ++i)
  280. {
  281. const float stepF = static_cast<float>(i)/previewDataSizeF * fileNumFramesF;
  282. const uint step = carla_fixedValue(0U, fileNumFrames-1U, static_cast<uint>(stepF + 0.5f));
  283. previewData[i] = fPool.buffer[0][step];
  284. }
  285. }
  286. else
  287. {
  288. // file is too big for our audio pool, we need an extra buffer
  289. const uint32_t poolNumFrames = sampleRate * 1;
  290. const uint pollTempSize = poolNumFrames * fFileNfo.channels;
  291. uint resampleTempSize = 0;
  292. readFilePreview(previewDataSize, previewData);
  293. fPool.create(poolNumFrames, true);
  294. try {
  295. fPollTempData = new float[pollTempSize];
  296. } catch (...) {
  297. ad_clear_nfo(&fFileNfo);
  298. ad_close(fFilePtr);
  299. fFilePtr = nullptr;
  300. carla_stderr2("loadFilename error, out of memory");
  301. return false;
  302. }
  303. CARLA_MLOCK(fPollTempData, sizeof(float)*pollTempSize);
  304. if (needsResample)
  305. {
  306. resampleTempSize = static_cast<uint32_t>(static_cast<double>(poolNumFrames) * fResampleRatio + 0.5);
  307. resampleTempSize *= fFileNfo.channels;
  308. try {
  309. fResampleTempData = new float[resampleTempSize];
  310. } catch (...) {
  311. delete[] fPollTempData;
  312. fPollTempData = nullptr;
  313. ad_clear_nfo(&fFileNfo);
  314. ad_close(fFilePtr);
  315. fFilePtr = nullptr;
  316. carla_stderr2("loadFilename error, out of memory");
  317. return false;
  318. }
  319. CARLA_MLOCK(fResampleTempData, sizeof(float)*resampleTempSize);
  320. }
  321. fPollTempSize = pollTempSize;
  322. fResampleTempSize = resampleTempSize;
  323. }
  324. fMaxFrame = carla_isNotZero(fResampleRatio)
  325. ? static_cast<uint32_t>(static_cast<double>(fileNumFrames) * fResampleRatio + 0.5)
  326. : fileNumFrames;
  327. fNeedsRead = true;
  328. return true;
  329. }
  330. else
  331. {
  332. // invalid
  333. ad_clear_nfo(&fFileNfo);
  334. ad_close(fFilePtr);
  335. fFilePtr = nullptr;
  336. return false;
  337. }
  338. }
  339. void putAndSwapAllData(AudioFilePool& pool)
  340. {
  341. const water::GenericScopedLock<water::SpinLock> gsl1(fPool.mutex);
  342. const water::GenericScopedLock<water::SpinLock> gsl2(pool.mutex);
  343. CARLA_SAFE_ASSERT_RETURN(fPool.numFrames != 0,);
  344. CARLA_SAFE_ASSERT_RETURN(pool.numFrames == 0,);
  345. CARLA_SAFE_ASSERT_RETURN(fPool.tmpbuf[0] == nullptr,);
  346. CARLA_SAFE_ASSERT_RETURN(pool.tmpbuf[0] == nullptr,);
  347. pool.startFrame = fPool.startFrame;
  348. pool.numFrames = fPool.numFrames;
  349. pool.buffer[0] = fPool.buffer[0];
  350. pool.buffer[1] = fPool.buffer[1];
  351. fPool.startFrame = 0;
  352. fPool.numFrames = 0;
  353. fPool.buffer[0] = nullptr;
  354. fPool.buffer[1] = nullptr;
  355. }
  356. bool tryPutData(float* const out1,
  357. float* const out2,
  358. uint64_t framePos,
  359. const uint32_t frames,
  360. const bool isOffline,
  361. bool& needsRead)
  362. {
  363. const water::GenericScopedLock<water::SpinLock> gsl(fPool.mutex);
  364. CARLA_SAFE_ASSERT_RETURN(fPool.numFrames != 0, false);
  365. if (framePos >= fMaxFrame)
  366. {
  367. if (fLoopingMode)
  368. framePos %= fMaxFrame;
  369. else
  370. return false;
  371. }
  372. uint64_t frameDiff;
  373. const uint64_t numFramesNearEnd = fPool.numFrames*3/5;
  374. if (framePos < fPool.startFrame)
  375. {
  376. if (fPool.startFrame + fPool.numFrames <= fMaxFrame)
  377. {
  378. needsRead = true;
  379. setNeedsRead(framePos);
  380. return false;
  381. }
  382. frameDiff = framePos + (fMaxFrame - fPool.startFrame);
  383. if (frameDiff + frames >= fPool.numFrames)
  384. {
  385. needsRead = true;
  386. setNeedsRead(framePos);
  387. return false;
  388. }
  389. carla_copyFloats(out1, fPool.buffer[0] + frameDiff, frames);
  390. carla_copyFloats(out2, fPool.buffer[1] + frameDiff, frames);
  391. }
  392. else
  393. {
  394. frameDiff = framePos - fPool.startFrame;
  395. if (frameDiff + frames >= fPool.numFrames)
  396. {
  397. needsRead = true;
  398. setNeedsRead(framePos);
  399. return false;
  400. }
  401. carla_copyFloats(out1, fPool.buffer[0] + frameDiff, frames);
  402. carla_copyFloats(out2, fPool.buffer[1] + frameDiff, frames);
  403. }
  404. if (frameDiff > numFramesNearEnd)
  405. {
  406. needsRead = true;
  407. setNeedsRead(framePos + (isOffline ? 0 : frames));
  408. }
  409. return true;
  410. }
  411. void readFilePreview(const uint32_t previewDataSize, float* previewData)
  412. {
  413. carla_zeroFloats(previewData, previewDataSize);
  414. const uint fileNumFrames = static_cast<uint>(fFileNfo.frames);
  415. const float fileNumFramesF = static_cast<float>(fileNumFrames);
  416. const float previewDataSizeF = static_cast<float>(previewDataSize);
  417. for (uint i=0; i<previewDataSize; ++i)
  418. {
  419. const float posF = static_cast<float>(i)/previewDataSizeF * fileNumFramesF;
  420. const uint pos = carla_fixedValue(0U, fileNumFrames-2U, static_cast<uint>(posF + 0.5f));
  421. ad_seek(fFilePtr, pos);
  422. ad_read(fFilePtr, previewData + i, 2);
  423. }
  424. }
  425. void readEntireFileIntoPool(const bool needsResample)
  426. {
  427. CARLA_SAFE_ASSERT_RETURN(fPool.numFrames > 0,);
  428. const uint numChannels = fFileNfo.channels;
  429. const uint fileNumFrames = static_cast<uint>(fFileNfo.frames);
  430. const uint bufferSize = fileNumFrames * numChannels;
  431. float* const buffer = (float*)std::calloc(bufferSize, sizeof(float));
  432. CARLA_SAFE_ASSERT_RETURN(buffer != nullptr,);
  433. ad_seek(fFilePtr, 0);
  434. ssize_t rv = ad_read(fFilePtr, buffer, bufferSize);
  435. CARLA_SAFE_ASSERT_INT2_RETURN(rv == static_cast<ssize_t>(bufferSize),
  436. static_cast<int>(rv),
  437. static_cast<int>(bufferSize),
  438. std::free(buffer));
  439. float* rbuffer;
  440. if (needsResample)
  441. {
  442. const uint rbufferSize = fPool.numFrames * numChannels;
  443. rbuffer = (float*)std::calloc(rbufferSize, sizeof(float));
  444. CARLA_SAFE_ASSERT_RETURN(rbuffer != nullptr, std::free(buffer););
  445. rv = static_cast<ssize_t>(rbufferSize);
  446. fResampler.inp_count = fileNumFrames;
  447. fResampler.out_count = fPool.numFrames;
  448. fResampler.inp_data = buffer;
  449. fResampler.out_data = rbuffer;
  450. fResampler.process();
  451. CARLA_SAFE_ASSERT_INT(fResampler.inp_count <= 2, fResampler.inp_count);
  452. }
  453. else
  454. {
  455. rbuffer = buffer;
  456. }
  457. {
  458. // lock, and put data asap
  459. const water::GenericScopedLock<water::SpinLock> gsl(fPool.mutex);
  460. if (numChannels == 1)
  461. {
  462. for (ssize_t i=0, j=0; j < rv; ++i, ++j)
  463. fPool.buffer[0][i] = fPool.buffer[1][i] = rbuffer[j];
  464. }
  465. else
  466. {
  467. for (ssize_t i=0, j=0; j < rv; ++j)
  468. {
  469. if (j % 2 == 0)
  470. {
  471. fPool.buffer[0][i] = rbuffer[j];
  472. }
  473. else
  474. {
  475. fPool.buffer[1][i] = rbuffer[j];
  476. ++i;
  477. }
  478. }
  479. }
  480. }
  481. if (rbuffer != buffer)
  482. std::free(rbuffer);
  483. std::free(buffer);
  484. fEntireFileLoaded = true;
  485. }
  486. void readPoll()
  487. {
  488. const CarlaMutexLocker cml(fReaderMutex);
  489. if (fMaxFrame == 0 || fFileNfo.channels == 0 || fFilePtr == nullptr)
  490. {
  491. carla_debug("R: no song loaded");
  492. fNeedsFrame = 0;
  493. fNeedsRead = false;
  494. return;
  495. }
  496. if (fPollTempData == nullptr)
  497. {
  498. carla_debug("R: nothing to poll");
  499. fNeedsFrame = 0;
  500. fNeedsRead = false;
  501. return;
  502. }
  503. uint64_t lastFrame = fNeedsFrame;
  504. int64_t readFrameCheck;
  505. if (lastFrame >= fMaxFrame)
  506. {
  507. if (fLoopingMode)
  508. {
  509. const uint64_t readFrameCheckLoop = lastFrame % fMaxFrame;
  510. CARLA_SAFE_ASSERT_RETURN(readFrameCheckLoop < INT32_MAX,);
  511. carla_debug("R: transport out of bounds for loop");
  512. readFrameCheck = static_cast<int64_t>(readFrameCheckLoop);
  513. }
  514. else
  515. {
  516. carla_debug("R: transport out of bounds");
  517. fNeedsFrame = 0;
  518. fNeedsRead = false;
  519. return;
  520. }
  521. }
  522. else
  523. {
  524. CARLA_SAFE_ASSERT_RETURN(lastFrame < INT32_MAX,);
  525. readFrameCheck = static_cast<int64_t>(lastFrame);
  526. }
  527. const int64_t readFrame = readFrameCheck;
  528. // temp data buffer
  529. carla_zeroFloats(fPollTempData, fPollTempSize);
  530. {
  531. #if 0
  532. const int32_t sampleRate = 44100;
  533. carla_debug("R: poll data - reading at frame %li, time %li:%02li, lastFrame %li",
  534. readFrame, readFrame/sampleRate/60, (readFrame/sampleRate) % 60, lastFrame);
  535. #endif
  536. const int64_t readFrameReal = carla_isNotZero(fResampleRatio)
  537. ? static_cast<int64_t>(static_cast<double>(readFrame) / fResampleRatio + 0.5)
  538. : readFrame;
  539. ad_seek(fFilePtr, readFrameReal);
  540. size_t i = 0;
  541. ssize_t j = 0;
  542. ssize_t rv = ad_read(fFilePtr, fPollTempData, fPollTempSize);
  543. if (rv < 0)
  544. {
  545. carla_stderr("R: ad_read1 failed");
  546. fNeedsFrame = 0;
  547. fNeedsRead = false;
  548. return;
  549. }
  550. const size_t urv = static_cast<size_t>(rv);
  551. // see if we can read more
  552. if (readFrameReal + rv >= static_cast<ssize_t>(fFileNfo.frames) && urv < fPollTempSize)
  553. {
  554. carla_debug("R: from start");
  555. ad_seek(fFilePtr, 0);
  556. j = ad_read(fFilePtr, fPollTempData+urv, fPollTempSize-urv);
  557. if (j < 0)
  558. {
  559. carla_stderr("R: ad_read2 failed");
  560. fNeedsFrame = 0;
  561. fNeedsRead = false;
  562. return;
  563. }
  564. rv += j;
  565. }
  566. carla_debug("R: reading %li frames at frame %lu", rv, readFrameCheck);
  567. // local copy
  568. const uint32_t poolNumFrames = fPool.numFrames;
  569. float* const pbuffer0 = fPool.tmpbuf[0];
  570. float* const pbuffer1 = fPool.tmpbuf[1];
  571. const float* tmpbuf = fPollTempData;
  572. // resample as needed
  573. if (fResampleTempSize != 0)
  574. {
  575. tmpbuf = fResampleTempData;
  576. fResampler.inp_count = static_cast<uint>(rv / fFileNfo.channels);
  577. fResampler.out_count = fResampleTempSize / fFileNfo.channels;
  578. fResampler.inp_data = fPollTempData;
  579. fResampler.out_data = fResampleTempData;
  580. fResampler.process();
  581. CARLA_ASSERT_INT(fResampler.inp_count <= 1, fResampler.inp_count);
  582. }
  583. j = 0;
  584. do {
  585. if (fFileNfo.channels == 1)
  586. {
  587. for (; i < poolNumFrames && j < rv; ++i, ++j)
  588. pbuffer0[i] = pbuffer1[i] = tmpbuf[j];
  589. }
  590. else
  591. {
  592. for (; i < poolNumFrames && j < rv; ++j)
  593. {
  594. if (j % 2 == 0)
  595. {
  596. pbuffer0[i] = tmpbuf[j];
  597. }
  598. else
  599. {
  600. pbuffer1[i] = tmpbuf[j];
  601. ++i;
  602. }
  603. }
  604. }
  605. if (i >= poolNumFrames)
  606. break;
  607. if (rv == fFileNfo.frames)
  608. {
  609. // full file read
  610. j = 0;
  611. carla_debug("R: full file was read, filling buffers again");
  612. }
  613. else
  614. {
  615. carla_debug("read break, not enough space");
  616. carla_zeroFloats(pbuffer0, poolNumFrames - i);
  617. carla_zeroFloats(pbuffer1, poolNumFrames - i);
  618. break;
  619. }
  620. } while (i < poolNumFrames);
  621. // lock, and put data asap
  622. const water::GenericScopedLock<water::SpinLock> gsl(fPool.mutex);
  623. std::memcpy(fPool.buffer[0], pbuffer0, sizeof(float)*poolNumFrames);
  624. std::memcpy(fPool.buffer[1], pbuffer1, sizeof(float)*poolNumFrames);
  625. fPool.startFrame = static_cast<uint64_t>(readFrame);
  626. }
  627. fNeedsRead = false;
  628. }
  629. private:
  630. bool fEntireFileLoaded;
  631. bool fLoopingMode;
  632. volatile uint64_t fNeedsFrame;
  633. volatile bool fNeedsRead;
  634. void* fFilePtr;
  635. ADInfo fFileNfo;
  636. uint32_t fMaxFrame;
  637. double fResampleRatio;
  638. float* fPollTempData;
  639. uint fPollTempSize;
  640. float* fResampleTempData;
  641. uint fResampleTempSize;
  642. AudioFilePool fPool;
  643. Resampler fResampler;
  644. CarlaMutex fReaderMutex;
  645. CARLA_DECLARE_NON_COPY_STRUCT(AudioFileReader)
  646. };
  647. #endif // AUDIO_BASE_HPP_INCLUDED