/[svn]/linuxsampler/trunk/src/engines/common/Resampler.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/Resampler.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1424 by schoenebeck, Sun Oct 14 22:00:17 2007 UTC revision 1484 by senoner, Thu Nov 15 13:24:41 2007 UTC
# Line 30  Line 30 
30  #include "../../common/global_private.h"  #include "../../common/global_private.h"
31    
32  // TODO: cubic interpolation is not yet supported by the MMX/SSE(1) version though  // TODO: cubic interpolation is not yet supported by the MMX/SSE(1) version though
 // TODO: cubic interpolation is not supported for 24 bit samples  
33  #ifndef USE_LINEAR_INTERPOLATION  #ifndef USE_LINEAR_INTERPOLATION
34  # define USE_LINEAR_INTERPOLATION   1  ///< set to 0 if you prefer cubic interpolation (slower, better quality)  # define USE_LINEAR_INTERPOLATION   1  ///< set to 0 if you prefer cubic interpolation (slower, better quality)
35  #endif  #endif
# Line 150  namespace LinuxSampler { Line 149  namespace LinuxSampler {
149    
150          protected:          protected:
151    
152              static int getSample(sample_t* src, int pos) {              inline static int getSample(sample_t* src, int pos) {
153                  if (BITDEPTH24) {                  if (BITDEPTH24) {
154                      pos *= 3;                      pos *= 3;
155                        #if WORDS_BIGENDIAN
156                      unsigned char* p = (unsigned char*)src;                      unsigned char* p = (unsigned char*)src;
157                      return p[pos] << 8 | p[pos + 1] << 16 | p[pos + 2] << 24;                      return p[pos] << 8 | p[pos + 1] << 16 | p[pos + 2] << 24;
158                        #else
159                        // 24bit read optimization:
160                        // a misaligned 32bit read and subquent 8 bit shift is faster (on x86) than reading 3 single bytes and shifting them
161                        return (*((int *)(&((char *)(src))[pos])))<<8;
162                        #endif
163                  } else {                  } else {
164                      return src[pos];                      return src[pos];
165                  }                  }
# Line 169  namespace LinuxSampler { Line 174  namespace LinuxSampler {
174                      int x2 = getSample(pSrc, pos_int + 1);                      int x2 = getSample(pSrc, pos_int + 1);
175                      float samplePoint  = (x1 + pos_fract * (x2 - x1));                      float samplePoint  = (x1 + pos_fract * (x2 - x1));
176                  #else // polynomial interpolation                  #else // polynomial interpolation
177                      float xm1 = pSrc[pos_int];                      float xm1 = getSample(pSrc, pos_int);
178                      float x0  = pSrc[pos_int+1];                      float x0  = getSample(pSrc, pos_int + 1);
179                      float x1  = pSrc[pos_int+2];                      float x1  = getSample(pSrc, pos_int + 2);
180                      float x2  = pSrc[pos_int+3];                      float x2  = getSample(pSrc, pos_int + 3);
181                      float a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;                      float a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;
182                      float b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;                      float b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;
183                      float c   = (x1 - xm1) * 0.5f;                      float c   = (x1 - xm1) * 0.5f;
# Line 201  namespace LinuxSampler { Line 206  namespace LinuxSampler {
206                      samplePoint.right = (x1 + pos_fract * (x2 - x1));                      samplePoint.right = (x1 + pos_fract * (x2 - x1));
207                  #else // polynomial interpolation                  #else // polynomial interpolation
208                      // calculate left channel                      // calculate left channel
209                      float xm1 = pSrc[pos_int];                      float xm1 = getSample(pSrc, pos_int);
210                      float x0  = pSrc[pos_int+2];                      float x0  = getSample(pSrc, pos_int + 2);
211                      float x1  = pSrc[pos_int+4];                      float x1  = getSample(pSrc, pos_int + 4);
212                      float x2  = pSrc[pos_int+6];                      float x2  = getSample(pSrc, pos_int + 6);
213                      float a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;                      float a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;
214                      float b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;                      float b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;
215                      float c   = (x1 - xm1) * 0.5f;                      float c   = (x1 - xm1) * 0.5f;
216                      samplePoint.left = (((a * pos_fract) + b) * pos_fract + c) * pos_fract + x0;                      samplePoint.left = (((a * pos_fract) + b) * pos_fract + c) * pos_fract + x0;
217    
218                      //calculate right channel                      //calculate right channel
219                      xm1 = pSrc[pos_int+1];                      xm1 = getSample(pSrc, pos_int + 1);
220                      x0  = pSrc[pos_int+3];                      x0  = getSample(pSrc, pos_int + 3);
221                      x1  = pSrc[pos_int+5];                      x1  = getSample(pSrc, pos_int + 5);
222                      x2  = pSrc[pos_int+7];                      x2  = getSample(pSrc, pos_int + 7);
223                      a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;                      a   = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f;
224                      b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;                      b   = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f;
225                      c   = (x1 - xm1) * 0.5f;                      c   = (x1 - xm1) * 0.5f;

Legend:
Removed from v.1424  
changed lines
  Added in v.1484

  ViewVC Help
Powered by ViewVC