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.

479 lines
16KB

  1. /*
  2. ==============================================================================
  3. This file is part of the Water library.
  4. Copyright (c) 2016 - ROLI Ltd.
  5. Copyright (C) 2018 Filipe Coelho <falktx@falktx.com>
  6. Permission is granted to use this software under the terms of the ISC license
  7. http://www.isc.org/downloads/software-support-policy/isc-license/
  8. Permission to use, copy, modify, and/or distribute this software for any
  9. purpose with or without fee is hereby granted, provided that the above
  10. copyright notice and this permission notice appear in all copies.
  11. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
  12. TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  13. FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
  14. OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  15. USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  17. OF THIS SOFTWARE.
  18. ==============================================================================
  19. */
  20. #include "AudioDataConverters.h"
  21. namespace water {
  22. void AudioDataConverters::convertFloatToInt16LE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  23. {
  24. const double maxVal = (double) 0x7fff;
  25. char* intData = static_cast<char*> (dest);
  26. if (dest != (void*) source || destBytesPerSample <= 4)
  27. {
  28. for (int i = 0; i < numSamples; ++i)
  29. {
  30. *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  31. intData += destBytesPerSample;
  32. }
  33. }
  34. else
  35. {
  36. intData += destBytesPerSample * numSamples;
  37. for (int i = numSamples; --i >= 0;)
  38. {
  39. intData -= destBytesPerSample;
  40. *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  41. }
  42. }
  43. }
  44. void AudioDataConverters::convertFloatToInt16BE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  45. {
  46. const double maxVal = (double) 0x7fff;
  47. char* intData = static_cast<char*> (dest);
  48. if (dest != (void*) source || destBytesPerSample <= 4)
  49. {
  50. for (int i = 0; i < numSamples; ++i)
  51. {
  52. *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  53. intData += destBytesPerSample;
  54. }
  55. }
  56. else
  57. {
  58. intData += destBytesPerSample * numSamples;
  59. for (int i = numSamples; --i >= 0;)
  60. {
  61. intData -= destBytesPerSample;
  62. *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  63. }
  64. }
  65. }
  66. void AudioDataConverters::convertFloatToInt24LE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  67. {
  68. const double maxVal = (double) 0x7fffff;
  69. char* intData = static_cast<char*> (dest);
  70. if (dest != (void*) source || destBytesPerSample <= 4)
  71. {
  72. for (int i = 0; i < numSamples; ++i)
  73. {
  74. ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData);
  75. intData += destBytesPerSample;
  76. }
  77. }
  78. else
  79. {
  80. intData += destBytesPerSample * numSamples;
  81. for (int i = numSamples; --i >= 0;)
  82. {
  83. intData -= destBytesPerSample;
  84. ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData);
  85. }
  86. }
  87. }
  88. void AudioDataConverters::convertFloatToInt24BE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  89. {
  90. const double maxVal = (double) 0x7fffff;
  91. char* intData = static_cast<char*> (dest);
  92. if (dest != (void*) source || destBytesPerSample <= 4)
  93. {
  94. for (int i = 0; i < numSamples; ++i)
  95. {
  96. ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData);
  97. intData += destBytesPerSample;
  98. }
  99. }
  100. else
  101. {
  102. intData += destBytesPerSample * numSamples;
  103. for (int i = numSamples; --i >= 0;)
  104. {
  105. intData -= destBytesPerSample;
  106. ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData);
  107. }
  108. }
  109. }
  110. void AudioDataConverters::convertFloatToInt32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  111. {
  112. const double maxVal = (double) 0x7fffffff;
  113. char* intData = static_cast<char*> (dest);
  114. if (dest != (void*) source || destBytesPerSample <= 4)
  115. {
  116. for (int i = 0; i < numSamples; ++i)
  117. {
  118. *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  119. intData += destBytesPerSample;
  120. }
  121. }
  122. else
  123. {
  124. intData += destBytesPerSample * numSamples;
  125. for (int i = numSamples; --i >= 0;)
  126. {
  127. intData -= destBytesPerSample;
  128. *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  129. }
  130. }
  131. }
  132. void AudioDataConverters::convertFloatToInt32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  133. {
  134. const double maxVal = (double) 0x7fffffff;
  135. char* intData = static_cast<char*> (dest);
  136. if (dest != (void*) source || destBytesPerSample <= 4)
  137. {
  138. for (int i = 0; i < numSamples; ++i)
  139. {
  140. *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  141. intData += destBytesPerSample;
  142. }
  143. }
  144. else
  145. {
  146. intData += destBytesPerSample * numSamples;
  147. for (int i = numSamples; --i >= 0;)
  148. {
  149. intData -= destBytesPerSample;
  150. *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])));
  151. }
  152. }
  153. }
  154. void AudioDataConverters::convertFloatToFloat32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  155. {
  156. jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data!
  157. char* d = static_cast<char*> (dest);
  158. for (int i = 0; i < numSamples; ++i)
  159. {
  160. *(float*) d = source[i];
  161. #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
  162. *(uint32*) d = ByteOrder::swap (*(uint32*) d);
  163. #endif
  164. d += destBytesPerSample;
  165. }
  166. }
  167. void AudioDataConverters::convertFloatToFloat32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample)
  168. {
  169. jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data!
  170. char* d = static_cast<char*> (dest);
  171. for (int i = 0; i < numSamples; ++i)
  172. {
  173. *(float*) d = source[i];
  174. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  175. *(uint32*) d = ByteOrder::swap (*(uint32*) d);
  176. #endif
  177. d += destBytesPerSample;
  178. }
  179. }
  180. //==============================================================================
  181. void AudioDataConverters::convertInt16LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  182. {
  183. const float scale = 1.0f / 0x7fff;
  184. const char* intData = static_cast<const char*> (source);
  185. if (source != (void*) dest || srcBytesPerSample >= 4)
  186. {
  187. for (int i = 0; i < numSamples; ++i)
  188. {
  189. dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData);
  190. intData += srcBytesPerSample;
  191. }
  192. }
  193. else
  194. {
  195. intData += srcBytesPerSample * numSamples;
  196. for (int i = numSamples; --i >= 0;)
  197. {
  198. intData -= srcBytesPerSample;
  199. dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData);
  200. }
  201. }
  202. }
  203. void AudioDataConverters::convertInt16BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  204. {
  205. const float scale = 1.0f / 0x7fff;
  206. const char* intData = static_cast<const char*> (source);
  207. if (source != (void*) dest || srcBytesPerSample >= 4)
  208. {
  209. for (int i = 0; i < numSamples; ++i)
  210. {
  211. dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData);
  212. intData += srcBytesPerSample;
  213. }
  214. }
  215. else
  216. {
  217. intData += srcBytesPerSample * numSamples;
  218. for (int i = numSamples; --i >= 0;)
  219. {
  220. intData -= srcBytesPerSample;
  221. dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData);
  222. }
  223. }
  224. }
  225. void AudioDataConverters::convertInt24LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  226. {
  227. const float scale = 1.0f / 0x7fffff;
  228. const char* intData = static_cast<const char*> (source);
  229. if (source != (void*) dest || srcBytesPerSample >= 4)
  230. {
  231. for (int i = 0; i < numSamples; ++i)
  232. {
  233. dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData);
  234. intData += srcBytesPerSample;
  235. }
  236. }
  237. else
  238. {
  239. intData += srcBytesPerSample * numSamples;
  240. for (int i = numSamples; --i >= 0;)
  241. {
  242. intData -= srcBytesPerSample;
  243. dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData);
  244. }
  245. }
  246. }
  247. void AudioDataConverters::convertInt24BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  248. {
  249. const float scale = 1.0f / 0x7fffff;
  250. const char* intData = static_cast<const char*> (source);
  251. if (source != (void*) dest || srcBytesPerSample >= 4)
  252. {
  253. for (int i = 0; i < numSamples; ++i)
  254. {
  255. dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData);
  256. intData += srcBytesPerSample;
  257. }
  258. }
  259. else
  260. {
  261. intData += srcBytesPerSample * numSamples;
  262. for (int i = numSamples; --i >= 0;)
  263. {
  264. intData -= srcBytesPerSample;
  265. dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData);
  266. }
  267. }
  268. }
  269. void AudioDataConverters::convertInt32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  270. {
  271. const float scale = 1.0f / 0x7fffffff;
  272. const char* intData = static_cast<const char*> (source);
  273. if (source != (void*) dest || srcBytesPerSample >= 4)
  274. {
  275. for (int i = 0; i < numSamples; ++i)
  276. {
  277. dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData);
  278. intData += srcBytesPerSample;
  279. }
  280. }
  281. else
  282. {
  283. intData += srcBytesPerSample * numSamples;
  284. for (int i = numSamples; --i >= 0;)
  285. {
  286. intData -= srcBytesPerSample;
  287. dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData);
  288. }
  289. }
  290. }
  291. void AudioDataConverters::convertInt32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  292. {
  293. const float scale = 1.0f / 0x7fffffff;
  294. const char* intData = static_cast<const char*> (source);
  295. if (source != (void*) dest || srcBytesPerSample >= 4)
  296. {
  297. for (int i = 0; i < numSamples; ++i)
  298. {
  299. dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData);
  300. intData += srcBytesPerSample;
  301. }
  302. }
  303. else
  304. {
  305. intData += srcBytesPerSample * numSamples;
  306. for (int i = numSamples; --i >= 0;)
  307. {
  308. intData -= srcBytesPerSample;
  309. dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData);
  310. }
  311. }
  312. }
  313. void AudioDataConverters::convertFloat32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  314. {
  315. const char* s = static_cast<const char*> (source);
  316. for (int i = 0; i < numSamples; ++i)
  317. {
  318. dest[i] = *(float*)s;
  319. #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
  320. uint32* const d = (uint32*) (dest + i);
  321. *d = ByteOrder::swap (*d);
  322. #endif
  323. s += srcBytesPerSample;
  324. }
  325. }
  326. void AudioDataConverters::convertFloat32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample)
  327. {
  328. const char* s = static_cast<const char*> (source);
  329. for (int i = 0; i < numSamples; ++i)
  330. {
  331. dest[i] = *(float*)s;
  332. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  333. uint32* const d = (uint32*) (dest + i);
  334. *d = ByteOrder::swap (*d);
  335. #endif
  336. s += srcBytesPerSample;
  337. }
  338. }
  339. //==============================================================================
  340. void AudioDataConverters::convertFloatToFormat (const DataFormat destFormat,
  341. const float* const source,
  342. void* const dest,
  343. const int numSamples)
  344. {
  345. switch (destFormat)
  346. {
  347. case int16LE: convertFloatToInt16LE (source, dest, numSamples); break;
  348. case int16BE: convertFloatToInt16BE (source, dest, numSamples); break;
  349. case int24LE: convertFloatToInt24LE (source, dest, numSamples); break;
  350. case int24BE: convertFloatToInt24BE (source, dest, numSamples); break;
  351. case int32LE: convertFloatToInt32LE (source, dest, numSamples); break;
  352. case int32BE: convertFloatToInt32BE (source, dest, numSamples); break;
  353. case float32LE: convertFloatToFloat32LE (source, dest, numSamples); break;
  354. case float32BE: convertFloatToFloat32BE (source, dest, numSamples); break;
  355. default: jassertfalse; break;
  356. }
  357. }
  358. void AudioDataConverters::convertFormatToFloat (const DataFormat sourceFormat,
  359. const void* const source,
  360. float* const dest,
  361. const int numSamples)
  362. {
  363. switch (sourceFormat)
  364. {
  365. case int16LE: convertInt16LEToFloat (source, dest, numSamples); break;
  366. case int16BE: convertInt16BEToFloat (source, dest, numSamples); break;
  367. case int24LE: convertInt24LEToFloat (source, dest, numSamples); break;
  368. case int24BE: convertInt24BEToFloat (source, dest, numSamples); break;
  369. case int32LE: convertInt32LEToFloat (source, dest, numSamples); break;
  370. case int32BE: convertInt32BEToFloat (source, dest, numSamples); break;
  371. case float32LE: convertFloat32LEToFloat (source, dest, numSamples); break;
  372. case float32BE: convertFloat32BEToFloat (source, dest, numSamples); break;
  373. default: jassertfalse; break;
  374. }
  375. }
  376. //==============================================================================
  377. void AudioDataConverters::interleaveSamples (const float** const source,
  378. float* const dest,
  379. const int numSamples,
  380. const int numChannels)
  381. {
  382. for (int chan = 0; chan < numChannels; ++chan)
  383. {
  384. int i = chan;
  385. const float* src = source [chan];
  386. for (int j = 0; j < numSamples; ++j)
  387. {
  388. dest [i] = src [j];
  389. i += numChannels;
  390. }
  391. }
  392. }
  393. void AudioDataConverters::deinterleaveSamples (const float* const source,
  394. float** const dest,
  395. const int numSamples,
  396. const int numChannels)
  397. {
  398. for (int chan = 0; chan < numChannels; ++chan)
  399. {
  400. int i = chan;
  401. float* dst = dest [chan];
  402. for (int j = 0; j < numSamples; ++j)
  403. {
  404. dst [j] = source [i];
  405. i += numChannels;
  406. }
  407. }
  408. }
  409. }