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.

184 lines
4.5KB

  1. // this code is based on a52dec/libao/audio_out_oss.c
  2. static inline int16_t convert (int32_t i)
  3. {
  4. if (i > 0x43c07fff)
  5. return 32767;
  6. else if (i < 0x43bf8000)
  7. return -32768;
  8. else
  9. return i - 0x43c00000;
  10. }
  11. static int a52_resample_MONO_to_5_C(float * _f, int16_t * s16){
  12. int i;
  13. int32_t * f = (int32_t *) _f;
  14. for (i = 0; i < 256; i++) {
  15. s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
  16. s16[5*i+4] = convert (f[i]);
  17. }
  18. return 5*256;
  19. }
  20. static int a52_resample_MONO_to_1_C(float * _f, int16_t * s16){
  21. int i;
  22. int32_t * f = (int32_t *) _f;
  23. for (i = 0; i < 256; i++) {
  24. s16[i] = convert (f[i]);
  25. }
  26. return 1*256;
  27. }
  28. static int a52_resample_STEREO_to_2_C(float * _f, int16_t * s16){
  29. int i;
  30. int32_t * f = (int32_t *) _f;
  31. for (i = 0; i < 256; i++) {
  32. s16[2*i] = convert (f[i]);
  33. s16[2*i+1] = convert (f[i+256]);
  34. }
  35. return 2*256;
  36. }
  37. static int a52_resample_3F_to_5_C(float * _f, int16_t * s16){
  38. int i;
  39. int32_t * f = (int32_t *) _f;
  40. for (i = 0; i < 256; i++) {
  41. s16[5*i] = convert (f[i]);
  42. s16[5*i+1] = convert (f[i+512]);
  43. s16[5*i+2] = s16[5*i+3] = 0;
  44. s16[5*i+4] = convert (f[i+256]);
  45. }
  46. return 5*256;
  47. }
  48. static int a52_resample_2F_2R_to_4_C(float * _f, int16_t * s16){
  49. int i;
  50. int32_t * f = (int32_t *) _f;
  51. for (i = 0; i < 256; i++) {
  52. s16[4*i] = convert (f[i]);
  53. s16[4*i+1] = convert (f[i+256]);
  54. s16[4*i+2] = convert (f[i+512]);
  55. s16[4*i+3] = convert (f[i+768]);
  56. }
  57. return 4*256;
  58. }
  59. static int a52_resample_3F_2R_to_5_C(float * _f, int16_t * s16){
  60. int i;
  61. int32_t * f = (int32_t *) _f;
  62. for (i = 0; i < 256; i++) {
  63. s16[5*i] = convert (f[i]);
  64. s16[5*i+1] = convert (f[i+512]);
  65. s16[5*i+2] = convert (f[i+768]);
  66. s16[5*i+3] = convert (f[i+1024]);
  67. s16[5*i+4] = convert (f[i+256]);
  68. }
  69. return 5*256;
  70. }
  71. static int a52_resample_MONO_LFE_to_6_C(float * _f, int16_t * s16){
  72. int i;
  73. int32_t * f = (int32_t *) _f;
  74. for (i = 0; i < 256; i++) {
  75. s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
  76. s16[6*i+4] = convert (f[i+256]);
  77. s16[6*i+5] = convert (f[i]);
  78. }
  79. return 6*256;
  80. }
  81. static int a52_resample_STEREO_LFE_to_6_C(float * _f, int16_t * s16){
  82. int i;
  83. int32_t * f = (int32_t *) _f;
  84. for (i = 0; i < 256; i++) {
  85. s16[6*i] = convert (f[i+256]);
  86. s16[6*i+1] = convert (f[i+512]);
  87. s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
  88. s16[6*i+5] = convert (f[i]);
  89. }
  90. return 6*256;
  91. }
  92. static int a52_resample_3F_LFE_to_6_C(float * _f, int16_t * s16){
  93. int i;
  94. int32_t * f = (int32_t *) _f;
  95. for (i = 0; i < 256; i++) {
  96. s16[6*i] = convert (f[i+256]);
  97. s16[6*i+1] = convert (f[i+768]);
  98. s16[6*i+2] = s16[6*i+3] = 0;
  99. s16[6*i+4] = convert (f[i+512]);
  100. s16[6*i+5] = convert (f[i]);
  101. }
  102. return 6*256;
  103. }
  104. static int a52_resample_2F_2R_LFE_to_6_C(float * _f, int16_t * s16){
  105. int i;
  106. int32_t * f = (int32_t *) _f;
  107. for (i = 0; i < 256; i++) {
  108. s16[6*i] = convert (f[i+256]);
  109. s16[6*i+1] = convert (f[i+512]);
  110. s16[6*i+2] = convert (f[i+768]);
  111. s16[6*i+3] = convert (f[i+1024]);
  112. s16[6*i+4] = 0;
  113. s16[6*i+5] = convert (f[i]);
  114. }
  115. return 6*256;
  116. }
  117. static int a52_resample_3F_2R_LFE_to_6_C(float * _f, int16_t * s16){
  118. int i;
  119. int32_t * f = (int32_t *) _f;
  120. for (i = 0; i < 256; i++) {
  121. s16[6*i] = convert (f[i+256]);
  122. s16[6*i+1] = convert (f[i+768]);
  123. s16[6*i+2] = convert (f[i+1024]);
  124. s16[6*i+3] = convert (f[i+1280]);
  125. s16[6*i+4] = convert (f[i+512]);
  126. s16[6*i+5] = convert (f[i]);
  127. }
  128. return 6*256;
  129. }
  130. static void* a52_resample_C(int flags, int ch){
  131. switch (flags) {
  132. case A52_MONO:
  133. if(ch==5) return a52_resample_MONO_to_5_C;
  134. if(ch==1) return a52_resample_MONO_to_1_C;
  135. break;
  136. case A52_CHANNEL:
  137. case A52_STEREO:
  138. case A52_DOLBY:
  139. if(ch==2) return a52_resample_STEREO_to_2_C;
  140. break;
  141. case A52_3F:
  142. if(ch==5) return a52_resample_3F_to_5_C;
  143. break;
  144. case A52_2F2R:
  145. if(ch==4) return a52_resample_2F_2R_to_4_C;
  146. break;
  147. case A52_3F2R:
  148. if(ch==5) return a52_resample_3F_2R_to_5_C;
  149. break;
  150. case A52_MONO | A52_LFE:
  151. if(ch==6) return a52_resample_MONO_LFE_to_6_C;
  152. break;
  153. case A52_CHANNEL | A52_LFE:
  154. case A52_STEREO | A52_LFE:
  155. case A52_DOLBY | A52_LFE:
  156. if(ch==6) return a52_resample_STEREO_LFE_to_6_C;
  157. break;
  158. case A52_3F | A52_LFE:
  159. if(ch==6) return a52_resample_3F_LFE_to_6_C;
  160. break;
  161. case A52_2F2R | A52_LFE:
  162. if(ch==6) return a52_resample_2F_2R_LFE_to_6_C;
  163. break;
  164. case A52_3F2R | A52_LFE:
  165. if(ch==6) return a52_resample_3F_2R_LFE_to_6_C;
  166. break;
  167. }
  168. return NULL;
  169. }