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.

656 lines
16KB

  1. /*
  2. * downmix.c
  3. * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
  4. * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  5. *
  6. * This file is part of a52dec, a free ATSC A-52 stream decoder.
  7. * See http://liba52.sourceforge.net/ for updates.
  8. *
  9. * a52dec is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * a52dec is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22. */
  23. #include "config.h"
  24. #include <string.h>
  25. #include <inttypes.h>
  26. #include "a52.h"
  27. #include "a52_internal.h"
  28. #define CONVERT(acmod,output) (((output) << 3) + (acmod))
  29. int a52_downmix_init (int input, int flags, sample_t * level,
  30. sample_t clev, sample_t slev)
  31. {
  32. static uint8_t table[11][8] = {
  33. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  34. A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
  35. {A52_MONO, A52_MONO, A52_MONO, A52_MONO,
  36. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  37. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  38. A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
  39. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  40. A52_STEREO, A52_3F, A52_STEREO, A52_3F},
  41. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  42. A52_2F1R, A52_2F1R, A52_2F1R, A52_2F1R},
  43. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  44. A52_2F1R, A52_3F1R, A52_2F1R, A52_3F1R},
  45. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  46. A52_2F2R, A52_2F2R, A52_2F2R, A52_2F2R},
  47. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  48. A52_2F2R, A52_3F2R, A52_2F2R, A52_3F2R},
  49. {A52_CHANNEL1, A52_MONO, A52_MONO, A52_MONO,
  50. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  51. {A52_CHANNEL2, A52_MONO, A52_MONO, A52_MONO,
  52. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  53. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_DOLBY,
  54. A52_DOLBY, A52_DOLBY, A52_DOLBY, A52_DOLBY}
  55. };
  56. int output;
  57. output = flags & A52_CHANNEL_MASK;
  58. if (output > A52_DOLBY)
  59. return -1;
  60. output = table[output][input & 7];
  61. if ((output == A52_STEREO) &&
  62. ((input == A52_DOLBY) || ((input == A52_3F) && (clev == LEVEL_3DB))))
  63. output = A52_DOLBY;
  64. if (flags & A52_ADJUST_LEVEL)
  65. switch (CONVERT (input & 7, output)) {
  66. case CONVERT (A52_3F, A52_MONO):
  67. *level *= LEVEL_3DB / (1 + clev);
  68. break;
  69. case CONVERT (A52_STEREO, A52_MONO):
  70. case CONVERT (A52_2F2R, A52_2F1R):
  71. case CONVERT (A52_3F2R, A52_3F1R):
  72. level_3db:
  73. *level *= LEVEL_3DB;
  74. break;
  75. case CONVERT (A52_3F2R, A52_2F1R):
  76. if (clev < LEVEL_PLUS3DB - 1)
  77. goto level_3db;
  78. /* break thru */
  79. case CONVERT (A52_3F, A52_STEREO):
  80. case CONVERT (A52_3F1R, A52_2F1R):
  81. case CONVERT (A52_3F1R, A52_2F2R):
  82. case CONVERT (A52_3F2R, A52_2F2R):
  83. *level /= 1 + clev;
  84. break;
  85. case CONVERT (A52_2F1R, A52_MONO):
  86. *level *= LEVEL_PLUS3DB / (2 + slev);
  87. break;
  88. case CONVERT (A52_2F1R, A52_STEREO):
  89. case CONVERT (A52_3F1R, A52_3F):
  90. *level /= 1 + slev * LEVEL_3DB;
  91. break;
  92. case CONVERT (A52_3F1R, A52_MONO):
  93. *level *= LEVEL_3DB / (1 + clev + 0.5 * slev);
  94. break;
  95. case CONVERT (A52_3F1R, A52_STEREO):
  96. *level /= 1 + clev + slev * LEVEL_3DB;
  97. break;
  98. case CONVERT (A52_2F2R, A52_MONO):
  99. *level *= LEVEL_3DB / (1 + slev);
  100. break;
  101. case CONVERT (A52_2F2R, A52_STEREO):
  102. case CONVERT (A52_3F2R, A52_3F):
  103. *level /= 1 + slev;
  104. break;
  105. case CONVERT (A52_3F2R, A52_MONO):
  106. *level *= LEVEL_3DB / (1 + clev + slev);
  107. break;
  108. case CONVERT (A52_3F2R, A52_STEREO):
  109. *level /= 1 + clev + slev;
  110. break;
  111. case CONVERT (A52_MONO, A52_DOLBY):
  112. *level *= LEVEL_PLUS3DB;
  113. break;
  114. case CONVERT (A52_3F, A52_DOLBY):
  115. case CONVERT (A52_2F1R, A52_DOLBY):
  116. *level *= 1 / (1 + LEVEL_3DB);
  117. break;
  118. case CONVERT (A52_3F1R, A52_DOLBY):
  119. case CONVERT (A52_2F2R, A52_DOLBY):
  120. *level *= 1 / (1 + 2 * LEVEL_3DB);
  121. break;
  122. case CONVERT (A52_3F2R, A52_DOLBY):
  123. *level *= 1 / (1 + 3 * LEVEL_3DB);
  124. break;
  125. }
  126. return output;
  127. }
  128. int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level,
  129. sample_t clev, sample_t slev)
  130. {
  131. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  132. case CONVERT (A52_CHANNEL, A52_CHANNEL):
  133. case CONVERT (A52_MONO, A52_MONO):
  134. case CONVERT (A52_STEREO, A52_STEREO):
  135. case CONVERT (A52_3F, A52_3F):
  136. case CONVERT (A52_2F1R, A52_2F1R):
  137. case CONVERT (A52_3F1R, A52_3F1R):
  138. case CONVERT (A52_2F2R, A52_2F2R):
  139. case CONVERT (A52_3F2R, A52_3F2R):
  140. case CONVERT (A52_STEREO, A52_DOLBY):
  141. coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level;
  142. return 0;
  143. case CONVERT (A52_CHANNEL, A52_MONO):
  144. coeff[0] = coeff[1] = level * LEVEL_6DB;
  145. return 3;
  146. case CONVERT (A52_STEREO, A52_MONO):
  147. coeff[0] = coeff[1] = level * LEVEL_3DB;
  148. return 3;
  149. case CONVERT (A52_3F, A52_MONO):
  150. coeff[0] = coeff[2] = level * LEVEL_3DB;
  151. coeff[1] = level * clev * LEVEL_PLUS3DB;
  152. return 7;
  153. case CONVERT (A52_2F1R, A52_MONO):
  154. coeff[0] = coeff[1] = level * LEVEL_3DB;
  155. coeff[2] = level * slev * LEVEL_3DB;
  156. return 7;
  157. case CONVERT (A52_2F2R, A52_MONO):
  158. coeff[0] = coeff[1] = level * LEVEL_3DB;
  159. coeff[2] = coeff[3] = level * slev * LEVEL_3DB;
  160. return 15;
  161. case CONVERT (A52_3F1R, A52_MONO):
  162. coeff[0] = coeff[2] = level * LEVEL_3DB;
  163. coeff[1] = level * clev * LEVEL_PLUS3DB;
  164. coeff[3] = level * slev * LEVEL_3DB;
  165. return 15;
  166. case CONVERT (A52_3F2R, A52_MONO):
  167. coeff[0] = coeff[2] = level * LEVEL_3DB;
  168. coeff[1] = level * clev * LEVEL_PLUS3DB;
  169. coeff[3] = coeff[4] = level * slev * LEVEL_3DB;
  170. return 31;
  171. case CONVERT (A52_MONO, A52_DOLBY):
  172. coeff[0] = level * LEVEL_3DB;
  173. return 0;
  174. case CONVERT (A52_3F, A52_DOLBY):
  175. clev = LEVEL_3DB;
  176. case CONVERT (A52_3F, A52_STEREO):
  177. case CONVERT (A52_3F1R, A52_2F1R):
  178. case CONVERT (A52_3F2R, A52_2F2R):
  179. coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
  180. coeff[1] = level * clev;
  181. return 7;
  182. case CONVERT (A52_2F1R, A52_DOLBY):
  183. slev = 1;
  184. case CONVERT (A52_2F1R, A52_STEREO):
  185. coeff[0] = coeff[1] = level;
  186. coeff[2] = level * slev * LEVEL_3DB;
  187. return 7;
  188. case CONVERT (A52_3F1R, A52_DOLBY):
  189. clev = LEVEL_3DB;
  190. slev = 1;
  191. case CONVERT (A52_3F1R, A52_STEREO):
  192. coeff[0] = coeff[2] = level;
  193. coeff[1] = level * clev;
  194. coeff[3] = level * slev * LEVEL_3DB;
  195. return 15;
  196. case CONVERT (A52_2F2R, A52_DOLBY):
  197. slev = LEVEL_3DB;
  198. case CONVERT (A52_2F2R, A52_STEREO):
  199. coeff[0] = coeff[1] = level;
  200. coeff[2] = coeff[3] = level * slev;
  201. return 15;
  202. case CONVERT (A52_3F2R, A52_DOLBY):
  203. clev = LEVEL_3DB;
  204. case CONVERT (A52_3F2R, A52_2F1R):
  205. slev = LEVEL_3DB;
  206. case CONVERT (A52_3F2R, A52_STEREO):
  207. coeff[0] = coeff[2] = level;
  208. coeff[1] = level * clev;
  209. coeff[3] = coeff[4] = level * slev;
  210. return 31;
  211. case CONVERT (A52_3F1R, A52_3F):
  212. coeff[0] = coeff[1] = coeff[2] = level;
  213. coeff[3] = level * slev * LEVEL_3DB;
  214. return 13;
  215. case CONVERT (A52_3F2R, A52_3F):
  216. coeff[0] = coeff[1] = coeff[2] = level;
  217. coeff[3] = coeff[4] = level * slev;
  218. return 29;
  219. case CONVERT (A52_2F2R, A52_2F1R):
  220. coeff[0] = coeff[1] = level;
  221. coeff[2] = coeff[3] = level * LEVEL_3DB;
  222. return 12;
  223. case CONVERT (A52_3F2R, A52_3F1R):
  224. coeff[0] = coeff[1] = coeff[2] = level;
  225. coeff[3] = coeff[4] = level * LEVEL_3DB;
  226. return 24;
  227. case CONVERT (A52_2F1R, A52_2F2R):
  228. coeff[0] = coeff[1] = level;
  229. coeff[2] = level * LEVEL_3DB;
  230. return 0;
  231. case CONVERT (A52_3F1R, A52_2F2R):
  232. coeff[0] = coeff[2] = level;
  233. coeff[1] = level * clev;
  234. coeff[3] = level * LEVEL_3DB;
  235. return 7;
  236. case CONVERT (A52_3F1R, A52_3F2R):
  237. coeff[0] = coeff[1] = coeff[2] = level;
  238. coeff[3] = level * LEVEL_3DB;
  239. return 0;
  240. case CONVERT (A52_CHANNEL, A52_CHANNEL1):
  241. coeff[0] = level;
  242. coeff[1] = 0;
  243. return 0;
  244. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  245. coeff[0] = 0;
  246. coeff[1] = level;
  247. return 0;
  248. }
  249. return -1; /* NOTREACHED */
  250. }
  251. static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias)
  252. {
  253. int i;
  254. for (i = 0; i < 256; i++)
  255. dest[i] += src[i] + bias;
  256. }
  257. static void mix3to1 (sample_t * samples, sample_t bias)
  258. {
  259. int i;
  260. for (i = 0; i < 256; i++)
  261. samples[i] += samples[i + 256] + samples[i + 512] + bias;
  262. }
  263. static void mix4to1 (sample_t * samples, sample_t bias)
  264. {
  265. int i;
  266. for (i = 0; i < 256; i++)
  267. samples[i] += (samples[i + 256] + samples[i + 512] +
  268. samples[i + 768] + bias);
  269. }
  270. static void mix5to1 (sample_t * samples, sample_t bias)
  271. {
  272. int i;
  273. for (i = 0; i < 256; i++)
  274. samples[i] += (samples[i + 256] + samples[i + 512] +
  275. samples[i + 768] + samples[i + 1024] + bias);
  276. }
  277. static void mix3to2 (sample_t * samples, sample_t bias)
  278. {
  279. int i;
  280. sample_t common;
  281. for (i = 0; i < 256; i++) {
  282. common = samples[i + 256] + bias;
  283. samples[i] += common;
  284. samples[i + 256] = samples[i + 512] + common;
  285. }
  286. }
  287. static void mix21to2 (sample_t * left, sample_t * right, sample_t bias)
  288. {
  289. int i;
  290. sample_t common;
  291. for (i = 0; i < 256; i++) {
  292. common = right[i + 256] + bias;
  293. left[i] += common;
  294. right[i] += common;
  295. }
  296. }
  297. static void mix21toS (sample_t * samples, sample_t bias)
  298. {
  299. int i;
  300. sample_t surround;
  301. for (i = 0; i < 256; i++) {
  302. surround = samples[i + 512];
  303. samples[i] += bias - surround;
  304. samples[i + 256] += bias + surround;
  305. }
  306. }
  307. static void mix31to2 (sample_t * samples, sample_t bias)
  308. {
  309. int i;
  310. sample_t common;
  311. for (i = 0; i < 256; i++) {
  312. common = samples[i + 256] + samples[i + 768] + bias;
  313. samples[i] += common;
  314. samples[i + 256] = samples[i + 512] + common;
  315. }
  316. }
  317. static void mix31toS (sample_t * samples, sample_t bias)
  318. {
  319. int i;
  320. sample_t common, surround;
  321. for (i = 0; i < 256; i++) {
  322. common = samples[i + 256] + bias;
  323. surround = samples[i + 768];
  324. samples[i] += common - surround;
  325. samples[i + 256] = samples[i + 512] + common + surround;
  326. }
  327. }
  328. static void mix22toS (sample_t * samples, sample_t bias)
  329. {
  330. int i;
  331. sample_t surround;
  332. for (i = 0; i < 256; i++) {
  333. surround = samples[i + 512] + samples[i + 768];
  334. samples[i] += bias - surround;
  335. samples[i + 256] += bias + surround;
  336. }
  337. }
  338. static void mix32to2 (sample_t * samples, sample_t bias)
  339. {
  340. int i;
  341. sample_t common;
  342. for (i = 0; i < 256; i++) {
  343. common = samples[i + 256] + bias;
  344. samples[i] += common + samples[i + 768];
  345. samples[i + 256] = common + samples[i + 512] + samples[i + 1024];
  346. }
  347. }
  348. static void mix32toS (sample_t * samples, sample_t bias)
  349. {
  350. int i;
  351. sample_t common, surround;
  352. for (i = 0; i < 256; i++) {
  353. common = samples[i + 256] + bias;
  354. surround = samples[i + 768] + samples[i + 1024];
  355. samples[i] += common - surround;
  356. samples[i + 256] = samples[i + 512] + common + surround;
  357. }
  358. }
  359. static void move2to1 (sample_t * src, sample_t * dest, sample_t bias)
  360. {
  361. int i;
  362. for (i = 0; i < 256; i++)
  363. dest[i] = src[i] + src[i + 256] + bias;
  364. }
  365. static void zero (sample_t * samples)
  366. {
  367. int i;
  368. for (i = 0; i < 256; i++)
  369. samples[i] = 0;
  370. }
  371. void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
  372. sample_t clev, sample_t slev)
  373. {
  374. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  375. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  376. memcpy (samples, samples + 256, 256 * sizeof (sample_t));
  377. break;
  378. case CONVERT (A52_CHANNEL, A52_MONO):
  379. case CONVERT (A52_STEREO, A52_MONO):
  380. mix_2to1:
  381. mix2to1 (samples, samples + 256, bias);
  382. break;
  383. case CONVERT (A52_2F1R, A52_MONO):
  384. if (slev == 0)
  385. goto mix_2to1;
  386. case CONVERT (A52_3F, A52_MONO):
  387. mix_3to1:
  388. mix3to1 (samples, bias);
  389. break;
  390. case CONVERT (A52_3F1R, A52_MONO):
  391. if (slev == 0)
  392. goto mix_3to1;
  393. case CONVERT (A52_2F2R, A52_MONO):
  394. if (slev == 0)
  395. goto mix_2to1;
  396. mix4to1 (samples, bias);
  397. break;
  398. case CONVERT (A52_3F2R, A52_MONO):
  399. if (slev == 0)
  400. goto mix_3to1;
  401. mix5to1 (samples, bias);
  402. break;
  403. case CONVERT (A52_MONO, A52_DOLBY):
  404. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  405. break;
  406. case CONVERT (A52_3F, A52_STEREO):
  407. case CONVERT (A52_3F, A52_DOLBY):
  408. mix_3to2:
  409. mix3to2 (samples, bias);
  410. break;
  411. case CONVERT (A52_2F1R, A52_STEREO):
  412. if (slev == 0)
  413. break;
  414. mix21to2 (samples, samples + 256, bias);
  415. break;
  416. case CONVERT (A52_2F1R, A52_DOLBY):
  417. mix21toS (samples, bias);
  418. break;
  419. case CONVERT (A52_3F1R, A52_STEREO):
  420. if (slev == 0)
  421. goto mix_3to2;
  422. mix31to2 (samples, bias);
  423. break;
  424. case CONVERT (A52_3F1R, A52_DOLBY):
  425. mix31toS (samples, bias);
  426. break;
  427. case CONVERT (A52_2F2R, A52_STEREO):
  428. if (slev == 0)
  429. break;
  430. mix2to1 (samples, samples + 512, bias);
  431. mix2to1 (samples + 256, samples + 768, bias);
  432. break;
  433. case CONVERT (A52_2F2R, A52_DOLBY):
  434. mix22toS (samples, bias);
  435. break;
  436. case CONVERT (A52_3F2R, A52_STEREO):
  437. if (slev == 0)
  438. goto mix_3to2;
  439. mix32to2 (samples, bias);
  440. break;
  441. case CONVERT (A52_3F2R, A52_DOLBY):
  442. mix32toS (samples, bias);
  443. break;
  444. case CONVERT (A52_3F1R, A52_3F):
  445. if (slev == 0)
  446. break;
  447. mix21to2 (samples, samples + 512, bias);
  448. break;
  449. case CONVERT (A52_3F2R, A52_3F):
  450. if (slev == 0)
  451. break;
  452. mix2to1 (samples, samples + 768, bias);
  453. mix2to1 (samples + 512, samples + 1024, bias);
  454. break;
  455. case CONVERT (A52_3F1R, A52_2F1R):
  456. mix3to2 (samples, bias);
  457. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  458. break;
  459. case CONVERT (A52_2F2R, A52_2F1R):
  460. mix2to1 (samples + 512, samples + 768, bias);
  461. break;
  462. case CONVERT (A52_3F2R, A52_2F1R):
  463. mix3to2 (samples, bias);
  464. move2to1 (samples + 768, samples + 512, bias);
  465. break;
  466. case CONVERT (A52_3F2R, A52_3F1R):
  467. mix2to1 (samples + 768, samples + 1024, bias);
  468. break;
  469. case CONVERT (A52_2F1R, A52_2F2R):
  470. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  471. break;
  472. case CONVERT (A52_3F1R, A52_2F2R):
  473. mix3to2 (samples, bias);
  474. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  475. break;
  476. case CONVERT (A52_3F2R, A52_2F2R):
  477. mix3to2 (samples, bias);
  478. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  479. memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
  480. break;
  481. case CONVERT (A52_3F1R, A52_3F2R):
  482. memcpy (samples + 1027, samples + 768, 256 * sizeof (sample_t));
  483. break;
  484. }
  485. }
  486. void a52_upmix (sample_t * samples, int acmod, int output)
  487. {
  488. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  489. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  490. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  491. break;
  492. case CONVERT (A52_3F2R, A52_MONO):
  493. zero (samples + 1024);
  494. case CONVERT (A52_3F1R, A52_MONO):
  495. case CONVERT (A52_2F2R, A52_MONO):
  496. zero (samples + 768);
  497. case CONVERT (A52_3F, A52_MONO):
  498. case CONVERT (A52_2F1R, A52_MONO):
  499. zero (samples + 512);
  500. case CONVERT (A52_CHANNEL, A52_MONO):
  501. case CONVERT (A52_STEREO, A52_MONO):
  502. zero (samples + 256);
  503. break;
  504. case CONVERT (A52_3F2R, A52_STEREO):
  505. case CONVERT (A52_3F2R, A52_DOLBY):
  506. zero (samples + 1024);
  507. case CONVERT (A52_3F1R, A52_STEREO):
  508. case CONVERT (A52_3F1R, A52_DOLBY):
  509. zero (samples + 768);
  510. case CONVERT (A52_3F, A52_STEREO):
  511. case CONVERT (A52_3F, A52_DOLBY):
  512. mix_3to2:
  513. memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t));
  514. zero (samples + 256);
  515. break;
  516. case CONVERT (A52_2F2R, A52_STEREO):
  517. case CONVERT (A52_2F2R, A52_DOLBY):
  518. zero (samples + 768);
  519. case CONVERT (A52_2F1R, A52_STEREO):
  520. case CONVERT (A52_2F1R, A52_DOLBY):
  521. zero (samples + 512);
  522. break;
  523. case CONVERT (A52_3F2R, A52_3F):
  524. zero (samples + 1024);
  525. case CONVERT (A52_3F1R, A52_3F):
  526. case CONVERT (A52_2F2R, A52_2F1R):
  527. zero (samples + 768);
  528. break;
  529. case CONVERT (A52_3F2R, A52_3F1R):
  530. zero (samples + 1024);
  531. break;
  532. case CONVERT (A52_3F2R, A52_2F1R):
  533. zero (samples + 1024);
  534. case CONVERT (A52_3F1R, A52_2F1R):
  535. mix_31to21:
  536. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  537. goto mix_3to2;
  538. case CONVERT (A52_3F2R, A52_2F2R):
  539. memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
  540. goto mix_31to21;
  541. }
  542. }