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.

773 lines
26KB

  1. /*
  2. * Carla Native Plugins
  3. * Copyright (C) 2013-2023 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 "CarlaMathUtils.hpp"
  20. #include "CarlaMemUtils.hpp"
  21. #include "CarlaRingBuffer.hpp"
  22. extern "C" {
  23. #include "audio_decoder/ad.h"
  24. }
  25. // #include "water/threads/ScopedLock.h"
  26. // #include "water/threads/SpinLock.h"
  27. #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
  28. # pragma GCC diagnostic push
  29. # pragma GCC diagnostic ignored "-Weffc++"
  30. #endif
  31. #include "zita-resampler/resampler.h"
  32. #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
  33. # pragma GCC diagnostic pop
  34. #endif
  35. #define DEBUG_FILE_OPS
  36. typedef struct adinfo ADInfo;
  37. // --------------------------------------------------------------------------------------------------------------------
  38. // tuning
  39. // disk streaming buffer size
  40. static constexpr const uint16_t kFileReaderBufferSize = 1024;
  41. // if reading a file smaller than this, load it all in memory
  42. static constexpr const uint16_t kMinLengthSeconds = 30;
  43. // size of the audio file ring buffer
  44. static constexpr const uint16_t kRingBufferLengthSeconds = 6;
  45. // --------------------------------------------------------------------------------------------------------------------
  46. struct AudioMemoryPool {
  47. float* buffer[2] = {};
  48. uint32_t numFrames = 0;
  49. CarlaMutex mutex;
  50. AudioMemoryPool() noexcept {}
  51. ~AudioMemoryPool() noexcept
  52. {
  53. destroy();
  54. }
  55. void create(const uint32_t desiredNumFrames)
  56. {
  57. CARLA_ASSERT(buffer[0] == nullptr);
  58. CARLA_ASSERT(buffer[1] == nullptr);
  59. CARLA_ASSERT(numFrames == 0);
  60. buffer[0] = new float[desiredNumFrames];
  61. buffer[1] = new float[desiredNumFrames];
  62. carla_mlock(buffer[0], sizeof(float)*desiredNumFrames);
  63. carla_mlock(buffer[1], sizeof(float)*desiredNumFrames);
  64. const CarlaMutexLocker cml(mutex);
  65. numFrames = desiredNumFrames;
  66. }
  67. void destroy() noexcept
  68. {
  69. {
  70. const CarlaMutexLocker cml(mutex);
  71. numFrames = 0;
  72. }
  73. if (buffer[0] != nullptr)
  74. {
  75. delete[] buffer[0];
  76. buffer[0] = nullptr;
  77. }
  78. if (buffer[1] != nullptr)
  79. {
  80. delete[] buffer[1];
  81. buffer[1] = nullptr;
  82. }
  83. }
  84. CARLA_DECLARE_NON_COPYABLE(AudioMemoryPool)
  85. };
  86. // --------------------------------------------------------------------------------------------------------------------
  87. class AudioFileReader
  88. {
  89. public:
  90. AudioFileReader()
  91. {
  92. ad_clear_nfo(&fFileNfo);
  93. }
  94. ~AudioFileReader()
  95. {
  96. destroy();
  97. }
  98. void destroy()
  99. {
  100. const CarlaMutexLocker cml(fReaderMutex);
  101. cleanup();
  102. }
  103. int getCurrentBitRate() const noexcept
  104. {
  105. return fCurrentBitRate;
  106. }
  107. float getLastPlayPosition() const noexcept
  108. {
  109. return fLastPlayPosition;
  110. }
  111. float getReadableBufferFill() const noexcept
  112. {
  113. if (fFileNfo.channels == 0)
  114. return 0.f;
  115. if (fEntireFileLoaded)
  116. return 1.f;
  117. return 1.f - (static_cast<float>(fRingBufferR.getReadableDataSize() / sizeof(float))
  118. / static_cast<float>(fRingBufferR.getSize() / sizeof(float)));
  119. }
  120. ADInfo getFileInfo() const noexcept
  121. {
  122. return fFileNfo;
  123. }
  124. bool loadFilename(const char* const filename, const uint32_t sampleRate, const bool quad2ndChannels,
  125. const uint32_t previewDataSize, float* previewData)
  126. {
  127. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && *filename != '\0', false);
  128. const CarlaMutexLocker cml(fReaderMutex);
  129. cleanup();
  130. ad_clear_nfo(&fFileNfo);
  131. // open new
  132. fFilePtr = ad_open(filename, &fFileNfo);
  133. if (fFilePtr == nullptr)
  134. return false;
  135. ad_dump_nfo(99, &fFileNfo);
  136. // invalid
  137. if ((fFileNfo.channels != 1 && fFileNfo.channels != 2 && fFileNfo.channels != 4) || fFileNfo.frames <= 0)
  138. {
  139. if (fFileNfo.channels != 1 && fFileNfo.channels != 2 && fFileNfo.channels != 4)
  140. carla_stderr("loadFilename(\"%s\", ...) has not 1, 2 or 4 channels", filename);
  141. if (fFileNfo.frames <= 0)
  142. carla_stderr("loadFilename(\"%s\", ...) has 0 frames", filename);
  143. ad_clear_nfo(&fFileNfo);
  144. ad_close(fFilePtr);
  145. fFilePtr = nullptr;
  146. return false;
  147. }
  148. const uint64_t numFileFrames = static_cast<uint64_t>(fFileNfo.frames);
  149. const bool needsResample = fFileNfo.sample_rate != sampleRate;
  150. uint64_t numResampledFrames;
  151. if (needsResample)
  152. {
  153. if (! fResampler.setup(fFileNfo.sample_rate, sampleRate, fFileNfo.channels, 32))
  154. {
  155. ad_clear_nfo(&fFileNfo);
  156. ad_close(fFilePtr);
  157. fFilePtr = nullptr;
  158. carla_stderr2("loadFilename(\"%s\", ...) error, resampler setup failed");
  159. return false;
  160. }
  161. fResampleRatio = static_cast<double>(sampleRate) / static_cast<double>(fFileNfo.sample_rate);
  162. numResampledFrames = static_cast<uint64_t>(static_cast<double>(numFileFrames) * fResampleRatio + 0.5);
  163. if (fPreviousResampledBuffer.buffer == nullptr)
  164. fPreviousResampledBuffer.buffer = new float[kFileReaderBufferSize];
  165. }
  166. else
  167. {
  168. numResampledFrames = numFileFrames;
  169. }
  170. fQuad2ndChannels = quad2ndChannels;
  171. if (fFileNfo.can_seek == 0 || numResampledFrames <= sampleRate * kMinLengthSeconds)
  172. {
  173. // read and cache the first few seconds of the file if seekable
  174. const uint64_t initialFrames = fFileNfo.can_seek == 0
  175. ? numFileFrames
  176. : std::min<uint64_t>(numFileFrames, fFileNfo.sample_rate * kMinLengthSeconds);
  177. const uint64_t initialResampledFrames = fFileNfo.can_seek == 0
  178. ? numResampledFrames
  179. : std::min<uint64_t>(numResampledFrames,
  180. sampleRate * kMinLengthSeconds);
  181. fInitialMemoryPool.create(initialResampledFrames);
  182. readIntoInitialMemoryPool(initialFrames, initialResampledFrames);
  183. // file is no longer needed, we have it all in memory
  184. ad_close(fFilePtr);
  185. fFilePtr = nullptr;
  186. const float resampledFramesF = static_cast<float>(numResampledFrames);
  187. const float previewDataSizeF = static_cast<float>(previewDataSize);
  188. for (uint i=0; i<previewDataSize; ++i)
  189. {
  190. const float stepF = static_cast<float>(i)/previewDataSizeF * resampledFramesF;
  191. const uint step = carla_fixedValue<uint64_t>(0, numResampledFrames-1, static_cast<uint>(stepF + 0.5f));
  192. previewData[i] = std::max(std::fabs(fInitialMemoryPool.buffer[0][step]),
  193. std::fabs(fInitialMemoryPool.buffer[1][step]));
  194. }
  195. fEntireFileLoaded = true;
  196. }
  197. else
  198. {
  199. readFilePreview(previewDataSize, previewData);
  200. // cache only the first few initial seconds, let disk streaming handle the rest
  201. const uint64_t initialFrames = std::min<uint64_t>(numFileFrames,
  202. fFileNfo.sample_rate * kRingBufferLengthSeconds / 2);
  203. const uint64_t initialResampledFrames = std::min<uint64_t>(numResampledFrames,
  204. sampleRate * kRingBufferLengthSeconds / 2);
  205. fRingBufferL.createBuffer(sampleRate * kRingBufferLengthSeconds * sizeof(float), true);
  206. fRingBufferR.createBuffer(sampleRate * kRingBufferLengthSeconds * sizeof(float), true);
  207. fInitialMemoryPool.create(initialResampledFrames);
  208. readIntoInitialMemoryPool(initialFrames, initialResampledFrames);
  209. fRingBufferL.writeCustomData(fInitialMemoryPool.buffer[0], fInitialMemoryPool.numFrames * sizeof(float));
  210. fRingBufferR.writeCustomData(fInitialMemoryPool.buffer[1], fInitialMemoryPool.numFrames * sizeof(float));
  211. fRingBufferL.commitWrite();
  212. fRingBufferR.commitWrite();
  213. fEntireFileLoaded = false;
  214. }
  215. fTotalResampledFrames = numResampledFrames;
  216. fSampleRate = sampleRate;
  217. return true;
  218. }
  219. bool tickFrames(float* const buffers[],
  220. uint32_t bufferOffset, uint32_t frames, uint64_t framePos,
  221. const bool loopingMode, const bool isOffline)
  222. {
  223. float* outL = buffers[0] + bufferOffset;
  224. float* outR = buffers[1] + bufferOffset;
  225. float* playCV = buffers[2] + bufferOffset;
  226. if (loopingMode && framePos >= fTotalResampledFrames)
  227. framePos %= fTotalResampledFrames;
  228. if (framePos >= fTotalResampledFrames)
  229. {
  230. carla_zeroFloats(outL, frames);
  231. carla_zeroFloats(outR, frames);
  232. carla_zeroFloats(playCV, frames);
  233. fLastPlayPosition = 1.f;
  234. return false;
  235. }
  236. uint32_t numPoolFrames, usableFrames;
  237. {
  238. const CarlaMutexTryLocker cmtl(fInitialMemoryPool.mutex, isOffline);
  239. numPoolFrames = fInitialMemoryPool.numFrames;
  240. if (numPoolFrames == 0 || ! cmtl.wasLocked())
  241. {
  242. carla_zeroFloats(outL, frames);
  243. carla_zeroFloats(outR, frames);
  244. carla_zeroFloats(playCV, frames);
  245. return false;
  246. }
  247. if (framePos < numPoolFrames)
  248. {
  249. usableFrames = std::min(frames, numPoolFrames - static_cast<uint32_t>(framePos));
  250. carla_copyFloats(outL, fInitialMemoryPool.buffer[0] + framePos, usableFrames);
  251. carla_copyFloats(outR, fInitialMemoryPool.buffer[1] + framePos, usableFrames);
  252. carla_fillFloatsWithSingleValue(playCV, 10.f, usableFrames);
  253. outL += usableFrames;
  254. outR += usableFrames;
  255. playCV += usableFrames;
  256. bufferOffset += usableFrames;
  257. framePos += usableFrames;
  258. frames -= usableFrames;
  259. }
  260. if (fEntireFileLoaded && frames != 0)
  261. return tickFrames(buffers, bufferOffset, frames, framePos, loopingMode, isOffline);
  262. }
  263. fLastPlayPosition = static_cast<float>(framePos / 64) / static_cast<float>(fTotalResampledFrames / 64);
  264. if (fEntireFileLoaded)
  265. return false;
  266. if (frames == 0)
  267. {
  268. // ring buffer is good, waiting for data reads
  269. if (fRingBufferFramePos == numPoolFrames)
  270. return false;
  271. // out of bounds, host likely has repositioned transport
  272. if (fRingBufferFramePos > numPoolFrames)
  273. {
  274. fNextFileReadPos = 0;
  275. carla_stdout("tickFrames read from start");
  276. return true;
  277. }
  278. // within bounds, skip frames until we reach the end of the memory pool
  279. if (fRingBufferR.getReadableDataSize() >= numPoolFrames * sizeof(float))
  280. {
  281. fRingBufferL.skipRead(numPoolFrames * sizeof(float));
  282. fRingBufferR.skipRead(numPoolFrames * sizeof(float));
  283. fRingBufferFramePos = numPoolFrames;
  284. carla_stdout("tickFrames adjusted frame pos from start");
  285. }
  286. return true;
  287. }
  288. uint32_t totalFramesAvailable = fRingBufferR.getReadableDataSize() / sizeof(float);
  289. if (framePos != fRingBufferFramePos)
  290. {
  291. // unaligned position, see if we need to relocate too
  292. if (framePos < fRingBufferFramePos || framePos >= fRingBufferFramePos + totalFramesAvailable - frames)
  293. {
  294. carla_zeroFloats(outL, frames);
  295. carla_zeroFloats(outR, frames);
  296. carla_zeroFloats(playCV, frames);
  297. // wait until there previous relocation is done
  298. if (fNextFileReadPos == -1)
  299. fNextFileReadPos = framePos;
  300. return true;
  301. }
  302. // oh nice, we can skip a few frames and be in sync
  303. const uint32_t diffFrames = framePos - fRingBufferFramePos;
  304. fRingBufferL.skipRead(diffFrames * sizeof(float));
  305. fRingBufferR.skipRead(diffFrames * sizeof(float));
  306. totalFramesAvailable -= diffFrames;
  307. fRingBufferFramePos = framePos;
  308. carla_stdout("tickFrames adjusted frame unaligned position");
  309. }
  310. usableFrames = std::min<uint32_t>(frames, totalFramesAvailable);
  311. if (usableFrames == 0)
  312. {
  313. carla_stdout("tickFrames no more usable frames %lu %lu %u", framePos, fRingBufferFramePos, totalFramesAvailable);
  314. carla_zeroFloats(outL, frames);
  315. carla_zeroFloats(outR, frames);
  316. carla_zeroFloats(playCV, frames);
  317. return framePos < fTotalResampledFrames;
  318. }
  319. fRingBufferL.readCustomData(outL, sizeof(float) * usableFrames);
  320. fRingBufferR.readCustomData(outR, sizeof(float) * usableFrames);
  321. carla_fillFloatsWithSingleValue(playCV, 10.f, usableFrames);
  322. fRingBufferFramePos += usableFrames;
  323. totalFramesAvailable -= usableFrames;
  324. if (frames != usableFrames)
  325. {
  326. if (loopingMode)
  327. {
  328. bufferOffset += usableFrames;
  329. framePos += usableFrames;
  330. frames -= usableFrames;
  331. carla_stdout("tickFrames looping return");
  332. return tickFrames(buffers, bufferOffset, frames, framePos, loopingMode, isOffline);
  333. }
  334. carla_stdout("tickFrames partial usable frames");
  335. carla_zeroFloats(outL + usableFrames, frames - usableFrames);
  336. carla_zeroFloats(outR + usableFrames, frames - usableFrames);
  337. carla_zeroFloats(playCV + usableFrames, frames - usableFrames);
  338. }
  339. return totalFramesAvailable <= fSampleRate * 2;
  340. }
  341. void readFilePreview(uint32_t previewDataSize, float* const previewData)
  342. {
  343. carla_zeroFloats(previewData, previewDataSize);
  344. if (fFileNfo.can_seek == 0)
  345. return;
  346. const uint fileNumFrames = static_cast<uint>(fFileNfo.frames);
  347. const float fileNumFramesF = static_cast<float>(fileNumFrames);
  348. const float previewDataSizeF = static_cast<float>(previewDataSize);
  349. const uint samplesPerRun = fFileNfo.channels;
  350. const uint maxSampleToRead = fileNumFrames - samplesPerRun;
  351. CARLA_SAFE_ASSERT_INT_RETURN(samplesPerRun == 1 || samplesPerRun == 2 || samplesPerRun == 4, samplesPerRun,);
  352. float tmp[4];
  353. if (samplesPerRun == 4)
  354. previewDataSize -= 3;
  355. else if (samplesPerRun == 2)
  356. previewDataSize -= 1;
  357. for (uint i=0; i<previewDataSize; ++i)
  358. {
  359. const float posF = static_cast<float>(i)/previewDataSizeF * fileNumFramesF;
  360. const uint pos = carla_fixedValue(0U, maxSampleToRead, static_cast<uint>(posF));
  361. ad_seek(fFilePtr, pos);
  362. ad_read(fFilePtr, tmp, samplesPerRun);
  363. previewData[i] = std::max(std::fabs(tmp[0]), std::fabs(tmp[1]));
  364. }
  365. }
  366. void readPoll()
  367. {
  368. const CarlaMutexLocker cml(fReaderMutex);
  369. const uint channels = fFileNfo.channels;
  370. if (channels == 0 || fFilePtr == nullptr)
  371. {
  372. carla_debug("R: no song loaded");
  373. return;
  374. }
  375. fCurrentBitRate = ad_get_bitrate(fFilePtr);
  376. const bool needsResample = carla_isNotEqual(fResampleRatio, 1.0);
  377. const int64_t nextFileReadPos = fNextFileReadPos;
  378. if (nextFileReadPos != -1)
  379. {
  380. carla_stdout("readPoll new pos %lu", nextFileReadPos);
  381. fRingBufferL.flush();
  382. fRingBufferR.flush();
  383. fPreviousResampledBuffer.frames = 0;
  384. fRingBufferFramePos = nextFileReadPos;
  385. ad_seek(fFilePtr, nextFileReadPos / fResampleRatio);
  386. if (needsResample)
  387. fResampler.reset();
  388. }
  389. if (needsResample)
  390. {
  391. float buffer[kFileReaderBufferSize];
  392. float rbuffer[kFileReaderBufferSize];
  393. ssize_t r;
  394. uint prev_inp_count = 0;
  395. while (fRingBufferR.getWritableDataSize() >= sizeof(rbuffer))
  396. {
  397. if (const uint32_t oldframes = fPreviousResampledBuffer.frames)
  398. {
  399. prev_inp_count = oldframes;
  400. fPreviousResampledBuffer.frames = 0;
  401. std::memcpy(buffer, fPreviousResampledBuffer.buffer, sizeof(float) * oldframes * channels);
  402. }
  403. else if (prev_inp_count != 0)
  404. {
  405. std::memmove(buffer,
  406. buffer + (sizeof(buffer) / sizeof(float) - prev_inp_count * channels),
  407. sizeof(float) * prev_inp_count * channels);
  408. }
  409. r = ad_read(fFilePtr,
  410. buffer + (prev_inp_count * channels),
  411. sizeof(buffer) / sizeof(float) - (prev_inp_count * channels));
  412. if (r < 0)
  413. {
  414. carla_stderr("R: ad_read failed");
  415. break;
  416. }
  417. if (r == 0)
  418. break;
  419. fResampler.inp_count = prev_inp_count + r / channels;
  420. fResampler.out_count = sizeof(rbuffer) / sizeof(float) / channels;
  421. fResampler.inp_data = buffer;
  422. fResampler.out_data = rbuffer;
  423. fResampler.process();
  424. r = sizeof(rbuffer) / sizeof(float) - fResampler.out_count * channels;
  425. if (fResampleRatio > 1.0)
  426. {
  427. if (fResampler.out_count == 0)
  428. {
  429. CARLA_SAFE_ASSERT_UINT(fResampler.inp_count != 0, fResampler.inp_count);
  430. }
  431. else
  432. {
  433. CARLA_SAFE_ASSERT_UINT(fResampler.inp_count == 0, fResampler.inp_count);
  434. }
  435. }
  436. else
  437. {
  438. CARLA_SAFE_ASSERT(fResampler.inp_count == 0);
  439. }
  440. prev_inp_count = fResampler.inp_count;
  441. if (r == 0)
  442. break;
  443. switch (channels)
  444. {
  445. case 1:
  446. fRingBufferL.writeCustomData(rbuffer, r * sizeof(float));
  447. fRingBufferR.writeCustomData(rbuffer, r * sizeof(float));
  448. break;
  449. case 2:
  450. for (ssize_t i=0; i < r;)
  451. {
  452. fRingBufferL.writeCustomData(&rbuffer[i++], sizeof(float));
  453. fRingBufferR.writeCustomData(&rbuffer[i++], sizeof(float));
  454. }
  455. break;
  456. case 4:
  457. for (ssize_t i=fQuad2ndChannels?2:0; i < r; i += 4)
  458. {
  459. fRingBufferL.writeCustomData(&rbuffer[i], sizeof(float));
  460. fRingBufferR.writeCustomData(&rbuffer[i+1], sizeof(float));
  461. }
  462. break;
  463. }
  464. fRingBufferL.commitWrite();
  465. fRingBufferR.commitWrite();
  466. }
  467. if (prev_inp_count != 0)
  468. {
  469. fPreviousResampledBuffer.frames = prev_inp_count;
  470. std::memcpy(fPreviousResampledBuffer.buffer,
  471. buffer + (sizeof(buffer) / sizeof(float) - prev_inp_count * channels),
  472. sizeof(float) * prev_inp_count * channels);
  473. }
  474. }
  475. else
  476. {
  477. float buffer[kFileReaderBufferSize];
  478. ssize_t r;
  479. while (fRingBufferR.getWritableDataSize() >= sizeof(buffer))
  480. {
  481. r = ad_read(fFilePtr, buffer, sizeof(buffer)/sizeof(float));
  482. if (r < 0)
  483. {
  484. carla_stderr("R: ad_read failed");
  485. break;
  486. }
  487. if (r == 0)
  488. break;
  489. switch (channels)
  490. {
  491. case 1:
  492. fRingBufferL.writeCustomData(buffer, r * sizeof(float));
  493. fRingBufferR.writeCustomData(buffer, r * sizeof(float));
  494. break;
  495. case 2:
  496. for (ssize_t i=0; i < r;)
  497. {
  498. fRingBufferL.writeCustomData(&buffer[i++], sizeof(float));
  499. fRingBufferR.writeCustomData(&buffer[i++], sizeof(float));
  500. }
  501. break;
  502. case 4:
  503. for (ssize_t i=fQuad2ndChannels?2:0; i < r; i += 4)
  504. {
  505. fRingBufferL.writeCustomData(&buffer[i], sizeof(float));
  506. fRingBufferR.writeCustomData(&buffer[i+1], sizeof(float));
  507. }
  508. break;
  509. }
  510. fRingBufferL.commitWrite();
  511. fRingBufferR.commitWrite();
  512. }
  513. }
  514. if (nextFileReadPos != -1)
  515. fNextFileReadPos = -1;
  516. }
  517. private:
  518. bool fEntireFileLoaded = false;
  519. bool fQuad2ndChannels = false;
  520. int fCurrentBitRate = 0;
  521. float fLastPlayPosition = 0.f;
  522. int64_t fNextFileReadPos = -1;
  523. uint64_t fTotalResampledFrames = 0;
  524. void* fFilePtr = nullptr;
  525. ADInfo fFileNfo = {};
  526. uint32_t fSampleRate = 0;
  527. double fResampleRatio = 1.0;
  528. AudioMemoryPool fInitialMemoryPool;
  529. Resampler fResampler;
  530. CarlaMutex fReaderMutex;
  531. struct PreviousResampledBuffer {
  532. float* buffer = nullptr;
  533. uint32_t frames = 0;
  534. } fPreviousResampledBuffer;
  535. CarlaHeapRingBuffer fRingBufferL, fRingBufferR;
  536. uint64_t fRingBufferFramePos = 0;
  537. // assumes reader lock is active
  538. void cleanup()
  539. {
  540. fEntireFileLoaded = false;
  541. fCurrentBitRate = 0;
  542. fLastPlayPosition = 0.f;
  543. fNextFileReadPos = -1;
  544. fTotalResampledFrames = 0;
  545. fSampleRate = 0;
  546. fRingBufferFramePos = 0;
  547. fResampleRatio = 1.0;
  548. fResampler.clear();
  549. fInitialMemoryPool.destroy();
  550. fRingBufferL.deleteBuffer();
  551. fRingBufferR.deleteBuffer();
  552. if (fFilePtr != nullptr)
  553. {
  554. ad_close(fFilePtr);
  555. fFilePtr = nullptr;
  556. }
  557. delete[] fPreviousResampledBuffer.buffer;
  558. fPreviousResampledBuffer.buffer = nullptr;
  559. fPreviousResampledBuffer.frames = 0;
  560. }
  561. void readIntoInitialMemoryPool(const uint numFrames, const uint numResampledFrames)
  562. {
  563. const uint channels = fFileNfo.channels;
  564. const uint fileBufferSize = numFrames * channels;
  565. float* const fileBuffer = (float*)std::malloc(fileBufferSize * sizeof(float));
  566. CARLA_SAFE_ASSERT_RETURN(fileBuffer != nullptr,);
  567. ad_seek(fFilePtr, 0);
  568. ssize_t rv = ad_read(fFilePtr, fileBuffer, fileBufferSize);
  569. CARLA_SAFE_ASSERT_INT2_RETURN(rv == static_cast<ssize_t>(fileBufferSize),
  570. rv, fileBufferSize,
  571. std::free(fileBuffer));
  572. fCurrentBitRate = ad_get_bitrate(fFilePtr);
  573. float* resampledBuffer;
  574. if (numFrames != numResampledFrames)
  575. {
  576. resampledBuffer = (float*)std::malloc(numResampledFrames * channels * sizeof(float));
  577. CARLA_SAFE_ASSERT_RETURN(resampledBuffer != nullptr, std::free(fileBuffer););
  578. fResampler.inp_count = numFrames;
  579. fResampler.out_count = numResampledFrames;
  580. fResampler.inp_data = fileBuffer;
  581. fResampler.out_data = resampledBuffer;
  582. fResampler.process();
  583. fInitialMemoryPool.numFrames = numResampledFrames - fResampler.out_count;
  584. rv = fInitialMemoryPool.numFrames * channels;
  585. }
  586. else
  587. {
  588. resampledBuffer = fileBuffer;
  589. }
  590. {
  591. // lock, and put data asap
  592. const CarlaMutexLocker cml(fInitialMemoryPool.mutex);
  593. switch (channels)
  594. {
  595. case 1:
  596. for (ssize_t i=0; i < rv; ++i)
  597. fInitialMemoryPool.buffer[0][i] = fInitialMemoryPool.buffer[1][i] = resampledBuffer[i];
  598. break;
  599. case 2:
  600. for (ssize_t i=0, j=0; i < rv; ++j)
  601. {
  602. fInitialMemoryPool.buffer[0][j] = resampledBuffer[i++];
  603. fInitialMemoryPool.buffer[1][j] = resampledBuffer[i++];
  604. }
  605. break;
  606. case 4:
  607. for (ssize_t i=fQuad2ndChannels?2:0, j=0; i < rv; ++j)
  608. {
  609. fInitialMemoryPool.buffer[0][j] = resampledBuffer[i];
  610. fInitialMemoryPool.buffer[1][j] = resampledBuffer[i+1];
  611. i += 4;
  612. }
  613. break;
  614. }
  615. }
  616. if (resampledBuffer != fileBuffer)
  617. std::free(resampledBuffer);
  618. std::free(fileBuffer);
  619. }
  620. CARLA_DECLARE_NON_COPYABLE(AudioFileReader)
  621. };
  622. // --------------------------------------------------------------------------------------------------------------------
  623. #endif // AUDIO_BASE_HPP_INCLUDED