00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef PRIVATE_H
00010 #define PRIVATE_H
00011
00012 typedef short word;
00013 typedef long longword;
00014
00015 typedef unsigned short uword;
00016 typedef unsigned long ulongword;
00017
00018 struct gsm_state {
00019
00020 word dp0[ 280 ];
00021
00022 word z1;
00023 longword L_z2;
00024 int mp;
00025
00026 word u[8];
00027 word LARpp[2][8];
00028 word j;
00029
00030 word ltp_cut;
00031 word nrp;
00032 word v[9];
00033 word msr;
00034
00035 char verbose;
00036 char fast;
00037
00038 char wav_fmt;
00039 unsigned char frame_index;
00040 unsigned char frame_chain;
00041 };
00042
00043
00044 #define MIN_WORD (-32767 - 1)
00045 #define MAX_WORD 32767
00046
00047 #define MIN_LONGWORD (-2147483647 - 1)
00048 #define MAX_LONGWORD 2147483647
00049
00050 #ifdef SASR
00051 #undef SASR
00052 #define SASR(x, by) ((x) >> (by))
00053 #else
00054 #define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))
00055 #endif
00056
00057 #include "proto.h"
00058
00059
00060
00061
00062 extern word gsm_mult P((word a, word b));
00063 extern longword gsm_L_mult P((word a, word b));
00064 extern word gsm_mult_r P((word a, word b));
00065
00066 extern word gsm_div P((word num, word denum));
00067
00068 extern word gsm_add P(( word a, word b ));
00069 extern longword gsm_L_add P(( longword a, longword b ));
00070
00071 extern word gsm_sub P((word a, word b));
00072 extern longword gsm_L_sub P((longword a, longword b));
00073
00074 extern word gsm_abs P((word a));
00075
00076 extern word gsm_norm P(( longword a ));
00077
00078 extern longword gsm_L_asl P((longword a, int n));
00079 extern word gsm_asl P((word a, int n));
00080
00081 extern longword gsm_L_asr P((longword a, int n));
00082 extern word gsm_asr P((word a, int n));
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 #define GSM_MULT_R(a, b) \
00093 (SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))
00094
00095 # define GSM_MULT(a,b) \
00096 (SASR( ((longword)(a) * (longword)(b)), 15 ))
00097
00098 # define GSM_L_MULT(a, b) \
00099 (((longword)(a) * (longword)(b)) << 1)
00100
00101 #if defined(__GNUC__) && defined(__i386__)
00102
00103 static __inline__ int GSM_L_ADD(int a, int b)
00104 {
00105 __asm__ __volatile__(
00106
00107 "addl %2,%0; jno 0f; movl $0x7fffffff,%0; adcl $0,%0; 0:"
00108 : "=r" (a)
00109 : "0" (a), "ir" (b)
00110 : "cc"
00111 );
00112 return(a);
00113 }
00114
00115 static __inline__ short GSM_ADD(short a, short b)
00116 {
00117 __asm__ __volatile__(
00118 "addw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"
00119 : "=r" (a)
00120 : "0" (a), "ir" (b)
00121 : "cc"
00122 );
00123 return(a);
00124 }
00125
00126 static __inline__ short GSM_SUB(short a, short b)
00127 {
00128 __asm__ __volatile__(
00129 "subw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"
00130 : "=r" (a)
00131 : "0" (a), "ir" (b)
00132 : "cc"
00133 );
00134 return(a);
00135 }
00136
00137 #else
00138
00139 # define GSM_L_ADD(a, b) \
00140 ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \
00141 : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
00142 >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \
00143 : ((b) <= 0 ? (a) + (b) \
00144 : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
00145 ? MAX_LONGWORD : utmp))
00146
00147
00148
00149
00150
00151
00152
00153
00154 #define GSM_ADD(a, b) \
00155 ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
00156 MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)
00157
00158 # define GSM_SUB(a, b) \
00159 ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
00160 ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
00161
00162 #endif
00163
00164 # define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 extern void Gsm_Coder P((
00184 struct gsm_state * S,
00185 word * s,
00186 word * LARc,
00187 word * Nc,
00188 word * bc,
00189 word * Mc,
00190 word * xmaxc,
00191 word * xMc ));
00192
00193 extern void Gsm_Long_Term_Predictor P((
00194 struct gsm_state * S,
00195 word * d,
00196 word * dp,
00197 word * e,
00198 word * dpp,
00199 word * Nc,
00200 word * bc ));
00201
00202 extern void Gsm_LPC_Analysis P((
00203 struct gsm_state * S,
00204 word * s,
00205 word * LARc));
00206
00207 extern void Gsm_Preprocess P((
00208 struct gsm_state * S,
00209 word * s, word * so));
00210
00211 extern void Gsm_Encoding P((
00212 struct gsm_state * S,
00213 word * e,
00214 word * ep,
00215 word * xmaxc,
00216 word * Mc,
00217 word * xMc));
00218
00219 extern void Gsm_Short_Term_Analysis_Filter P((
00220 struct gsm_state * S,
00221 word * LARc,
00222 word * d ));
00223
00224 extern void Gsm_Decoder P((
00225 struct gsm_state * S,
00226 word * LARcr,
00227 word * Ncr,
00228 word * bcr,
00229 word * Mcr,
00230 word * xmaxcr,
00231 word * xMcr,
00232 word * s));
00233
00234 extern void Gsm_Decoding P((
00235 struct gsm_state * S,
00236 word xmaxcr,
00237 word Mcr,
00238 word * xMcr,
00239 word * erp));
00240
00241 extern void Gsm_Long_Term_Synthesis_Filtering P((
00242 struct gsm_state* S,
00243 word Ncr,
00244 word bcr,
00245 word * erp,
00246 word * drp));
00247
00248 void Gsm_RPE_Decoding P((
00249 struct gsm_state *S,
00250 word xmaxcr,
00251 word Mcr,
00252 word * xMcr,
00253 word * erp));
00254
00255 void Gsm_RPE_Encoding P((
00256 struct gsm_state * S,
00257 word * e,
00258 word * xmaxc,
00259 word * Mc,
00260 word * xMc));
00261
00262 extern void Gsm_Short_Term_Synthesis_Filter P((
00263 struct gsm_state * S,
00264 word * LARcr,
00265 word * drp,
00266 word * s));
00267
00268 extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((
00269 word * dpp,
00270 word * ep,
00271 word * dp));
00272
00273
00274
00275
00276 #ifndef GSM_TABLE_C
00277
00278 extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];
00279 extern word gsm_INVA[8];
00280 extern word gsm_DLB[4], gsm_QLB[4];
00281 extern word gsm_H[11];
00282 extern word gsm_NRFAC[8];
00283 extern word gsm_FAC[8];
00284
00285 #endif
00286
00287
00288
00289
00290 #ifdef NDEBUG
00291
00292 # define gsm_debug_words(a, b, c, d)
00293 # define gsm_debug_longwords(a, b, c, d)
00294 # define gsm_debug_word(a, b)
00295 # define gsm_debug_longword(a, b)
00296
00297 #else
00298
00299 extern void gsm_debug_words P((char * name, int, int, word *));
00300 extern void gsm_debug_longwords P((char * name, int, int, longword *));
00301 extern void gsm_debug_longword P((char * name, longword));
00302 extern void gsm_debug_word P((char * name, word));
00303
00304 #endif
00305
00306 #include "unproto.h"
00307
00308 #endif