sample_cvt.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. #include "config.h"
  2. #include "sample_cvt.h"
  3. #ifdef HAVE_ALLOCA_H
  4. #include <alloca.h>
  5. #endif
  6. #ifdef HAVE_MALLOC_H
  7. #include <malloc.h>
  8. #endif
  9. #include "AL/al.h"
  10. #include "alu.h"
  11. #include "alBuffer.h"
  12. /* IMA ADPCM Stepsize table */
  13. static const int IMAStep_size[89] = {
  14. 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19,
  15. 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55,
  16. 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157,
  17. 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449,
  18. 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,
  19. 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660,
  20. 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442,
  21. 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794,
  22. 32767
  23. };
  24. /* IMA4 ADPCM Codeword decode table */
  25. static const int IMA4Codeword[16] = {
  26. 1, 3, 5, 7, 9, 11, 13, 15,
  27. -1,-3,-5,-7,-9,-11,-13,-15,
  28. };
  29. /* IMA4 ADPCM Step index adjust decode table */
  30. static const int IMA4Index_adjust[16] = {
  31. -1,-1,-1,-1, 2, 4, 6, 8,
  32. -1,-1,-1,-1, 2, 4, 6, 8
  33. };
  34. /* MSADPCM Adaption table */
  35. static const int MSADPCMAdaption[16] = {
  36. 230, 230, 230, 230, 307, 409, 512, 614,
  37. 768, 614, 512, 409, 307, 230, 230, 230
  38. };
  39. /* MSADPCM Adaption Coefficient tables */
  40. static const int MSADPCMAdaptionCoeff[7][2] = {
  41. { 256, 0 },
  42. { 512, -256 },
  43. { 0, 0 },
  44. { 192, 64 },
  45. { 240, 0 },
  46. { 460, -208 },
  47. { 392, -232 }
  48. };
  49. /* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a
  50. * signed 16-bit sample */
  51. static const ALshort muLawDecompressionTable[256] = {
  52. -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956,
  53. -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764,
  54. -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412,
  55. -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316,
  56. -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
  57. -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
  58. -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
  59. -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
  60. -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
  61. -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
  62. -876, -844, -812, -780, -748, -716, -684, -652,
  63. -620, -588, -556, -524, -492, -460, -428, -396,
  64. -372, -356, -340, -324, -308, -292, -276, -260,
  65. -244, -228, -212, -196, -180, -164, -148, -132,
  66. -120, -112, -104, -96, -88, -80, -72, -64,
  67. -56, -48, -40, -32, -24, -16, -8, 0,
  68. 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
  69. 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
  70. 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
  71. 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
  72. 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
  73. 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
  74. 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
  75. 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
  76. 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
  77. 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
  78. 876, 844, 812, 780, 748, 716, 684, 652,
  79. 620, 588, 556, 524, 492, 460, 428, 396,
  80. 372, 356, 340, 324, 308, 292, 276, 260,
  81. 244, 228, 212, 196, 180, 164, 148, 132,
  82. 120, 112, 104, 96, 88, 80, 72, 64,
  83. 56, 48, 40, 32, 24, 16, 8, 0
  84. };
  85. /* Values used when encoding a muLaw sample */
  86. static const int muLawBias = 0x84;
  87. static const int muLawClip = 32635;
  88. static const char muLawCompressTable[256] = {
  89. 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
  90. 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  91. 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  92. 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  93. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  94. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  95. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  96. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  97. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  98. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  99. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  100. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  101. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  102. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  103. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  104. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  105. };
  106. /* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a
  107. * signed 16-bit sample */
  108. static const ALshort aLawDecompressionTable[256] = {
  109. -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
  110. -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
  111. -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
  112. -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
  113. -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944,
  114. -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136,
  115. -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472,
  116. -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568,
  117. -344, -328, -376, -360, -280, -264, -312, -296,
  118. -472, -456, -504, -488, -408, -392, -440, -424,
  119. -88, -72, -120, -104, -24, -8, -56, -40,
  120. -216, -200, -248, -232, -152, -136, -184, -168,
  121. -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
  122. -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
  123. -688, -656, -752, -720, -560, -528, -624, -592,
  124. -944, -912, -1008, -976, -816, -784, -880, -848,
  125. 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
  126. 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
  127. 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
  128. 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
  129. 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
  130. 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
  131. 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
  132. 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
  133. 344, 328, 376, 360, 280, 264, 312, 296,
  134. 472, 456, 504, 488, 408, 392, 440, 424,
  135. 88, 72, 120, 104, 24, 8, 56, 40,
  136. 216, 200, 248, 232, 152, 136, 184, 168,
  137. 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
  138. 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
  139. 688, 656, 752, 720, 560, 528, 624, 592,
  140. 944, 912, 1008, 976, 816, 784, 880, 848
  141. };
  142. /* Values used when encoding an aLaw sample */
  143. static const int aLawClip = 32635;
  144. static const char aLawCompressTable[128] = {
  145. 1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,
  146. 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  147. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  148. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  149. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  150. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  151. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  152. 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  153. };
  154. typedef ALubyte ALmulaw;
  155. typedef ALubyte ALalaw;
  156. typedef ALubyte ALima4;
  157. typedef ALubyte ALmsadpcm;
  158. typedef struct {
  159. ALbyte b[3];
  160. } ALbyte3;
  161. static_assert(sizeof(ALbyte3)==sizeof(ALbyte[3]), "ALbyte3 size is not 3");
  162. typedef struct {
  163. ALubyte b[3];
  164. } ALubyte3;
  165. static_assert(sizeof(ALubyte3)==sizeof(ALubyte[3]), "ALubyte3 size is not 3");
  166. static inline ALshort DecodeMuLaw(ALmulaw val)
  167. { return muLawDecompressionTable[val]; }
  168. static ALmulaw EncodeMuLaw(ALshort val)
  169. {
  170. ALint mant, exp, sign;
  171. sign = (val>>8) & 0x80;
  172. if(sign)
  173. {
  174. /* -32768 doesn't properly negate on a short; it results in itself.
  175. * So clamp to -32767 */
  176. val = maxi(val, -32767);
  177. val = -val;
  178. }
  179. val = mini(val, muLawClip);
  180. val += muLawBias;
  181. exp = muLawCompressTable[(val>>7) & 0xff];
  182. mant = (val >> (exp+3)) & 0x0f;
  183. return ~(sign | (exp<<4) | mant);
  184. }
  185. static inline ALshort DecodeALaw(ALalaw val)
  186. { return aLawDecompressionTable[val]; }
  187. static ALalaw EncodeALaw(ALshort val)
  188. {
  189. ALint mant, exp, sign;
  190. sign = ((~val) >> 8) & 0x80;
  191. if(!sign)
  192. {
  193. val = maxi(val, -32767);
  194. val = -val;
  195. }
  196. val = mini(val, aLawClip);
  197. if(val >= 256)
  198. {
  199. exp = aLawCompressTable[(val>>8) & 0x7f];
  200. mant = (val >> (exp+3)) & 0x0f;
  201. }
  202. else
  203. {
  204. exp = 0;
  205. mant = val >> 4;
  206. }
  207. return ((exp<<4) | mant) ^ (sign^0x55);
  208. }
  209. static void DecodeIMA4Block(ALshort *dst, const ALima4 *src, ALint numchans, ALsizei align)
  210. {
  211. ALint sample[MAX_INPUT_CHANNELS], index[MAX_INPUT_CHANNELS];
  212. ALuint code[MAX_INPUT_CHANNELS];
  213. ALsizei j,k,c;
  214. for(c = 0;c < numchans;c++)
  215. {
  216. sample[c] = *(src++);
  217. sample[c] |= *(src++) << 8;
  218. sample[c] = (sample[c]^0x8000) - 32768;
  219. index[c] = *(src++);
  220. index[c] |= *(src++) << 8;
  221. index[c] = (index[c]^0x8000) - 32768;
  222. index[c] = clampi(index[c], 0, 88);
  223. dst[c] = sample[c];
  224. }
  225. for(j = 1;j < align;j += 8)
  226. {
  227. for(c = 0;c < numchans;c++)
  228. {
  229. code[c] = *(src++);
  230. code[c] |= *(src++) << 8;
  231. code[c] |= *(src++) << 16;
  232. code[c] |= *(src++) << 24;
  233. }
  234. for(k = 0;k < 8;k++)
  235. {
  236. for(c = 0;c < numchans;c++)
  237. {
  238. int nibble = code[c]&0xf;
  239. code[c] >>= 4;
  240. sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8;
  241. sample[c] = clampi(sample[c], -32768, 32767);
  242. index[c] += IMA4Index_adjust[nibble];
  243. index[c] = clampi(index[c], 0, 88);
  244. dst[(j+k)*numchans + c] = sample[c];
  245. }
  246. }
  247. }
  248. }
  249. static void EncodeIMA4Block(ALima4 *dst, const ALshort *src, ALint *sample, ALint *index, ALint numchans, ALsizei align)
  250. {
  251. ALsizei j,k,c;
  252. for(c = 0;c < numchans;c++)
  253. {
  254. int diff = src[c] - sample[c];
  255. int step = IMAStep_size[index[c]];
  256. int nibble;
  257. nibble = 0;
  258. if(diff < 0)
  259. {
  260. nibble = 0x8;
  261. diff = -diff;
  262. }
  263. diff = mini(step*2, diff);
  264. nibble |= (diff*8/step - 1) / 2;
  265. sample[c] += IMA4Codeword[nibble] * step / 8;
  266. sample[c] = clampi(sample[c], -32768, 32767);
  267. index[c] += IMA4Index_adjust[nibble];
  268. index[c] = clampi(index[c], 0, 88);
  269. *(dst++) = sample[c] & 0xff;
  270. *(dst++) = (sample[c]>>8) & 0xff;
  271. *(dst++) = index[c] & 0xff;
  272. *(dst++) = (index[c]>>8) & 0xff;
  273. }
  274. for(j = 1;j < align;j += 8)
  275. {
  276. for(c = 0;c < numchans;c++)
  277. {
  278. for(k = 0;k < 8;k++)
  279. {
  280. int diff = src[(j+k)*numchans + c] - sample[c];
  281. int step = IMAStep_size[index[c]];
  282. int nibble;
  283. nibble = 0;
  284. if(diff < 0)
  285. {
  286. nibble = 0x8;
  287. diff = -diff;
  288. }
  289. diff = mini(step*2, diff);
  290. nibble |= (diff*8/step - 1) / 2;
  291. sample[c] += IMA4Codeword[nibble] * step / 8;
  292. sample[c] = clampi(sample[c], -32768, 32767);
  293. index[c] += IMA4Index_adjust[nibble];
  294. index[c] = clampi(index[c], 0, 88);
  295. if(!(k&1)) *dst = nibble;
  296. else *(dst++) |= nibble<<4;
  297. }
  298. }
  299. }
  300. }
  301. static void DecodeMSADPCMBlock(ALshort *dst, const ALmsadpcm *src, ALint numchans, ALsizei align)
  302. {
  303. ALubyte blockpred[MAX_INPUT_CHANNELS];
  304. ALint delta[MAX_INPUT_CHANNELS];
  305. ALshort samples[MAX_INPUT_CHANNELS][2];
  306. ALint i, j;
  307. for(i = 0;i < numchans;i++)
  308. {
  309. blockpred[i] = *(src++);
  310. blockpred[i] = minu(blockpred[i], 6);
  311. }
  312. for(i = 0;i < numchans;i++)
  313. {
  314. delta[i] = *(src++);
  315. delta[i] |= *(src++) << 8;
  316. delta[i] = (delta[i]^0x8000) - 0x8000;
  317. }
  318. for(i = 0;i < numchans;i++)
  319. {
  320. samples[i][0] = *(src++);
  321. samples[i][0] |= *(src++) << 8;
  322. samples[i][0] = (samples[i][0]^0x8000) - 0x8000;
  323. }
  324. for(i = 0;i < numchans;i++)
  325. {
  326. samples[i][1] = *(src++);
  327. samples[i][1] |= *(src++) << 8;
  328. samples[i][1] = (samples[i][1]^0x8000) - 0x8000;
  329. }
  330. /* Second sample is written first. */
  331. for(i = 0;i < numchans;i++)
  332. *(dst++) = samples[i][1];
  333. for(i = 0;i < numchans;i++)
  334. *(dst++) = samples[i][0];
  335. for(j = 2;j < align;j++)
  336. {
  337. for(i = 0;i < numchans;i++)
  338. {
  339. const ALint num = (j*numchans) + i;
  340. ALint nibble, pred;
  341. /* Read the nibble (first is in the upper bits). */
  342. if(!(num&1))
  343. nibble = (*src>>4)&0x0f;
  344. else
  345. nibble = (*(src++))&0x0f;
  346. pred = (samples[i][0]*MSADPCMAdaptionCoeff[blockpred[i]][0] +
  347. samples[i][1]*MSADPCMAdaptionCoeff[blockpred[i]][1]) / 256;
  348. pred += ((nibble^0x08) - 0x08) * delta[i];
  349. pred = clampi(pred, -32768, 32767);
  350. samples[i][1] = samples[i][0];
  351. samples[i][0] = pred;
  352. delta[i] = (MSADPCMAdaption[nibble] * delta[i]) / 256;
  353. delta[i] = maxi(16, delta[i]);
  354. *(dst++) = pred;
  355. }
  356. }
  357. }
  358. /* NOTE: This encoder is pretty dumb/simplistic. Some kind of pre-processing
  359. * that tries to find the optimal block predictors would be nice, at least. A
  360. * multi-pass method that can generate better deltas would be good, too. */
  361. static void EncodeMSADPCMBlock(ALmsadpcm *dst, const ALshort *src, ALint *sample, ALint numchans, ALsizei align)
  362. {
  363. ALubyte blockpred[MAX_INPUT_CHANNELS];
  364. ALint delta[MAX_INPUT_CHANNELS];
  365. ALshort samples[MAX_INPUT_CHANNELS][2];
  366. ALint i, j;
  367. /* Block predictor */
  368. for(i = 0;i < numchans;i++)
  369. {
  370. /* FIXME: Calculate something better. */
  371. blockpred[i] = 0;
  372. *(dst++) = blockpred[i];
  373. }
  374. /* Initial delta */
  375. for(i = 0;i < numchans;i++)
  376. {
  377. delta[i] = 16;
  378. *(dst++) = (delta[i] ) & 0xff;
  379. *(dst++) = (delta[i]>>8) & 0xff;
  380. }
  381. /* Initial sample 1 */
  382. for(i = 0;i < numchans;i++)
  383. {
  384. samples[i][0] = src[1*numchans + i];
  385. *(dst++) = (samples[i][0] ) & 0xff;
  386. *(dst++) = (samples[i][0]>>8) & 0xff;
  387. }
  388. /* Initial sample 2 */
  389. for(i = 0;i < numchans;i++)
  390. {
  391. samples[i][1] = src[i];
  392. *(dst++) = (samples[i][1] ) & 0xff;
  393. *(dst++) = (samples[i][1]>>8) & 0xff;
  394. }
  395. for(j = 2;j < align;j++)
  396. {
  397. for(i = 0;i < numchans;i++)
  398. {
  399. const ALint num = (j*numchans) + i;
  400. ALint nibble = 0;
  401. ALint bias;
  402. sample[i] = (samples[i][0]*MSADPCMAdaptionCoeff[blockpred[i]][0] +
  403. samples[i][1]*MSADPCMAdaptionCoeff[blockpred[i]][1]) / 256;
  404. nibble = src[num] - sample[i];
  405. if(nibble >= 0)
  406. bias = delta[i] / 2;
  407. else
  408. bias = -delta[i] / 2;
  409. nibble = (nibble + bias) / delta[i];
  410. nibble = clampi(nibble, -8, 7)&0x0f;
  411. sample[i] += ((nibble^0x08)-0x08) * delta[i];
  412. sample[i] = clampi(sample[i], -32768, 32767);
  413. samples[i][1] = samples[i][0];
  414. samples[i][0] = sample[i];
  415. delta[i] = (MSADPCMAdaption[nibble] * delta[i]) / 256;
  416. delta[i] = maxi(16, delta[i]);
  417. if(!(num&1))
  418. *dst = nibble << 4;
  419. else
  420. {
  421. *dst |= nibble;
  422. dst++;
  423. }
  424. }
  425. }
  426. }
  427. static inline ALint DecodeByte3(ALbyte3 val)
  428. {
  429. if(IS_LITTLE_ENDIAN)
  430. return (val.b[2]<<16) | (((ALubyte)val.b[1])<<8) | ((ALubyte)val.b[0]);
  431. return (val.b[0]<<16) | (((ALubyte)val.b[1])<<8) | ((ALubyte)val.b[2]);
  432. }
  433. static inline ALbyte3 EncodeByte3(ALint val)
  434. {
  435. if(IS_LITTLE_ENDIAN)
  436. {
  437. ALbyte3 ret = {{ val, val>>8, val>>16 }};
  438. return ret;
  439. }
  440. else
  441. {
  442. ALbyte3 ret = {{ val>>16, val>>8, val }};
  443. return ret;
  444. }
  445. }
  446. static inline ALint DecodeUByte3(ALubyte3 val)
  447. {
  448. if(IS_LITTLE_ENDIAN)
  449. return (val.b[2]<<16) | (val.b[1]<<8) | (val.b[0]);
  450. return (val.b[0]<<16) | (val.b[1]<<8) | val.b[2];
  451. }
  452. static inline ALubyte3 EncodeUByte3(ALint val)
  453. {
  454. if(IS_LITTLE_ENDIAN)
  455. {
  456. ALubyte3 ret = {{ val, val>>8, val>>16 }};
  457. return ret;
  458. }
  459. else
  460. {
  461. ALubyte3 ret = {{ val>>16, val>>8, val }};
  462. return ret;
  463. }
  464. }
  465. static inline ALbyte Conv_ALbyte_ALbyte(ALbyte val)
  466. { return val; }
  467. static inline ALbyte Conv_ALbyte_ALubyte(ALubyte val)
  468. { return val-128; }
  469. static inline ALbyte Conv_ALbyte_ALshort(ALshort val)
  470. { return val>>8; }
  471. static inline ALbyte Conv_ALbyte_ALushort(ALushort val)
  472. { return (val>>8)-128; }
  473. static inline ALbyte Conv_ALbyte_ALint(ALint val)
  474. { return val>>24; }
  475. static inline ALbyte Conv_ALbyte_ALuint(ALuint val)
  476. { return (val>>24)-128; }
  477. static inline ALbyte Conv_ALbyte_ALfloat(ALfloat val)
  478. {
  479. if(val > 1.0f) return 127;
  480. if(val < -1.0f) return -128;
  481. return (ALint)(val * 127.0f);
  482. }
  483. static inline ALbyte Conv_ALbyte_ALdouble(ALdouble val)
  484. {
  485. if(val > 1.0) return 127;
  486. if(val < -1.0) return -128;
  487. return (ALint)(val * 127.0);
  488. }
  489. static inline ALbyte Conv_ALbyte_ALmulaw(ALmulaw val)
  490. { return Conv_ALbyte_ALshort(DecodeMuLaw(val)); }
  491. static inline ALbyte Conv_ALbyte_ALalaw(ALalaw val)
  492. { return Conv_ALbyte_ALshort(DecodeALaw(val)); }
  493. static inline ALbyte Conv_ALbyte_ALbyte3(ALbyte3 val)
  494. { return DecodeByte3(val)>>16; }
  495. static inline ALbyte Conv_ALbyte_ALubyte3(ALubyte3 val)
  496. { return (DecodeUByte3(val)>>16)-128; }
  497. static inline ALubyte Conv_ALubyte_ALbyte(ALbyte val)
  498. { return val+128; }
  499. static inline ALubyte Conv_ALubyte_ALubyte(ALubyte val)
  500. { return val; }
  501. static inline ALubyte Conv_ALubyte_ALshort(ALshort val)
  502. { return (val>>8)+128; }
  503. static inline ALubyte Conv_ALubyte_ALushort(ALushort val)
  504. { return val>>8; }
  505. static inline ALubyte Conv_ALubyte_ALint(ALint val)
  506. { return (val>>24)+128; }
  507. static inline ALubyte Conv_ALubyte_ALuint(ALuint val)
  508. { return val>>24; }
  509. static inline ALubyte Conv_ALubyte_ALfloat(ALfloat val)
  510. {
  511. if(val > 1.0f) return 255;
  512. if(val < -1.0f) return 0;
  513. return (ALint)(val * 127.0f) + 128;
  514. }
  515. static inline ALubyte Conv_ALubyte_ALdouble(ALdouble val)
  516. {
  517. if(val > 1.0) return 255;
  518. if(val < -1.0) return 0;
  519. return (ALint)(val * 127.0) + 128;
  520. }
  521. static inline ALubyte Conv_ALubyte_ALmulaw(ALmulaw val)
  522. { return Conv_ALubyte_ALshort(DecodeMuLaw(val)); }
  523. static inline ALubyte Conv_ALubyte_ALalaw(ALalaw val)
  524. { return Conv_ALubyte_ALshort(DecodeALaw(val)); }
  525. static inline ALubyte Conv_ALubyte_ALbyte3(ALbyte3 val)
  526. { return (DecodeByte3(val)>>16)+128; }
  527. static inline ALubyte Conv_ALubyte_ALubyte3(ALubyte3 val)
  528. { return DecodeUByte3(val)>>16; }
  529. static inline ALshort Conv_ALshort_ALbyte(ALbyte val)
  530. { return val<<8; }
  531. static inline ALshort Conv_ALshort_ALubyte(ALubyte val)
  532. { return (val-128)<<8; }
  533. static inline ALshort Conv_ALshort_ALshort(ALshort val)
  534. { return val; }
  535. static inline ALshort Conv_ALshort_ALushort(ALushort val)
  536. { return val-32768; }
  537. static inline ALshort Conv_ALshort_ALint(ALint val)
  538. { return val>>16; }
  539. static inline ALshort Conv_ALshort_ALuint(ALuint val)
  540. { return (val>>16)-32768; }
  541. static inline ALshort Conv_ALshort_ALfloat(ALfloat val)
  542. {
  543. if(val > 1.0f) return 32767;
  544. if(val < -1.0f) return -32768;
  545. return (ALint)(val * 32767.0f);
  546. }
  547. static inline ALshort Conv_ALshort_ALdouble(ALdouble val)
  548. {
  549. if(val > 1.0) return 32767;
  550. if(val < -1.0) return -32768;
  551. return (ALint)(val * 32767.0);
  552. }
  553. static inline ALshort Conv_ALshort_ALmulaw(ALmulaw val)
  554. { return Conv_ALshort_ALshort(DecodeMuLaw(val)); }
  555. static inline ALshort Conv_ALshort_ALalaw(ALalaw val)
  556. { return Conv_ALshort_ALshort(DecodeALaw(val)); }
  557. static inline ALshort Conv_ALshort_ALbyte3(ALbyte3 val)
  558. { return DecodeByte3(val)>>8; }
  559. static inline ALshort Conv_ALshort_ALubyte3(ALubyte3 val)
  560. { return (DecodeUByte3(val)>>8)-32768; }
  561. static inline ALushort Conv_ALushort_ALbyte(ALbyte val)
  562. { return (val+128)<<8; }
  563. static inline ALushort Conv_ALushort_ALubyte(ALubyte val)
  564. { return val<<8; }
  565. static inline ALushort Conv_ALushort_ALshort(ALshort val)
  566. { return val+32768; }
  567. static inline ALushort Conv_ALushort_ALushort(ALushort val)
  568. { return val; }
  569. static inline ALushort Conv_ALushort_ALint(ALint val)
  570. { return (val>>16)+32768; }
  571. static inline ALushort Conv_ALushort_ALuint(ALuint val)
  572. { return val>>16; }
  573. static inline ALushort Conv_ALushort_ALfloat(ALfloat val)
  574. {
  575. if(val > 1.0f) return 65535;
  576. if(val < -1.0f) return 0;
  577. return (ALint)(val * 32767.0f) + 32768;
  578. }
  579. static inline ALushort Conv_ALushort_ALdouble(ALdouble val)
  580. {
  581. if(val > 1.0) return 65535;
  582. if(val < -1.0) return 0;
  583. return (ALint)(val * 32767.0) + 32768;
  584. }
  585. static inline ALushort Conv_ALushort_ALmulaw(ALmulaw val)
  586. { return Conv_ALushort_ALshort(DecodeMuLaw(val)); }
  587. static inline ALushort Conv_ALushort_ALalaw(ALalaw val)
  588. { return Conv_ALushort_ALshort(DecodeALaw(val)); }
  589. static inline ALushort Conv_ALushort_ALbyte3(ALbyte3 val)
  590. { return (DecodeByte3(val)>>8)+32768; }
  591. static inline ALushort Conv_ALushort_ALubyte3(ALubyte3 val)
  592. { return DecodeUByte3(val)>>8; }
  593. static inline ALint Conv_ALint_ALbyte(ALbyte val)
  594. { return val<<24; }
  595. static inline ALint Conv_ALint_ALubyte(ALubyte val)
  596. { return (val-128)<<24; }
  597. static inline ALint Conv_ALint_ALshort(ALshort val)
  598. { return val<<16; }
  599. static inline ALint Conv_ALint_ALushort(ALushort val)
  600. { return (val-32768)<<16; }
  601. static inline ALint Conv_ALint_ALint(ALint val)
  602. { return val; }
  603. static inline ALint Conv_ALint_ALuint(ALuint val)
  604. { return val-2147483648u; }
  605. static inline ALint Conv_ALint_ALfloat(ALfloat val)
  606. {
  607. if(val > 1.0f) return 2147483647;
  608. if(val < -1.0f) return -2147483647-1;
  609. return (ALint)(val*16777215.0f) << 7;
  610. }
  611. static inline ALint Conv_ALint_ALdouble(ALdouble val)
  612. {
  613. if(val > 1.0) return 2147483647;
  614. if(val < -1.0) return -2147483647-1;
  615. return (ALint)(val * 2147483647.0);
  616. }
  617. static inline ALint Conv_ALint_ALmulaw(ALmulaw val)
  618. { return Conv_ALint_ALshort(DecodeMuLaw(val)); }
  619. static inline ALint Conv_ALint_ALalaw(ALalaw val)
  620. { return Conv_ALint_ALshort(DecodeALaw(val)); }
  621. static inline ALint Conv_ALint_ALbyte3(ALbyte3 val)
  622. { return DecodeByte3(val)<<8; }
  623. static inline ALint Conv_ALint_ALubyte3(ALubyte3 val)
  624. { return (DecodeUByte3(val)-8388608)<<8; }
  625. static inline ALuint Conv_ALuint_ALbyte(ALbyte val)
  626. { return (val+128)<<24; }
  627. static inline ALuint Conv_ALuint_ALubyte(ALubyte val)
  628. { return val<<24; }
  629. static inline ALuint Conv_ALuint_ALshort(ALshort val)
  630. { return (val+32768)<<16; }
  631. static inline ALuint Conv_ALuint_ALushort(ALushort val)
  632. { return val<<16; }
  633. static inline ALuint Conv_ALuint_ALint(ALint val)
  634. { return val+2147483648u; }
  635. static inline ALuint Conv_ALuint_ALuint(ALuint val)
  636. { return val; }
  637. static inline ALuint Conv_ALuint_ALfloat(ALfloat val)
  638. {
  639. if(val > 1.0f) return 4294967295u;
  640. if(val < -1.0f) return 0;
  641. return ((ALint)(val*16777215.0f)<<7) + 2147483648u;
  642. }
  643. static inline ALuint Conv_ALuint_ALdouble(ALdouble val)
  644. {
  645. if(val > 1.0) return 4294967295u;
  646. if(val < -1.0) return 0;
  647. return (ALint)(val * 2147483647.0) + 2147483648u;
  648. }
  649. static inline ALuint Conv_ALuint_ALmulaw(ALmulaw val)
  650. { return Conv_ALuint_ALshort(DecodeMuLaw(val)); }
  651. static inline ALuint Conv_ALuint_ALalaw(ALalaw val)
  652. { return Conv_ALuint_ALshort(DecodeALaw(val)); }
  653. static inline ALuint Conv_ALuint_ALbyte3(ALbyte3 val)
  654. { return (DecodeByte3(val)+8388608)<<8; }
  655. static inline ALuint Conv_ALuint_ALubyte3(ALubyte3 val)
  656. { return DecodeUByte3(val)<<8; }
  657. static inline ALfloat Conv_ALfloat_ALbyte(ALbyte val)
  658. { return val * (1.0f/127.0f); }
  659. static inline ALfloat Conv_ALfloat_ALubyte(ALubyte val)
  660. { return (val-128) * (1.0f/127.0f); }
  661. static inline ALfloat Conv_ALfloat_ALshort(ALshort val)
  662. { return val * (1.0f/32767.0f); }
  663. static inline ALfloat Conv_ALfloat_ALushort(ALushort val)
  664. { return (val-32768) * (1.0f/32767.0f); }
  665. static inline ALfloat Conv_ALfloat_ALint(ALint val)
  666. { return (ALfloat)(val>>7) * (1.0f/16777215.0f); }
  667. static inline ALfloat Conv_ALfloat_ALuint(ALuint val)
  668. { return (ALfloat)((ALint)(val>>7)-16777216) * (1.0f/16777215.0f); }
  669. static inline ALfloat Conv_ALfloat_ALfloat(ALfloat val)
  670. { return (val==val) ? val : 0.0f; }
  671. static inline ALfloat Conv_ALfloat_ALdouble(ALdouble val)
  672. { return (val==val) ? (ALfloat)val : 0.0f; }
  673. static inline ALfloat Conv_ALfloat_ALmulaw(ALmulaw val)
  674. { return Conv_ALfloat_ALshort(DecodeMuLaw(val)); }
  675. static inline ALfloat Conv_ALfloat_ALalaw(ALalaw val)
  676. { return Conv_ALfloat_ALshort(DecodeALaw(val)); }
  677. static inline ALfloat Conv_ALfloat_ALbyte3(ALbyte3 val)
  678. { return (ALfloat)(DecodeByte3(val) * (1.0/8388607.0)); }
  679. static inline ALfloat Conv_ALfloat_ALubyte3(ALubyte3 val)
  680. { return (ALfloat)((DecodeUByte3(val)-8388608) * (1.0/8388607.0)); }
  681. static inline ALdouble Conv_ALdouble_ALbyte(ALbyte val)
  682. { return val * (1.0/127.0); }
  683. static inline ALdouble Conv_ALdouble_ALubyte(ALubyte val)
  684. { return (val-128) * (1.0/127.0); }
  685. static inline ALdouble Conv_ALdouble_ALshort(ALshort val)
  686. { return val * (1.0/32767.0); }
  687. static inline ALdouble Conv_ALdouble_ALushort(ALushort val)
  688. { return (val-32768) * (1.0/32767.0); }
  689. static inline ALdouble Conv_ALdouble_ALint(ALint val)
  690. { return val * (1.0/2147483647.0); }
  691. static inline ALdouble Conv_ALdouble_ALuint(ALuint val)
  692. { return (ALint)(val-2147483648u) * (1.0/2147483647.0); }
  693. static inline ALdouble Conv_ALdouble_ALfloat(ALfloat val)
  694. { return (val==val) ? val : 0.0f; }
  695. static inline ALdouble Conv_ALdouble_ALdouble(ALdouble val)
  696. { return (val==val) ? val : 0.0; }
  697. static inline ALdouble Conv_ALdouble_ALmulaw(ALmulaw val)
  698. { return Conv_ALdouble_ALshort(DecodeMuLaw(val)); }
  699. static inline ALdouble Conv_ALdouble_ALalaw(ALalaw val)
  700. { return Conv_ALdouble_ALshort(DecodeALaw(val)); }
  701. static inline ALdouble Conv_ALdouble_ALbyte3(ALbyte3 val)
  702. { return DecodeByte3(val) * (1.0/8388607.0); }
  703. static inline ALdouble Conv_ALdouble_ALubyte3(ALubyte3 val)
  704. { return (DecodeUByte3(val)-8388608) * (1.0/8388607.0); }
  705. #define DECL_TEMPLATE(T) \
  706. static inline ALmulaw Conv_ALmulaw_##T(T val) \
  707. { return EncodeMuLaw(Conv_ALshort_##T(val)); }
  708. DECL_TEMPLATE(ALbyte)
  709. DECL_TEMPLATE(ALubyte)
  710. DECL_TEMPLATE(ALshort)
  711. DECL_TEMPLATE(ALushort)
  712. DECL_TEMPLATE(ALint)
  713. DECL_TEMPLATE(ALuint)
  714. DECL_TEMPLATE(ALfloat)
  715. DECL_TEMPLATE(ALdouble)
  716. static inline ALmulaw Conv_ALmulaw_ALmulaw(ALmulaw val)
  717. { return val; }
  718. DECL_TEMPLATE(ALalaw)
  719. DECL_TEMPLATE(ALbyte3)
  720. DECL_TEMPLATE(ALubyte3)
  721. #undef DECL_TEMPLATE
  722. #define DECL_TEMPLATE(T) \
  723. static inline ALalaw Conv_ALalaw_##T(T val) \
  724. { return EncodeALaw(Conv_ALshort_##T(val)); }
  725. DECL_TEMPLATE(ALbyte)
  726. DECL_TEMPLATE(ALubyte)
  727. DECL_TEMPLATE(ALshort)
  728. DECL_TEMPLATE(ALushort)
  729. DECL_TEMPLATE(ALint)
  730. DECL_TEMPLATE(ALuint)
  731. DECL_TEMPLATE(ALfloat)
  732. DECL_TEMPLATE(ALdouble)
  733. DECL_TEMPLATE(ALmulaw)
  734. static inline ALalaw Conv_ALalaw_ALalaw(ALalaw val)
  735. { return val; }
  736. DECL_TEMPLATE(ALbyte3)
  737. DECL_TEMPLATE(ALubyte3)
  738. #undef DECL_TEMPLATE
  739. #define DECL_TEMPLATE(T) \
  740. static inline ALbyte3 Conv_ALbyte3_##T(T val) \
  741. { return EncodeByte3(Conv_ALint_##T(val)>>8); }
  742. DECL_TEMPLATE(ALbyte)
  743. DECL_TEMPLATE(ALubyte)
  744. DECL_TEMPLATE(ALshort)
  745. DECL_TEMPLATE(ALushort)
  746. DECL_TEMPLATE(ALint)
  747. DECL_TEMPLATE(ALuint)
  748. DECL_TEMPLATE(ALfloat)
  749. DECL_TEMPLATE(ALdouble)
  750. DECL_TEMPLATE(ALmulaw)
  751. DECL_TEMPLATE(ALalaw)
  752. static inline ALbyte3 Conv_ALbyte3_ALbyte3(ALbyte3 val)
  753. { return val; }
  754. DECL_TEMPLATE(ALubyte3)
  755. #undef DECL_TEMPLATE
  756. #define DECL_TEMPLATE(T) \
  757. static inline ALubyte3 Conv_ALubyte3_##T(T val) \
  758. { return EncodeUByte3(Conv_ALuint_##T(val)>>8); }
  759. DECL_TEMPLATE(ALbyte)
  760. DECL_TEMPLATE(ALubyte)
  761. DECL_TEMPLATE(ALshort)
  762. DECL_TEMPLATE(ALushort)
  763. DECL_TEMPLATE(ALint)
  764. DECL_TEMPLATE(ALuint)
  765. DECL_TEMPLATE(ALfloat)
  766. DECL_TEMPLATE(ALdouble)
  767. DECL_TEMPLATE(ALmulaw)
  768. DECL_TEMPLATE(ALalaw)
  769. DECL_TEMPLATE(ALbyte3)
  770. static inline ALubyte3 Conv_ALubyte3_ALubyte3(ALubyte3 val)
  771. { return val; }
  772. #undef DECL_TEMPLATE
  773. #define DECL_TEMPLATE(T1, T2) \
  774. static void Convert_##T1##_##T2(T1 *dst, const T2 *src, ALuint numchans, \
  775. ALuint len, ALsizei UNUSED(align)) \
  776. { \
  777. ALuint i, j; \
  778. for(i = 0;i < len;i++) \
  779. { \
  780. for(j = 0;j < numchans;j++) \
  781. *(dst++) = Conv_##T1##_##T2(*(src++)); \
  782. } \
  783. }
  784. #define DECL_TEMPLATE2(T) \
  785. DECL_TEMPLATE(T, ALbyte) \
  786. DECL_TEMPLATE(T, ALubyte) \
  787. DECL_TEMPLATE(T, ALshort) \
  788. DECL_TEMPLATE(T, ALushort) \
  789. DECL_TEMPLATE(T, ALint) \
  790. DECL_TEMPLATE(T, ALuint) \
  791. DECL_TEMPLATE(T, ALfloat) \
  792. DECL_TEMPLATE(T, ALdouble) \
  793. DECL_TEMPLATE(T, ALmulaw) \
  794. DECL_TEMPLATE(T, ALalaw) \
  795. DECL_TEMPLATE(T, ALbyte3) \
  796. DECL_TEMPLATE(T, ALubyte3)
  797. DECL_TEMPLATE2(ALbyte)
  798. DECL_TEMPLATE2(ALubyte)
  799. DECL_TEMPLATE2(ALshort)
  800. DECL_TEMPLATE2(ALushort)
  801. DECL_TEMPLATE2(ALint)
  802. DECL_TEMPLATE2(ALuint)
  803. DECL_TEMPLATE2(ALfloat)
  804. DECL_TEMPLATE2(ALdouble)
  805. DECL_TEMPLATE2(ALmulaw)
  806. DECL_TEMPLATE2(ALalaw)
  807. DECL_TEMPLATE2(ALbyte3)
  808. DECL_TEMPLATE2(ALubyte3)
  809. #undef DECL_TEMPLATE2
  810. #undef DECL_TEMPLATE
  811. #define DECL_TEMPLATE(T) \
  812. static void Convert_##T##_ALima4(T *dst, const ALima4 *src, ALuint numchans, \
  813. ALuint len, ALuint align) \
  814. { \
  815. ALsizei byte_align = ((align-1)/2 + 4) * numchans; \
  816. DECL_VLA(ALshort, tmp, align*numchans); \
  817. ALuint i, j, k; \
  818. \
  819. assert(align > 0 && (len%align) == 0); \
  820. for(i = 0;i < len;i += align) \
  821. { \
  822. DecodeIMA4Block(tmp, src, numchans, align); \
  823. src += byte_align; \
  824. \
  825. for(j = 0;j < align;j++) \
  826. { \
  827. for(k = 0;k < numchans;k++) \
  828. *(dst++) = Conv_##T##_ALshort(tmp[j*numchans + k]); \
  829. } \
  830. } \
  831. }
  832. DECL_TEMPLATE(ALbyte)
  833. DECL_TEMPLATE(ALubyte)
  834. static void Convert_ALshort_ALima4(ALshort *dst, const ALima4 *src, ALuint numchans,
  835. ALuint len, ALuint align)
  836. {
  837. ALsizei byte_align = ((align-1)/2 + 4) * numchans;
  838. ALuint i;
  839. assert(align > 0 && (len%align) == 0);
  840. for(i = 0;i < len;i += align)
  841. {
  842. DecodeIMA4Block(dst, src, numchans, align);
  843. src += byte_align;
  844. dst += align*numchans;
  845. }
  846. }
  847. DECL_TEMPLATE(ALushort)
  848. DECL_TEMPLATE(ALint)
  849. DECL_TEMPLATE(ALuint)
  850. DECL_TEMPLATE(ALfloat)
  851. DECL_TEMPLATE(ALdouble)
  852. DECL_TEMPLATE(ALmulaw)
  853. DECL_TEMPLATE(ALalaw)
  854. DECL_TEMPLATE(ALbyte3)
  855. DECL_TEMPLATE(ALubyte3)
  856. #undef DECL_TEMPLATE
  857. #define DECL_TEMPLATE(T) \
  858. static void Convert_ALima4_##T(ALima4 *dst, const T *src, ALuint numchans, \
  859. ALuint len, ALuint align) \
  860. { \
  861. ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \
  862. ALint index[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \
  863. ALsizei byte_align = ((align-1)/2 + 4) * numchans; \
  864. DECL_VLA(ALshort, tmp, align*numchans); \
  865. ALuint i, j, k; \
  866. \
  867. assert(align > 0 && (len%align) == 0); \
  868. for(i = 0;i < len;i += align) \
  869. { \
  870. for(j = 0;j < align;j++) \
  871. { \
  872. for(k = 0;k < numchans;k++) \
  873. tmp[j*numchans + k] = Conv_ALshort_##T(*(src++)); \
  874. } \
  875. EncodeIMA4Block(dst, tmp, sample, index, numchans, align); \
  876. dst += byte_align; \
  877. } \
  878. }
  879. DECL_TEMPLATE(ALbyte)
  880. DECL_TEMPLATE(ALubyte)
  881. static void Convert_ALima4_ALshort(ALima4 *dst, const ALshort *src,
  882. ALuint numchans, ALuint len, ALuint align)
  883. {
  884. ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0};
  885. ALint index[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0};
  886. ALsizei byte_align = ((align-1)/2 + 4) * numchans;
  887. ALuint i;
  888. assert(align > 0 && (len%align) == 0);
  889. for(i = 0;i < len;i += align)
  890. {
  891. EncodeIMA4Block(dst, src, sample, index, numchans, align);
  892. src += align*numchans;
  893. dst += byte_align;
  894. }
  895. }
  896. DECL_TEMPLATE(ALushort)
  897. DECL_TEMPLATE(ALint)
  898. DECL_TEMPLATE(ALuint)
  899. DECL_TEMPLATE(ALfloat)
  900. DECL_TEMPLATE(ALdouble)
  901. DECL_TEMPLATE(ALmulaw)
  902. DECL_TEMPLATE(ALalaw)
  903. DECL_TEMPLATE(ALbyte3)
  904. DECL_TEMPLATE(ALubyte3)
  905. #undef DECL_TEMPLATE
  906. #define DECL_TEMPLATE(T) \
  907. static void Convert_##T##_ALmsadpcm(T *dst, const ALmsadpcm *src, \
  908. ALuint numchans, ALuint len, \
  909. ALuint align) \
  910. { \
  911. ALsizei byte_align = ((align-2)/2 + 7) * numchans; \
  912. DECL_VLA(ALshort, tmp, align*numchans); \
  913. ALuint i, j, k; \
  914. \
  915. assert(align > 1 && (len%align) == 0); \
  916. for(i = 0;i < len;i += align) \
  917. { \
  918. DecodeMSADPCMBlock(tmp, src, numchans, align); \
  919. src += byte_align; \
  920. \
  921. for(j = 0;j < align;j++) \
  922. { \
  923. for(k = 0;k < numchans;k++) \
  924. *(dst++) = Conv_##T##_ALshort(tmp[j*numchans + k]); \
  925. } \
  926. } \
  927. }
  928. DECL_TEMPLATE(ALbyte)
  929. DECL_TEMPLATE(ALubyte)
  930. static void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALmsadpcm *src,
  931. ALuint numchans, ALuint len,
  932. ALuint align)
  933. {
  934. ALsizei byte_align = ((align-2)/2 + 7) * numchans;
  935. ALuint i;
  936. assert(align > 1 && (len%align) == 0);
  937. for(i = 0;i < len;i += align)
  938. {
  939. DecodeMSADPCMBlock(dst, src, numchans, align);
  940. src += byte_align;
  941. dst += align*numchans;
  942. }
  943. }
  944. DECL_TEMPLATE(ALushort)
  945. DECL_TEMPLATE(ALint)
  946. DECL_TEMPLATE(ALuint)
  947. DECL_TEMPLATE(ALfloat)
  948. DECL_TEMPLATE(ALdouble)
  949. DECL_TEMPLATE(ALmulaw)
  950. DECL_TEMPLATE(ALalaw)
  951. DECL_TEMPLATE(ALbyte3)
  952. DECL_TEMPLATE(ALubyte3)
  953. #undef DECL_TEMPLATE
  954. #define DECL_TEMPLATE(T) \
  955. static void Convert_ALmsadpcm_##T(ALmsadpcm *dst, const T *src, \
  956. ALuint numchans, ALuint len, ALuint align) \
  957. { \
  958. ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \
  959. ALsizei byte_align = ((align-2)/2 + 7) * numchans; \
  960. DECL_VLA(ALshort, tmp, align*numchans); \
  961. ALuint i, j, k; \
  962. \
  963. assert(align > 1 && (len%align) == 0); \
  964. for(i = 0;i < len;i += align) \
  965. { \
  966. for(j = 0;j < align;j++) \
  967. { \
  968. for(k = 0;k < numchans;k++) \
  969. tmp[j*numchans + k] = Conv_ALshort_##T(*(src++)); \
  970. } \
  971. EncodeMSADPCMBlock(dst, tmp, sample, numchans, align); \
  972. dst += byte_align; \
  973. } \
  974. }
  975. DECL_TEMPLATE(ALbyte)
  976. DECL_TEMPLATE(ALubyte)
  977. static void Convert_ALmsadpcm_ALshort(ALmsadpcm *dst, const ALshort *src,
  978. ALuint numchans, ALuint len, ALuint align)
  979. {
  980. ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0};
  981. ALsizei byte_align = ((align-2)/2 + 7) * numchans;
  982. ALuint i;
  983. assert(align > 1 && (len%align) == 0);
  984. for(i = 0;i < len;i += align)
  985. {
  986. EncodeMSADPCMBlock(dst, src, sample, numchans, align);
  987. src += align*numchans;
  988. dst += byte_align;
  989. }
  990. }
  991. DECL_TEMPLATE(ALushort)
  992. DECL_TEMPLATE(ALint)
  993. DECL_TEMPLATE(ALuint)
  994. DECL_TEMPLATE(ALfloat)
  995. DECL_TEMPLATE(ALdouble)
  996. DECL_TEMPLATE(ALmulaw)
  997. DECL_TEMPLATE(ALalaw)
  998. DECL_TEMPLATE(ALbyte3)
  999. DECL_TEMPLATE(ALubyte3)
  1000. #undef DECL_TEMPLATE
  1001. /* NOTE: We don't store compressed samples internally, so these conversions
  1002. * should never happen. */
  1003. static void Convert_ALima4_ALima4(ALima4* UNUSED(dst), const ALima4* UNUSED(src),
  1004. ALuint UNUSED(numchans), ALuint UNUSED(len),
  1005. ALuint UNUSED(align))
  1006. {
  1007. ERR("Unexpected IMA4-to-IMA4 conversion!\n");
  1008. }
  1009. static void Convert_ALmsadpcm_ALmsadpcm(ALmsadpcm* UNUSED(dst), const ALmsadpcm* UNUSED(src),
  1010. ALuint UNUSED(numchans), ALuint UNUSED(len),
  1011. ALuint UNUSED(align))
  1012. {
  1013. ERR("Unexpected MSADPCM-to-MSADPCM conversion!\n");
  1014. }
  1015. static void Convert_ALmsadpcm_ALima4(ALmsadpcm* UNUSED(dst), const ALima4* UNUSED(src),
  1016. ALuint UNUSED(numchans), ALuint UNUSED(len),
  1017. ALuint UNUSED(align))
  1018. {
  1019. ERR("Unexpected IMA4-to-MSADPCM conversion!\n");
  1020. }
  1021. static void Convert_ALima4_ALmsadpcm(ALima4* UNUSED(dst), const ALmsadpcm* UNUSED(src),
  1022. ALuint UNUSED(numchans), ALuint UNUSED(len),
  1023. ALuint UNUSED(align))
  1024. {
  1025. ERR("Unexpected MSADPCM-to-IMA4 conversion!\n");
  1026. }
  1027. #define DECL_TEMPLATE(T) \
  1028. static void Convert_##T(T *dst, const ALvoid *src, enum UserFmtType srcType, \
  1029. ALsizei numchans, ALsizei len, ALsizei align) \
  1030. { \
  1031. switch(srcType) \
  1032. { \
  1033. case UserFmtByte: \
  1034. Convert_##T##_ALbyte(dst, src, numchans, len, align); \
  1035. break; \
  1036. case UserFmtUByte: \
  1037. Convert_##T##_ALubyte(dst, src, numchans, len, align); \
  1038. break; \
  1039. case UserFmtShort: \
  1040. Convert_##T##_ALshort(dst, src, numchans, len, align); \
  1041. break; \
  1042. case UserFmtUShort: \
  1043. Convert_##T##_ALushort(dst, src, numchans, len, align); \
  1044. break; \
  1045. case UserFmtInt: \
  1046. Convert_##T##_ALint(dst, src, numchans, len, align); \
  1047. break; \
  1048. case UserFmtUInt: \
  1049. Convert_##T##_ALuint(dst, src, numchans, len, align); \
  1050. break; \
  1051. case UserFmtFloat: \
  1052. Convert_##T##_ALfloat(dst, src, numchans, len, align); \
  1053. break; \
  1054. case UserFmtDouble: \
  1055. Convert_##T##_ALdouble(dst, src, numchans, len, align); \
  1056. break; \
  1057. case UserFmtMulaw: \
  1058. Convert_##T##_ALmulaw(dst, src, numchans, len, align); \
  1059. break; \
  1060. case UserFmtAlaw: \
  1061. Convert_##T##_ALalaw(dst, src, numchans, len, align); \
  1062. break; \
  1063. case UserFmtIMA4: \
  1064. Convert_##T##_ALima4(dst, src, numchans, len, align); \
  1065. break; \
  1066. case UserFmtMSADPCM: \
  1067. Convert_##T##_ALmsadpcm(dst, src, numchans, len, align); \
  1068. break; \
  1069. case UserFmtByte3: \
  1070. Convert_##T##_ALbyte3(dst, src, numchans, len, align); \
  1071. break; \
  1072. case UserFmtUByte3: \
  1073. Convert_##T##_ALubyte3(dst, src, numchans, len, align); \
  1074. break; \
  1075. } \
  1076. }
  1077. DECL_TEMPLATE(ALbyte)
  1078. DECL_TEMPLATE(ALubyte)
  1079. DECL_TEMPLATE(ALshort)
  1080. DECL_TEMPLATE(ALushort)
  1081. DECL_TEMPLATE(ALint)
  1082. DECL_TEMPLATE(ALuint)
  1083. DECL_TEMPLATE(ALfloat)
  1084. DECL_TEMPLATE(ALdouble)
  1085. DECL_TEMPLATE(ALmulaw)
  1086. DECL_TEMPLATE(ALalaw)
  1087. DECL_TEMPLATE(ALima4)
  1088. DECL_TEMPLATE(ALmsadpcm)
  1089. DECL_TEMPLATE(ALbyte3)
  1090. DECL_TEMPLATE(ALubyte3)
  1091. #undef DECL_TEMPLATE
  1092. void ConvertData(ALvoid *dst, enum UserFmtType dstType, const ALvoid *src, enum UserFmtType srcType, ALsizei numchans, ALsizei len, ALsizei align)
  1093. {
  1094. switch(dstType)
  1095. {
  1096. case UserFmtByte:
  1097. Convert_ALbyte(dst, src, srcType, numchans, len, align);
  1098. break;
  1099. case UserFmtUByte:
  1100. Convert_ALubyte(dst, src, srcType, numchans, len, align);
  1101. break;
  1102. case UserFmtShort:
  1103. Convert_ALshort(dst, src, srcType, numchans, len, align);
  1104. break;
  1105. case UserFmtUShort:
  1106. Convert_ALushort(dst, src, srcType, numchans, len, align);
  1107. break;
  1108. case UserFmtInt:
  1109. Convert_ALint(dst, src, srcType, numchans, len, align);
  1110. break;
  1111. case UserFmtUInt:
  1112. Convert_ALuint(dst, src, srcType, numchans, len, align);
  1113. break;
  1114. case UserFmtFloat:
  1115. Convert_ALfloat(dst, src, srcType, numchans, len, align);
  1116. break;
  1117. case UserFmtDouble:
  1118. Convert_ALdouble(dst, src, srcType, numchans, len, align);
  1119. break;
  1120. case UserFmtMulaw:
  1121. Convert_ALmulaw(dst, src, srcType, numchans, len, align);
  1122. break;
  1123. case UserFmtAlaw:
  1124. Convert_ALalaw(dst, src, srcType, numchans, len, align);
  1125. break;
  1126. case UserFmtIMA4:
  1127. Convert_ALima4(dst, src, srcType, numchans, len, align);
  1128. break;
  1129. case UserFmtMSADPCM:
  1130. Convert_ALmsadpcm(dst, src, srcType, numchans, len, align);
  1131. break;
  1132. case UserFmtByte3:
  1133. Convert_ALbyte3(dst, src, srcType, numchans, len, align);
  1134. break;
  1135. case UserFmtUByte3:
  1136. Convert_ALubyte3(dst, src, srcType, numchans, len, align);
  1137. break;
  1138. }
  1139. }