00001
00002
00003 static inline int16_t convert (int32_t i)
00004 {
00005 if (i > 0x43c07fff)
00006 return 32767;
00007 else if (i < 0x43bf8000)
00008 return -32768;
00009 else
00010 return i - 0x43c00000;
00011 }
00012
00013 static int a52_resample_MONO_to_5_C(float * _f, int16_t * s16){
00014 int i;
00015 int32_t * f = (int32_t *) _f;
00016 for (i = 0; i < 256; i++) {
00017 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
00018 s16[5*i+4] = convert (f[i]);
00019 }
00020 return 5*256;
00021 }
00022
00023 static int a52_resample_MONO_to_1_C(float * _f, int16_t * s16){
00024 int i;
00025 int32_t * f = (int32_t *) _f;
00026 for (i = 0; i < 256; i++) {
00027 s16[i] = convert (f[i]);
00028 }
00029 return 1*256;
00030 }
00031
00032 static int a52_resample_STEREO_to_2_C(float * _f, int16_t * s16){
00033 int i;
00034 int32_t * f = (int32_t *) _f;
00035 for (i = 0; i < 256; i++) {
00036 s16[2*i] = convert (f[i]);
00037 s16[2*i+1] = convert (f[i+256]);
00038 }
00039 return 2*256;
00040 }
00041
00042 static int a52_resample_3F_to_5_C(float * _f, int16_t * s16){
00043 int i;
00044 int32_t * f = (int32_t *) _f;
00045 for (i = 0; i < 256; i++) {
00046 s16[5*i] = convert (f[i]);
00047 s16[5*i+1] = convert (f[i+512]);
00048 s16[5*i+2] = s16[5*i+3] = 0;
00049 s16[5*i+4] = convert (f[i+256]);
00050 }
00051 return 5*256;
00052 }
00053
00054 static int a52_resample_2F_2R_to_4_C(float * _f, int16_t * s16){
00055 int i;
00056 int32_t * f = (int32_t *) _f;
00057 for (i = 0; i < 256; i++) {
00058 s16[4*i] = convert (f[i]);
00059 s16[4*i+1] = convert (f[i+256]);
00060 s16[4*i+2] = convert (f[i+512]);
00061 s16[4*i+3] = convert (f[i+768]);
00062 }
00063 return 4*256;
00064 }
00065
00066 static int a52_resample_3F_2R_to_5_C(float * _f, int16_t * s16){
00067 int i;
00068 int32_t * f = (int32_t *) _f;
00069 for (i = 0; i < 256; i++) {
00070 s16[5*i] = convert (f[i]);
00071 s16[5*i+1] = convert (f[i+512]);
00072 s16[5*i+2] = convert (f[i+768]);
00073 s16[5*i+3] = convert (f[i+1024]);
00074 s16[5*i+4] = convert (f[i+256]);
00075 }
00076 return 5*256;
00077 }
00078
00079 static int a52_resample_MONO_LFE_to_6_C(float * _f, int16_t * s16){
00080 int i;
00081 int32_t * f = (int32_t *) _f;
00082 for (i = 0; i < 256; i++) {
00083 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
00084 s16[6*i+4] = convert (f[i+256]);
00085 s16[6*i+5] = convert (f[i]);
00086 }
00087 return 6*256;
00088 }
00089
00090 static int a52_resample_STEREO_LFE_to_6_C(float * _f, int16_t * s16){
00091 int i;
00092 int32_t * f = (int32_t *) _f;
00093 for (i = 0; i < 256; i++) {
00094 s16[6*i] = convert (f[i+256]);
00095 s16[6*i+1] = convert (f[i+512]);
00096 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
00097 s16[6*i+5] = convert (f[i]);
00098 }
00099 return 6*256;
00100 }
00101
00102 static int a52_resample_3F_LFE_to_6_C(float * _f, int16_t * s16){
00103 int i;
00104 int32_t * f = (int32_t *) _f;
00105 for (i = 0; i < 256; i++) {
00106 s16[6*i] = convert (f[i+256]);
00107 s16[6*i+1] = convert (f[i+768]);
00108 s16[6*i+2] = s16[6*i+3] = 0;
00109 s16[6*i+4] = convert (f[i+512]);
00110 s16[6*i+5] = convert (f[i]);
00111 }
00112 return 6*256;
00113 }
00114
00115 static int a52_resample_2F_2R_LFE_to_6_C(float * _f, int16_t * s16){
00116 int i;
00117 int32_t * f = (int32_t *) _f;
00118 for (i = 0; i < 256; i++) {
00119 s16[6*i] = convert (f[i+256]);
00120 s16[6*i+1] = convert (f[i+512]);
00121 s16[6*i+2] = convert (f[i+768]);
00122 s16[6*i+3] = convert (f[i+1024]);
00123 s16[6*i+4] = 0;
00124 s16[6*i+5] = convert (f[i]);
00125 }
00126 return 6*256;
00127 }
00128
00129 static int a52_resample_3F_2R_LFE_to_6_C(float * _f, int16_t * s16){
00130 int i;
00131 int32_t * f = (int32_t *) _f;
00132 for (i = 0; i < 256; i++) {
00133 s16[6*i] = convert (f[i+256]);
00134 s16[6*i+1] = convert (f[i+768]);
00135 s16[6*i+2] = convert (f[i+1024]);
00136 s16[6*i+3] = convert (f[i+1280]);
00137 s16[6*i+4] = convert (f[i+512]);
00138 s16[6*i+5] = convert (f[i]);
00139 }
00140 return 6*256;
00141 }
00142
00143
00144 static void* a52_resample_C(int flags, int ch){
00145 switch (flags) {
00146 case A52_MONO:
00147 if(ch==5) return a52_resample_MONO_to_5_C;
00148 if(ch==1) return a52_resample_MONO_to_1_C;
00149 break;
00150 case A52_CHANNEL:
00151 case A52_STEREO:
00152 case A52_DOLBY:
00153 if(ch==2) return a52_resample_STEREO_to_2_C;
00154 break;
00155 case A52_3F:
00156 if(ch==5) return a52_resample_3F_to_5_C;
00157 break;
00158 case A52_2F2R:
00159 if(ch==4) return a52_resample_2F_2R_to_4_C;
00160 break;
00161 case A52_3F2R:
00162 if(ch==5) return a52_resample_3F_2R_to_5_C;
00163 break;
00164 case A52_MONO | A52_LFE:
00165 if(ch==6) return a52_resample_MONO_LFE_to_6_C;
00166 break;
00167 case A52_CHANNEL | A52_LFE:
00168 case A52_STEREO | A52_LFE:
00169 case A52_DOLBY | A52_LFE:
00170 if(ch==6) return a52_resample_STEREO_LFE_to_6_C;
00171 break;
00172 case A52_3F | A52_LFE:
00173 if(ch==6) return a52_resample_3F_LFE_to_6_C;
00174 break;
00175 case A52_2F2R | A52_LFE:
00176 if(ch==6) return a52_resample_2F_2R_LFE_to_6_C;
00177 break;
00178 case A52_3F2R | A52_LFE:
00179 if(ch==6) return a52_resample_3F_2R_LFE_to_6_C;
00180 break;
00181 }
00182 return NULL;
00183 }