Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensynth.h
Go to the documentation of this file.
00001 /* 00002 synth.h: generic synth functions 00003 00004 copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1 00005 see COPYING and AUTHORS files in distribution or http://mpg123.org 00006 initially written by Michael Hipp, generalized by Thomas Orgis 00007 00008 This header is used multiple times to create different variants of these functions. 00009 See decode.c and friends. 00010 Hint: BLOCK, MONO_NAME, MONO2STEREO_NAME, SYNTH_NAME and SAMPLE_T as well as WRITE_SAMPLE do vary. 00011 00012 Thomas looked closely at the decode_1to1, decode_2to1 and decode_4to1 contents, seeing that they are too similar to be separate files. 00013 This is what resulted... 00014 00015 Basically, you need one set of these functions for each output sample type. 00016 That currently means signed short, 8bit or float/double; though unsigned short may come, too. 00017 00018 Define NO_AUTOINCREMENT i386 code that shall not rely on autoincrement. 00019 Actual benefit of this has to be examined; may apply to specific (old) compilers, only. 00020 */ 00021 00022 00023 /* Main synth function, uses the plain dct64 or dct64_i386. */ 00024 int SYNTH_NAME(real *bandPtr, int channel, mpg123_handle *fr, int final) 00025 { 00026 #ifndef NO_AUTOINCREMENT 00027 #define BACKPEDAL 0x10 /* We use autoincrement and thus need this re-adjustment for window/b0. */ 00028 #define MY_DCT64 dct64 00029 #else 00030 #define BACKPEDAL 0x00 /* i386 code does not need that. */ 00031 #define MY_DCT64 dct64_i386 00032 #endif 00033 static const int step = 2; 00034 SAMPLE_T *samples = (SAMPLE_T *) (fr->buffer.data + fr->buffer.fill); 00035 00036 real *b0, **buf; /* (*buf)[0x110]; */ 00037 int clip = 0; 00038 int bo1; 00039 00040 if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer); 00041 00042 if(!channel) 00043 { 00044 fr->bo--; 00045 fr->bo &= 0xf; 00046 buf = fr->real_buffs[0]; 00047 } 00048 else 00049 { 00050 #ifdef USE_DITHER 00051 /* We always go forward 32 dither points (and back again for the second channel), 00052 (re)sampling the noise the same way as the original signal. */ 00053 fr->ditherindex -= 32; 00054 #endif 00055 samples++; 00056 buf = fr->real_buffs[1]; 00057 } 00058 #ifdef USE_DITHER 00059 /* We check only once for the overflow of dither index here ... 00060 this wraps differently than the original i586 dither code, in theory (but when DITHERSIZE % BLOCK/2 == 0 it's the same). */ 00061 if(DITHERSIZE-fr->ditherindex < 32) fr->ditherindex = 0; 00062 /* And we define a macro for the dither action... */ 00063 #define ADD_DITHER(fr,sum) sum+=fr->dithernoise[fr->ditherindex]; fr->ditherindex += 64/BLOCK; 00064 #else 00065 #define ADD_DITHER(fr,sum) 00066 #endif 00067 00068 if(fr->bo & 0x1) 00069 { 00070 b0 = buf[0]; 00071 bo1 = fr->bo; 00072 MY_DCT64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr); 00073 } 00074 else 00075 { 00076 b0 = buf[1]; 00077 bo1 = fr->bo+1; 00078 MY_DCT64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr); 00079 } 00080 00081 { 00082 register int j; 00083 real *window = fr->decwin + 16 - bo1; 00084 00085 for(j=(BLOCK/4); j; j--, b0+=0x400/BLOCK-BACKPEDAL, window+=0x800/BLOCK-BACKPEDAL, samples+=step) 00086 { 00087 real sum; 00088 #ifndef NO_AUTOINCREMENT 00089 sum = REAL_MUL_SYNTH(*window++, *b0++); 00090 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00091 sum += REAL_MUL_SYNTH(*window++, *b0++); 00092 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00093 sum += REAL_MUL_SYNTH(*window++, *b0++); 00094 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00095 sum += REAL_MUL_SYNTH(*window++, *b0++); 00096 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00097 sum += REAL_MUL_SYNTH(*window++, *b0++); 00098 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00099 sum += REAL_MUL_SYNTH(*window++, *b0++); 00100 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00101 sum += REAL_MUL_SYNTH(*window++, *b0++); 00102 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00103 sum += REAL_MUL_SYNTH(*window++, *b0++); 00104 sum -= REAL_MUL_SYNTH(*window++, *b0++); 00105 #else 00106 sum = REAL_MUL_SYNTH(window[0x0], b0[0x0]); 00107 sum -= REAL_MUL_SYNTH(window[0x1], b0[0x1]); 00108 sum += REAL_MUL_SYNTH(window[0x2], b0[0x2]); 00109 sum -= REAL_MUL_SYNTH(window[0x3], b0[0x3]); 00110 sum += REAL_MUL_SYNTH(window[0x4], b0[0x4]); 00111 sum -= REAL_MUL_SYNTH(window[0x5], b0[0x5]); 00112 sum += REAL_MUL_SYNTH(window[0x6], b0[0x6]); 00113 sum -= REAL_MUL_SYNTH(window[0x7], b0[0x7]); 00114 sum += REAL_MUL_SYNTH(window[0x8], b0[0x8]); 00115 sum -= REAL_MUL_SYNTH(window[0x9], b0[0x9]); 00116 sum += REAL_MUL_SYNTH(window[0xA], b0[0xA]); 00117 sum -= REAL_MUL_SYNTH(window[0xB], b0[0xB]); 00118 sum += REAL_MUL_SYNTH(window[0xC], b0[0xC]); 00119 sum -= REAL_MUL_SYNTH(window[0xD], b0[0xD]); 00120 sum += REAL_MUL_SYNTH(window[0xE], b0[0xE]); 00121 sum -= REAL_MUL_SYNTH(window[0xF], b0[0xF]); 00122 #endif 00123 00124 ADD_DITHER(fr,sum) 00125 WRITE_SAMPLE(samples,sum,clip); 00126 } 00127 00128 { 00129 real sum; 00130 sum = REAL_MUL_SYNTH(window[0x0], b0[0x0]); 00131 sum += REAL_MUL_SYNTH(window[0x2], b0[0x2]); 00132 sum += REAL_MUL_SYNTH(window[0x4], b0[0x4]); 00133 sum += REAL_MUL_SYNTH(window[0x6], b0[0x6]); 00134 sum += REAL_MUL_SYNTH(window[0x8], b0[0x8]); 00135 sum += REAL_MUL_SYNTH(window[0xA], b0[0xA]); 00136 sum += REAL_MUL_SYNTH(window[0xC], b0[0xC]); 00137 sum += REAL_MUL_SYNTH(window[0xE], b0[0xE]); 00138 00139 ADD_DITHER(fr,sum) 00140 WRITE_SAMPLE(samples,sum,clip); 00141 samples += step; 00142 b0-=0x400/BLOCK; 00143 window-=0x800/BLOCK; 00144 } 00145 window += bo1<<1; 00146 00147 for(j=(BLOCK/4)-1; j; j--, b0-=0x400/BLOCK+BACKPEDAL, window-=0x800/BLOCK-BACKPEDAL, samples+=step) 00148 { 00149 real sum; 00150 #ifndef NO_AUTOINCREMENT 00151 sum = -REAL_MUL_SYNTH(*(--window), *b0++); 00152 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00153 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00154 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00155 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00156 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00157 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00158 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00159 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00160 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00161 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00162 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00163 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00164 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00165 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00166 sum -= REAL_MUL_SYNTH(*(--window), *b0++); 00167 #else 00168 sum = -REAL_MUL_SYNTH(window[-0x1], b0[0x0]); 00169 sum -= REAL_MUL_SYNTH(window[-0x2], b0[0x1]); 00170 sum -= REAL_MUL_SYNTH(window[-0x3], b0[0x2]); 00171 sum -= REAL_MUL_SYNTH(window[-0x4], b0[0x3]); 00172 sum -= REAL_MUL_SYNTH(window[-0x5], b0[0x4]); 00173 sum -= REAL_MUL_SYNTH(window[-0x6], b0[0x5]); 00174 sum -= REAL_MUL_SYNTH(window[-0x7], b0[0x6]); 00175 sum -= REAL_MUL_SYNTH(window[-0x8], b0[0x7]); 00176 sum -= REAL_MUL_SYNTH(window[-0x9], b0[0x8]); 00177 sum -= REAL_MUL_SYNTH(window[-0xA], b0[0x9]); 00178 sum -= REAL_MUL_SYNTH(window[-0xB], b0[0xA]); 00179 sum -= REAL_MUL_SYNTH(window[-0xC], b0[0xB]); 00180 sum -= REAL_MUL_SYNTH(window[-0xD], b0[0xC]); 00181 sum -= REAL_MUL_SYNTH(window[-0xE], b0[0xD]); 00182 sum -= REAL_MUL_SYNTH(window[-0xF], b0[0xE]); 00183 sum -= REAL_MUL_SYNTH(window[-0x0], b0[0xF]); /* Is that right? 0x0? Just wondering... */ 00184 #endif 00185 ADD_DITHER(fr,sum) 00186 WRITE_SAMPLE(samples,sum,clip); 00187 } 00188 } 00189 00190 if(final) fr->buffer.fill += BLOCK*sizeof(SAMPLE_T); 00191 00192 return clip; 00193 #undef ADD_DITHER 00194 #undef BACKPEDAL 00195 #undef MY_DCT64 00196 } Generated on Sun May 27 2012 04:33:12 for ReactOS by
1.7.6.1
|