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.

686 lines
17KB

  1. /*
  2. * downmix.c
  3. * Copyright (C) 2000-2003 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, level_t * level,
  30. level_t clev, level_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 (LEVEL_3DB))))
  63. output = A52_DOLBY;
  64. if (flags & A52_ADJUST_LEVEL) {
  65. level_t adjust;
  66. switch (CONVERT (input & 7, output)) {
  67. case CONVERT (A52_3F, A52_MONO):
  68. adjust = DIV (LEVEL_3DB, LEVEL (1) + clev);
  69. break;
  70. case CONVERT (A52_STEREO, A52_MONO):
  71. case CONVERT (A52_2F2R, A52_2F1R):
  72. case CONVERT (A52_3F2R, A52_3F1R):
  73. level_3db:
  74. adjust = LEVEL (LEVEL_3DB);
  75. break;
  76. case CONVERT (A52_3F2R, A52_2F1R):
  77. if (clev < LEVEL (LEVEL_PLUS3DB - 1))
  78. goto level_3db;
  79. /* break thru */
  80. case CONVERT (A52_3F, A52_STEREO):
  81. case CONVERT (A52_3F1R, A52_2F1R):
  82. case CONVERT (A52_3F1R, A52_2F2R):
  83. case CONVERT (A52_3F2R, A52_2F2R):
  84. adjust = DIV (1, LEVEL (1) + clev);
  85. break;
  86. case CONVERT (A52_2F1R, A52_MONO):
  87. adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev);
  88. break;
  89. case CONVERT (A52_2F1R, A52_STEREO):
  90. case CONVERT (A52_3F1R, A52_3F):
  91. adjust = DIV (1, LEVEL (1) + MUL_C (slev, LEVEL_3DB));
  92. break;
  93. case CONVERT (A52_3F1R, A52_MONO):
  94. adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + MUL_C (slev, 0.5));
  95. break;
  96. case CONVERT (A52_3F1R, A52_STEREO):
  97. adjust = DIV (1, LEVEL (1) + clev + MUL_C (slev, LEVEL_3DB));
  98. break;
  99. case CONVERT (A52_2F2R, A52_MONO):
  100. adjust = DIV (LEVEL_3DB, LEVEL (1) + slev);
  101. break;
  102. case CONVERT (A52_2F2R, A52_STEREO):
  103. case CONVERT (A52_3F2R, A52_3F):
  104. adjust = DIV (1, LEVEL (1) + slev);
  105. break;
  106. case CONVERT (A52_3F2R, A52_MONO):
  107. adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev);
  108. break;
  109. case CONVERT (A52_3F2R, A52_STEREO):
  110. adjust = DIV (1, LEVEL (1) + clev + slev);
  111. break;
  112. case CONVERT (A52_MONO, A52_DOLBY):
  113. adjust = LEVEL (LEVEL_PLUS3DB);
  114. break;
  115. case CONVERT (A52_3F, A52_DOLBY):
  116. case CONVERT (A52_2F1R, A52_DOLBY):
  117. adjust = LEVEL (1 / (1 + LEVEL_3DB));
  118. break;
  119. case CONVERT (A52_3F1R, A52_DOLBY):
  120. case CONVERT (A52_2F2R, A52_DOLBY):
  121. adjust = LEVEL (1 / (1 + 2 * LEVEL_3DB));
  122. break;
  123. case CONVERT (A52_3F2R, A52_DOLBY):
  124. adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB));
  125. break;
  126. default:
  127. return output;
  128. }
  129. *level = MUL_L (*level, adjust);
  130. }
  131. return output;
  132. }
  133. int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
  134. level_t clev, level_t slev)
  135. {
  136. level_t level_3db;
  137. level_3db = MUL_C (level, LEVEL_3DB);
  138. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  139. case CONVERT (A52_CHANNEL, A52_CHANNEL):
  140. case CONVERT (A52_MONO, A52_MONO):
  141. case CONVERT (A52_STEREO, A52_STEREO):
  142. case CONVERT (A52_3F, A52_3F):
  143. case CONVERT (A52_2F1R, A52_2F1R):
  144. case CONVERT (A52_3F1R, A52_3F1R):
  145. case CONVERT (A52_2F2R, A52_2F2R):
  146. case CONVERT (A52_3F2R, A52_3F2R):
  147. case CONVERT (A52_STEREO, A52_DOLBY):
  148. coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level;
  149. return 0;
  150. case CONVERT (A52_CHANNEL, A52_MONO):
  151. coeff[0] = coeff[1] = MUL_C (level, LEVEL_6DB);
  152. return 3;
  153. case CONVERT (A52_STEREO, A52_MONO):
  154. coeff[0] = coeff[1] = level_3db;
  155. return 3;
  156. case CONVERT (A52_3F, A52_MONO):
  157. coeff[0] = coeff[2] = level_3db;
  158. coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
  159. return 7;
  160. case CONVERT (A52_2F1R, A52_MONO):
  161. coeff[0] = coeff[1] = level_3db;
  162. coeff[2] = MUL_L (level_3db, slev);
  163. return 7;
  164. case CONVERT (A52_2F2R, A52_MONO):
  165. coeff[0] = coeff[1] = level_3db;
  166. coeff[2] = coeff[3] = MUL_L (level_3db, slev);
  167. return 15;
  168. case CONVERT (A52_3F1R, A52_MONO):
  169. coeff[0] = coeff[2] = level_3db;
  170. coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
  171. coeff[3] = MUL_L (level_3db, slev);
  172. return 15;
  173. case CONVERT (A52_3F2R, A52_MONO):
  174. coeff[0] = coeff[2] = level_3db;
  175. coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
  176. coeff[3] = coeff[4] = MUL_L (level_3db, slev);
  177. return 31;
  178. case CONVERT (A52_MONO, A52_DOLBY):
  179. coeff[0] = level_3db;
  180. return 0;
  181. case CONVERT (A52_3F, A52_DOLBY):
  182. coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
  183. coeff[1] = level_3db;
  184. return 7;
  185. case CONVERT (A52_3F, A52_STEREO):
  186. case CONVERT (A52_3F1R, A52_2F1R):
  187. case CONVERT (A52_3F2R, A52_2F2R):
  188. coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
  189. coeff[1] = MUL_L (level, clev);
  190. return 7;
  191. case CONVERT (A52_2F1R, A52_DOLBY):
  192. coeff[0] = coeff[1] = level;
  193. coeff[2] = level_3db;
  194. return 7;
  195. case CONVERT (A52_2F1R, A52_STEREO):
  196. coeff[0] = coeff[1] = level;
  197. coeff[2] = MUL_L (level_3db, slev);
  198. return 7;
  199. case CONVERT (A52_3F1R, A52_DOLBY):
  200. coeff[0] = coeff[2] = level;
  201. coeff[1] = coeff[3] = level_3db;
  202. return 15;
  203. case CONVERT (A52_3F1R, A52_STEREO):
  204. coeff[0] = coeff[2] = level;
  205. coeff[1] = MUL_L (level, clev);
  206. coeff[3] = MUL_L (level_3db, slev);
  207. return 15;
  208. case CONVERT (A52_2F2R, A52_DOLBY):
  209. coeff[0] = coeff[1] = level;
  210. coeff[2] = coeff[3] = level_3db;
  211. return 15;
  212. case CONVERT (A52_2F2R, A52_STEREO):
  213. coeff[0] = coeff[1] = level;
  214. coeff[2] = coeff[3] = MUL_L (level, slev);
  215. return 15;
  216. case CONVERT (A52_3F2R, A52_DOLBY):
  217. coeff[0] = coeff[2] = level;
  218. coeff[1] = coeff[3] = coeff[4] = level_3db;
  219. return 31;
  220. case CONVERT (A52_3F2R, A52_2F1R):
  221. coeff[0] = coeff[2] = level;
  222. coeff[1] = MUL_L (level, clev);
  223. coeff[3] = coeff[4] = level_3db;
  224. return 31;
  225. case CONVERT (A52_3F2R, A52_STEREO):
  226. coeff[0] = coeff[2] = level;
  227. coeff[1] = MUL_L (level, clev);
  228. coeff[3] = coeff[4] = MUL_L (level, slev);
  229. return 31;
  230. case CONVERT (A52_3F1R, A52_3F):
  231. coeff[0] = coeff[1] = coeff[2] = level;
  232. coeff[3] = MUL_L (level_3db, slev);
  233. return 13;
  234. case CONVERT (A52_3F2R, A52_3F):
  235. coeff[0] = coeff[1] = coeff[2] = level;
  236. coeff[3] = coeff[4] = MUL_L (level, slev);
  237. return 29;
  238. case CONVERT (A52_2F2R, A52_2F1R):
  239. coeff[0] = coeff[1] = level;
  240. coeff[2] = coeff[3] = level_3db;
  241. return 12;
  242. case CONVERT (A52_3F2R, A52_3F1R):
  243. coeff[0] = coeff[1] = coeff[2] = level;
  244. coeff[3] = coeff[4] = level_3db;
  245. return 24;
  246. case CONVERT (A52_2F1R, A52_2F2R):
  247. coeff[0] = coeff[1] = level;
  248. coeff[2] = level_3db;
  249. return 0;
  250. case CONVERT (A52_3F1R, A52_2F2R):
  251. coeff[0] = coeff[2] = level;
  252. coeff[1] = MUL_L (level, clev);
  253. coeff[3] = level_3db;
  254. return 7;
  255. case CONVERT (A52_3F1R, A52_3F2R):
  256. coeff[0] = coeff[1] = coeff[2] = level;
  257. coeff[3] = level_3db;
  258. return 0;
  259. case CONVERT (A52_CHANNEL, A52_CHANNEL1):
  260. coeff[0] = level;
  261. coeff[1] = 0;
  262. return 0;
  263. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  264. coeff[0] = 0;
  265. coeff[1] = level;
  266. return 0;
  267. }
  268. return -1; /* NOTREACHED */
  269. }
  270. static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias)
  271. {
  272. int i;
  273. for (i = 0; i < 256; i++)
  274. dest[i] += BIAS (src[i]);
  275. }
  276. static void mix3to1 (sample_t * samples, sample_t bias)
  277. {
  278. int i;
  279. for (i = 0; i < 256; i++)
  280. samples[i] += BIAS (samples[i + 256] + samples[i + 512]);
  281. }
  282. static void mix4to1 (sample_t * samples, sample_t bias)
  283. {
  284. int i;
  285. for (i = 0; i < 256; i++)
  286. samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
  287. samples[i + 768]);
  288. }
  289. static void mix5to1 (sample_t * samples, sample_t bias)
  290. {
  291. int i;
  292. for (i = 0; i < 256; i++)
  293. samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
  294. samples[i + 768] + samples[i + 1024]);
  295. }
  296. static void mix3to2 (sample_t * samples, sample_t bias)
  297. {
  298. int i;
  299. sample_t common;
  300. for (i = 0; i < 256; i++) {
  301. common = BIAS (samples[i + 256]);
  302. samples[i] += common;
  303. samples[i + 256] = samples[i + 512] + common;
  304. }
  305. }
  306. static void mix21to2 (sample_t * left, sample_t * right, sample_t bias)
  307. {
  308. int i;
  309. sample_t common;
  310. for (i = 0; i < 256; i++) {
  311. common = BIAS (right[i + 256]);
  312. left[i] += common;
  313. right[i] += common;
  314. }
  315. }
  316. static void mix21toS (sample_t * samples, sample_t bias)
  317. {
  318. int i;
  319. sample_t surround;
  320. for (i = 0; i < 256; i++) {
  321. surround = samples[i + 512];
  322. samples[i] += BIAS (-surround);
  323. samples[i + 256] += BIAS (surround);
  324. }
  325. }
  326. static void mix31to2 (sample_t * samples, sample_t bias)
  327. {
  328. int i;
  329. sample_t common;
  330. for (i = 0; i < 256; i++) {
  331. common = BIAS (samples[i + 256] + samples[i + 768]);
  332. samples[i] += common;
  333. samples[i + 256] = samples[i + 512] + common;
  334. }
  335. }
  336. static void mix31toS (sample_t * samples, sample_t bias)
  337. {
  338. int i;
  339. sample_t common, surround;
  340. for (i = 0; i < 256; i++) {
  341. common = BIAS (samples[i + 256]);
  342. surround = samples[i + 768];
  343. samples[i] += common - surround;
  344. samples[i + 256] = samples[i + 512] + common + surround;
  345. }
  346. }
  347. static void mix22toS (sample_t * samples, sample_t bias)
  348. {
  349. int i;
  350. sample_t surround;
  351. for (i = 0; i < 256; i++) {
  352. surround = samples[i + 512] + samples[i + 768];
  353. samples[i] += BIAS (-surround);
  354. samples[i + 256] += BIAS (surround);
  355. }
  356. }
  357. static void mix32to2 (sample_t * samples, sample_t bias)
  358. {
  359. int i;
  360. sample_t common;
  361. for (i = 0; i < 256; i++) {
  362. common = BIAS (samples[i + 256]);
  363. samples[i] += common + samples[i + 768];
  364. samples[i + 256] = common + samples[i + 512] + samples[i + 1024];
  365. }
  366. }
  367. static void mix32toS (sample_t * samples, sample_t bias)
  368. {
  369. int i;
  370. sample_t common, surround;
  371. for (i = 0; i < 256; i++) {
  372. common = BIAS (samples[i + 256]);
  373. surround = samples[i + 768] + samples[i + 1024];
  374. samples[i] += common - surround;
  375. samples[i + 256] = samples[i + 512] + common + surround;
  376. }
  377. }
  378. static void move2to1 (sample_t * src, sample_t * dest, sample_t bias)
  379. {
  380. int i;
  381. for (i = 0; i < 256; i++)
  382. dest[i] = BIAS (src[i] + src[i + 256]);
  383. }
  384. static void zero (sample_t * samples)
  385. {
  386. int i;
  387. for (i = 0; i < 256; i++)
  388. samples[i] = 0;
  389. }
  390. void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
  391. level_t clev, level_t slev)
  392. {
  393. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  394. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  395. memcpy (samples, samples + 256, 256 * sizeof (sample_t));
  396. break;
  397. case CONVERT (A52_CHANNEL, A52_MONO):
  398. case CONVERT (A52_STEREO, A52_MONO):
  399. mix_2to1:
  400. mix2to1 (samples, samples + 256, bias);
  401. break;
  402. case CONVERT (A52_2F1R, A52_MONO):
  403. if (slev == 0)
  404. goto mix_2to1;
  405. case CONVERT (A52_3F, A52_MONO):
  406. mix_3to1:
  407. mix3to1 (samples, bias);
  408. break;
  409. case CONVERT (A52_3F1R, A52_MONO):
  410. if (slev == 0)
  411. goto mix_3to1;
  412. case CONVERT (A52_2F2R, A52_MONO):
  413. if (slev == 0)
  414. goto mix_2to1;
  415. mix4to1 (samples, bias);
  416. break;
  417. case CONVERT (A52_3F2R, A52_MONO):
  418. if (slev == 0)
  419. goto mix_3to1;
  420. mix5to1 (samples, bias);
  421. break;
  422. case CONVERT (A52_MONO, A52_DOLBY):
  423. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  424. break;
  425. case CONVERT (A52_3F, A52_STEREO):
  426. case CONVERT (A52_3F, A52_DOLBY):
  427. mix_3to2:
  428. mix3to2 (samples, bias);
  429. break;
  430. case CONVERT (A52_2F1R, A52_STEREO):
  431. if (slev == 0)
  432. break;
  433. mix21to2 (samples, samples + 256, bias);
  434. break;
  435. case CONVERT (A52_2F1R, A52_DOLBY):
  436. mix21toS (samples, bias);
  437. break;
  438. case CONVERT (A52_3F1R, A52_STEREO):
  439. if (slev == 0)
  440. goto mix_3to2;
  441. mix31to2 (samples, bias);
  442. break;
  443. case CONVERT (A52_3F1R, A52_DOLBY):
  444. mix31toS (samples, bias);
  445. break;
  446. case CONVERT (A52_2F2R, A52_STEREO):
  447. if (slev == 0)
  448. break;
  449. mix2to1 (samples, samples + 512, bias);
  450. mix2to1 (samples + 256, samples + 768, bias);
  451. break;
  452. case CONVERT (A52_2F2R, A52_DOLBY):
  453. mix22toS (samples, bias);
  454. break;
  455. case CONVERT (A52_3F2R, A52_STEREO):
  456. if (slev == 0)
  457. goto mix_3to2;
  458. mix32to2 (samples, bias);
  459. break;
  460. case CONVERT (A52_3F2R, A52_DOLBY):
  461. mix32toS (samples, bias);
  462. break;
  463. case CONVERT (A52_3F1R, A52_3F):
  464. if (slev == 0)
  465. break;
  466. mix21to2 (samples, samples + 512, bias);
  467. break;
  468. case CONVERT (A52_3F2R, A52_3F):
  469. if (slev == 0)
  470. break;
  471. mix2to1 (samples, samples + 768, bias);
  472. mix2to1 (samples + 512, samples + 1024, bias);
  473. break;
  474. case CONVERT (A52_3F1R, A52_2F1R):
  475. mix3to2 (samples, bias);
  476. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  477. break;
  478. case CONVERT (A52_2F2R, A52_2F1R):
  479. mix2to1 (samples + 512, samples + 768, bias);
  480. break;
  481. case CONVERT (A52_3F2R, A52_2F1R):
  482. mix3to2 (samples, bias);
  483. move2to1 (samples + 768, samples + 512, bias);
  484. break;
  485. case CONVERT (A52_3F2R, A52_3F1R):
  486. mix2to1 (samples + 768, samples + 1024, bias);
  487. break;
  488. case CONVERT (A52_2F1R, A52_2F2R):
  489. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  490. break;
  491. case CONVERT (A52_3F1R, A52_2F2R):
  492. mix3to2 (samples, bias);
  493. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  494. break;
  495. case CONVERT (A52_3F2R, A52_2F2R):
  496. mix3to2 (samples, bias);
  497. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  498. memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
  499. break;
  500. case CONVERT (A52_3F1R, A52_3F2R):
  501. memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
  502. break;
  503. }
  504. }
  505. void a52_upmix (sample_t * samples, int acmod, int output)
  506. {
  507. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  508. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  509. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  510. break;
  511. case CONVERT (A52_3F2R, A52_MONO):
  512. zero (samples + 1024);
  513. case CONVERT (A52_3F1R, A52_MONO):
  514. case CONVERT (A52_2F2R, A52_MONO):
  515. zero (samples + 768);
  516. case CONVERT (A52_3F, A52_MONO):
  517. case CONVERT (A52_2F1R, A52_MONO):
  518. zero (samples + 512);
  519. case CONVERT (A52_CHANNEL, A52_MONO):
  520. case CONVERT (A52_STEREO, A52_MONO):
  521. zero (samples + 256);
  522. break;
  523. case CONVERT (A52_3F2R, A52_STEREO):
  524. case CONVERT (A52_3F2R, A52_DOLBY):
  525. zero (samples + 1024);
  526. case CONVERT (A52_3F1R, A52_STEREO):
  527. case CONVERT (A52_3F1R, A52_DOLBY):
  528. zero (samples + 768);
  529. case CONVERT (A52_3F, A52_STEREO):
  530. case CONVERT (A52_3F, A52_DOLBY):
  531. mix_3to2:
  532. memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t));
  533. zero (samples + 256);
  534. break;
  535. case CONVERT (A52_2F2R, A52_STEREO):
  536. case CONVERT (A52_2F2R, A52_DOLBY):
  537. zero (samples + 768);
  538. case CONVERT (A52_2F1R, A52_STEREO):
  539. case CONVERT (A52_2F1R, A52_DOLBY):
  540. zero (samples + 512);
  541. break;
  542. case CONVERT (A52_3F2R, A52_3F):
  543. zero (samples + 1024);
  544. case CONVERT (A52_3F1R, A52_3F):
  545. case CONVERT (A52_2F2R, A52_2F1R):
  546. zero (samples + 768);
  547. break;
  548. case CONVERT (A52_3F2R, A52_3F1R):
  549. zero (samples + 1024);
  550. break;
  551. case CONVERT (A52_3F2R, A52_2F1R):
  552. zero (samples + 1024);
  553. case CONVERT (A52_3F1R, A52_2F1R):
  554. mix_31to21:
  555. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  556. goto mix_3to2;
  557. case CONVERT (A52_3F2R, A52_2F2R):
  558. memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
  559. goto mix_31to21;
  560. }
  561. }