ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

synth.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.