/[svn]/linuxsampler/trunk/src/engines/gig/Synthesizer.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/Synthesizer.h

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

revision 770 by schoenebeck, Sun Sep 11 15:56:29 2005 UTC revision 830 by persson, Sun Jan 15 18:23:11 2006 UTC
# Line 135  namespace LinuxSampler { namespace gig { Line 135  namespace LinuxSampler { namespace gig {
135              }              }
136    
137              static void SynthesizeSubSubFragment(SynthesisParam* pFinalParam, uint uiToGo) {              static void SynthesizeSubSubFragment(SynthesisParam* pFinalParam, uint uiToGo) {
138                    float fVolumeL = pFinalParam->fFinalVolumeLeft;
139                    float fVolumeR = pFinalParam->fFinalVolumeRight;
140                    sample_t* pSrc = pFinalParam->pSrc;
141                    float* pOutL   = pFinalParam->pOutLeft;
142                    float* pOutR   = pFinalParam->pOutRight;
143    #ifdef CONFIG_INTERPOLATE_VOLUME
144                    float fDeltaL  = pFinalParam->fFinalVolumeDeltaLeft;
145                    float fDeltaR  = pFinalParam->fFinalVolumeDeltaRight;
146    #endif
147                  switch (CHANNELS) {                  switch (CHANNELS) {
148                      case MONO: {                      case MONO: {
149                            float samplePoint;
150                          if (INTERPOLATE) {                          if (INTERPOLATE) {
151                                double dPos    = pFinalParam->dPos;
152                                float fPitch   = pFinalParam->fFinalPitch;
153                              if (USEFILTER) {                              if (USEFILTER) {
154                                  Filter filterL = pFinalParam->filterLeft;                                  Filter filterL = pFinalParam->filterLeft;
                                 sample_t* pSrc = pFinalParam->pSrc;  
                                 double dPos    = pFinalParam->dPos;  
                                 float fPitch   = pFinalParam->fFinalPitch;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 float samplePoint;  
155                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
156                                      samplePoint = Interpolate1StepMonoCPP(pSrc, &dPos, fPitch);                                      samplePoint = Interpolate1StepMonoCPP(pSrc, &dPos, fPitch);
157                                      samplePoint = filterL.Apply(samplePoint);                                      samplePoint = filterL.Apply(samplePoint);
158    #ifdef CONFIG_INTERPOLATE_VOLUME
159                                        fVolumeL += fDeltaL;
160                                        fVolumeR += fDeltaR;
161    #endif
162                                      pOutL[i] += samplePoint * fVolumeL;                                      pOutL[i] += samplePoint * fVolumeL;
163                                      pOutR[i] += samplePoint * fVolumeR;                                      pOutR[i] += samplePoint * fVolumeR;
164                                  }                                  }
                                 pFinalParam->dPos = dPos;  
165                              } else { // no filter needed                              } else { // no filter needed
                                 sample_t* pSrc = pFinalParam->pSrc;  
                                 double dPos    = pFinalParam->dPos;  
                                 float fPitch   = pFinalParam->fFinalPitch;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 float samplePoint;  
166                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
167                                      samplePoint = Interpolate1StepMonoCPP(pSrc, &dPos, fPitch);                                      samplePoint = Interpolate1StepMonoCPP(pSrc, &dPos, fPitch);
168    #ifdef CONFIG_INTERPOLATE_VOLUME
169                                        fVolumeL += fDeltaL;
170                                        fVolumeR += fDeltaR;
171    #endif
172                                      pOutL[i] += samplePoint * fVolumeL;                                      pOutL[i] += samplePoint * fVolumeL;
173                                      pOutR[i] += samplePoint * fVolumeR;                                      pOutR[i] += samplePoint * fVolumeR;
174                                  }                                  }
                                 pFinalParam->dPos = dPos;  
175                              }                              }
176                                pFinalParam->dPos = dPos;
177                          } else { // no interpolation                          } else { // no interpolation
178                                int pos_offset = (int) pFinalParam->dPos;
179                              if (USEFILTER) {                              if (USEFILTER) {
180                                  Filter filterL = pFinalParam->filterLeft;                                  Filter filterL = pFinalParam->filterLeft;
                                 sample_t* pSrc  = pFinalParam->pSrc;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 int pos_offset = (int) pFinalParam->dPos;  
                                 float samplePoint;  
181                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
182                                      samplePoint = pSrc[i + pos_offset];                                      samplePoint = pSrc[i + pos_offset];
183                                      samplePoint = filterL.Apply(samplePoint);                                      samplePoint = filterL.Apply(samplePoint);
184    #ifdef CONFIG_INTERPOLATE_VOLUME
185                                        fVolumeL += fDeltaL;
186                                        fVolumeR += fDeltaR;
187    #endif
188                                      pOutL[i] += samplePoint * fVolumeL;                                      pOutL[i] += samplePoint * fVolumeL;
189                                      pOutR[i] += samplePoint * fVolumeR;                                      pOutR[i] += samplePoint * fVolumeR;
190                                  }                                  }
                                 pFinalParam->dPos += uiToGo;  
191                              } else { // no filter needed                              } else { // no filter needed
                                 sample_t* pSrc  = pFinalParam->pSrc;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 int pos_offset = (int) pFinalParam->dPos;  
                                 float samplePoint;  
192                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
193                                      samplePoint = pSrc[i + pos_offset];                                      samplePoint = pSrc[i + pos_offset];
194    #ifdef CONFIG_INTERPOLATE_VOLUME
195                                        fVolumeL += fDeltaL;
196                                        fVolumeR += fDeltaR;
197    #endif
198                                      pOutL[i] += samplePoint * fVolumeL;                                      pOutL[i] += samplePoint * fVolumeL;
199                                      pOutR[i] += samplePoint * fVolumeR;                                      pOutR[i] += samplePoint * fVolumeR;
200                                  }                                  }
                                 pFinalParam->dPos += uiToGo;  
201                              }                              }
202                                pFinalParam->dPos += uiToGo;
203                          }                          }
204                          break;                          break;
205                      }                      }
206                      case STEREO: {                      case STEREO: {
207                            stereo_sample_t samplePoint;
208                          if (INTERPOLATE) {                          if (INTERPOLATE) {
209                                double dPos    = pFinalParam->dPos;
210                                float fPitch   = pFinalParam->fFinalPitch;
211                              if (USEFILTER) {                              if (USEFILTER) {
212                                  Filter filterL = pFinalParam->filterLeft;                                  Filter filterL = pFinalParam->filterLeft;
213                                  Filter filterR = pFinalParam->filterRight;                                  Filter filterR = pFinalParam->filterRight;
                                 sample_t* pSrc = pFinalParam->pSrc;  
                                 double dPos    = pFinalParam->dPos;  
                                 float fPitch   = pFinalParam->fFinalPitch;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 stereo_sample_t samplePoint;  
214                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
215                                      samplePoint = Interpolate1StepStereoCPP(pSrc, &dPos, fPitch);                                      samplePoint = Interpolate1StepStereoCPP(pSrc, &dPos, fPitch);
216                                      samplePoint.left  = filterL.Apply(samplePoint.left);                                      samplePoint.left  = filterL.Apply(samplePoint.left);
217                                      samplePoint.right = filterR.Apply(samplePoint.right);                                      samplePoint.right = filterR.Apply(samplePoint.right);
218    #ifdef CONFIG_INTERPOLATE_VOLUME
219                                        fVolumeL += fDeltaL;
220                                        fVolumeR += fDeltaR;
221    #endif
222                                      pOutL[i] += samplePoint.left  * fVolumeL;                                      pOutL[i] += samplePoint.left  * fVolumeL;
223                                      pOutR[i] += samplePoint.right * fVolumeR;                                      pOutR[i] += samplePoint.right * fVolumeR;
224                                  }                                  }
                                 pFinalParam->dPos = dPos;  
225                              } else { // no filter needed                              } else { // no filter needed
                                 sample_t* pSrc = pFinalParam->pSrc;  
                                 double dPos    = pFinalParam->dPos;  
                                 float fPitch   = pFinalParam->fFinalPitch;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 stereo_sample_t samplePoint;  
226                                  for (int i = 0; i < uiToGo; ++i) {                                  for (int i = 0; i < uiToGo; ++i) {
227                                      samplePoint = Interpolate1StepStereoCPP(pSrc, &dPos, fPitch);                                      samplePoint = Interpolate1StepStereoCPP(pSrc, &dPos, fPitch);
228    #ifdef CONFIG_INTERPOLATE_VOLUME
229                                        fVolumeL += fDeltaL;
230                                        fVolumeR += fDeltaR;
231    #endif
232                                      pOutL[i] += samplePoint.left  * fVolumeL;                                      pOutL[i] += samplePoint.left  * fVolumeL;
233                                      pOutR[i] += samplePoint.right * fVolumeR;                                      pOutR[i] += samplePoint.right * fVolumeR;
234                                  }                                  }
                                 pFinalParam->dPos = dPos;  
235                              }                              }
236                                pFinalParam->dPos = dPos;
237                          } else { // no interpolation                          } else { // no interpolation
238                                int pos_offset = ((int) pFinalParam->dPos) << 1;
239                              if (USEFILTER) {                              if (USEFILTER) {
240                                  Filter filterL = pFinalParam->filterLeft;                                  Filter filterL = pFinalParam->filterLeft;
241                                  Filter filterR = pFinalParam->filterRight;                                  Filter filterR = pFinalParam->filterRight;
                                 sample_t* pSrc  = pFinalParam->pSrc;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 int pos_offset = ((int) pFinalParam->dPos) << 1;  
                                 stereo_sample_t samplePoint;  
242                                  for (int i = 0, ii = 0; i < uiToGo; ++i, ii+=2) {                                  for (int i = 0, ii = 0; i < uiToGo; ++i, ii+=2) {
243                                      samplePoint.left  = pSrc[ii + pos_offset];                                      samplePoint.left  = pSrc[ii + pos_offset];
244                                      samplePoint.right = pSrc[ii + pos_offset + 1];                                      samplePoint.right = pSrc[ii + pos_offset + 1];
245                                      samplePoint.left  = filterL.Apply(samplePoint.left);                                      samplePoint.left  = filterL.Apply(samplePoint.left);
246                                      samplePoint.right = filterR.Apply(samplePoint.right);                                      samplePoint.right = filterR.Apply(samplePoint.right);
247    #ifdef CONFIG_INTERPOLATE_VOLUME
248                                        fVolumeL += fDeltaL;
249                                        fVolumeR += fDeltaR;
250    #endif
251                                      pOutL[i] += samplePoint.left  * fVolumeL;                                      pOutL[i] += samplePoint.left  * fVolumeL;
252                                      pOutR[i] += samplePoint.right * fVolumeR;                                      pOutR[i] += samplePoint.right * fVolumeR;
253                                  }                                  }
                                 pFinalParam->dPos += uiToGo;  
254                              } else { // no filter needed                              } else { // no filter needed
                                 sample_t* pSrc  = pFinalParam->pSrc;  
                                 float* pOutL   = pFinalParam->pOutLeft;  
                                 float* pOutR   = pFinalParam->pOutRight;  
                                 float fVolumeL = pFinalParam->fFinalVolumeLeft;  
                                 float fVolumeR = pFinalParam->fFinalVolumeRight;  
                                 int pos_offset = ((int) pFinalParam->dPos) << 1;  
                                 stereo_sample_t samplePoint;  
255                                  for (int i = 0, ii = 0; i < uiToGo; ++i, ii+=2) {                                  for (int i = 0, ii = 0; i < uiToGo; ++i, ii+=2) {
256                                      samplePoint.left  = pSrc[ii + pos_offset];                                      samplePoint.left  = pSrc[ii + pos_offset];
257                                      samplePoint.right = pSrc[ii + pos_offset + 1];                                      samplePoint.right = pSrc[ii + pos_offset + 1];
258    #ifdef CONFIG_INTERPOLATE_VOLUME
259                                        fVolumeL += fDeltaL;
260                                        fVolumeR += fDeltaR;
261    #endif
262                                      pOutL[i] += samplePoint.left  * fVolumeL;                                      pOutL[i] += samplePoint.left  * fVolumeL;
263                                      pOutR[i] += samplePoint.right * fVolumeR;                                      pOutR[i] += samplePoint.right * fVolumeR;
264                                  }                                  }
                                 pFinalParam->dPos += uiToGo;  
265                              }                              }
266                                pFinalParam->dPos += uiToGo;
267                          }                          }
268                          break;                          break;
269                      }                      }
270                  }                  }
271                    pFinalParam->fFinalVolumeLeft = fVolumeL;
272                    pFinalParam->fFinalVolumeRight = fVolumeR;
273                  pFinalParam->pOutRight += uiToGo;                  pFinalParam->pOutRight += uiToGo;
274                  pFinalParam->pOutLeft  += uiToGo;                  pFinalParam->pOutLeft  += uiToGo;
275                  pFinalParam->uiToGo    -= uiToGo;                  pFinalParam->uiToGo    -= uiToGo;

Legend:
Removed from v.770  
changed lines
  Added in v.830

  ViewVC Help
Powered by ViewVC