resample_c.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  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. }