resample.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:16k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     TiMidity -- Experimental MIDI to WAVE converter
  3.     Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15.     resample.c
  16. */
  17. #include <math.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include "config.h"
  21. #include "common.h"
  22. #include "instrum.h"
  23. #include "playmidi.h"
  24. #include "output.h"
  25. #include "ctrlmode.h"
  26. #include "tables.h"
  27. #include "resample.h"
  28. #ifdef LINEAR_INTERPOLATION
  29. # if defined(LOOKUP_HACK) && defined(LOOKUP_INTERPOLATION)
  30. #   define RESAMPLATION 
  31.        v1=src[ofs>>FRACTION_BITS];
  32.        v2=src[(ofs>>FRACTION_BITS)+1];
  33.        *dest++ = (resample_t)(v1 + (iplookup[(((v2-v1)<<5) & 0x03FE0) | 
  34.            ((ofs & FRACTION_MASK) >> (FRACTION_BITS-5))]));
  35. # else
  36. #   define RESAMPLATION 
  37.       v1=src[ofs>>FRACTION_BITS];
  38.       v2=src[(ofs>>FRACTION_BITS)+1];
  39.       *dest++ = (resample_t)(v1 + (((v2-v1) * (ofs & FRACTION_MASK)) >> FRACTION_BITS));
  40. # endif
  41. #  define INTERPVARS sample_t v1, v2
  42. #else
  43. /* Earplugs recommended for maximum listening enjoyment */
  44. #  define RESAMPLATION *dest++ = src[ofs>>FRACTION_BITS];
  45. #  define INTERPVARS
  46. #endif
  47. #define FINALINTERP if (ofs == le) *dest++=src[ofs>>FRACTION_BITS];
  48. /* So it isn't interpolation. At least it's final. */
  49. extern resample_t *resample_buffer;
  50. /*************** resampling with fixed increment *****************/
  51. static resample_t *rs_plain(int v, int32 *countptr)
  52. {
  53.   /* Play sample until end, then free the voice. */
  54.   INTERPVARS;
  55.   Voice 
  56.     *vp=&voice[v];
  57.   resample_t 
  58.     *dest=resample_buffer;
  59.   sample_t 
  60.     *src=vp->sample->data;
  61.   int32 
  62.     ofs=vp->sample_offset,
  63.     incr=vp->sample_increment,
  64.     le=vp->sample->data_length,
  65.     count=*countptr;
  66. #ifdef PRECALC_LOOPS
  67.   int32 i, j;
  68.   if (incr<0) incr = -incr; /* In case we're coming out of a bidir loop */
  69.   /* Precalc how many times we should go through the loop.
  70.      NOTE: Assumes that incr > 0 and that ofs <= le */
  71.   i = (le - ofs) / incr + 1;
  72.   if (i > count)
  73.     {
  74.       i = count;
  75.       count = 0;
  76.     } 
  77.   else count -= i;
  78.   for(j = 0; j < i; j++)
  79.     {
  80.       RESAMPLATION;
  81.       ofs += incr;
  82.     }
  83.   if (ofs >= le) 
  84.     {
  85.       FINALINTERP;
  86.       vp->status=VOICE_FREE;
  87.       ctl->note(v);
  88.       *countptr-=count+1;
  89.     }
  90. #else /* PRECALC_LOOPS */
  91.     while (count--)
  92.     {
  93.       RESAMPLATION;
  94.       ofs += incr;
  95.       if (ofs >= le)
  96. {
  97.   FINALINTERP;
  98.   vp->status=VOICE_FREE;
  99.     ctl->note(v);
  100.   *countptr-=count+1;
  101.   break;
  102. }
  103.     }
  104. #endif /* PRECALC_LOOPS */
  105.   
  106.   vp->sample_offset=ofs; /* Update offset */
  107.   return resample_buffer;
  108. }
  109. static resample_t *rs_loop(Voice *vp, int32 count)
  110. {
  111.   /* Play sample until end-of-loop, skip back and continue. */
  112.   INTERPVARS;
  113.   int32 
  114.     ofs=vp->sample_offset, 
  115.     incr=vp->sample_increment,
  116.     le=vp->sample->loop_end, 
  117.     ll=le - vp->sample->loop_start;
  118.   resample_t
  119.     *dest=resample_buffer;
  120.   sample_t
  121.     *src=vp->sample->data;
  122. #ifdef PRECALC_LOOPS
  123.   int32 i;
  124.  
  125.   if (ofs < 0 || le < 0) return resample_buffer;
  126.   while (count) 
  127.     {
  128.       if (ofs >= le)
  129. /* NOTE: Assumes that ll > incr and that incr > 0. */
  130. ofs -= ll;
  131.       /* Precalc how many times we should go through the loop */
  132.       i = (le - ofs) / incr + 1;
  133.       if (i > count) 
  134. {
  135.   i = count;
  136.   count = 0;
  137.       else count -= i;
  138.       if (i > 0)
  139.       while (i--) 
  140. {
  141.   RESAMPLATION;
  142.   ofs += incr;
  143. }
  144.     }
  145. #else
  146.   while (count--)
  147.     {
  148.       RESAMPLATION;
  149.       ofs += incr;
  150.       if (ofs>=le)
  151. ofs -= ll; /* Hopefully the loop is longer than an increment. */
  152.     }
  153. #endif
  154.   vp->sample_offset=ofs; /* Update offset */
  155.   return resample_buffer;
  156. }
  157. static resample_t *rs_bidir(Voice *vp, int32 count)
  158. {
  159.   INTERPVARS;
  160.   int32 
  161.     ofs=vp->sample_offset,
  162.     incr=vp->sample_increment,
  163.     le=vp->sample->loop_end,
  164.     ls=vp->sample->loop_start;
  165.   resample_t 
  166.     *dest=resample_buffer; 
  167.   sample_t 
  168.     *src=vp->sample->data;
  169. #ifdef PRECALC_LOOPS
  170.   int32
  171.     le2 = le<<1, 
  172.     ls2 = ls<<1,
  173.     i;
  174.   /* Play normally until inside the loop region */
  175.   if (ofs <= ls) 
  176.     {
  177.       /* NOTE: Assumes that incr > 0, which is NOT always the case
  178.  when doing bidirectional looping.  I have yet to see a case
  179.  where both ofs <= ls AND incr < 0, however. */
  180.       i = (ls - ofs) / incr + 1;
  181.       if (i > count) 
  182. {
  183.   i = count;
  184.   count = 0;
  185.       else count -= i;
  186.       while (i--) 
  187. {
  188.   RESAMPLATION;
  189.   ofs += incr;
  190. }
  191.     }
  192.   /* Then do the bidirectional looping */
  193.   
  194.   while(count) 
  195.     {
  196.       /* Precalc how many times we should go through the loop */
  197.       i = ((incr > 0 ? le : ls) - ofs) / incr + 1;
  198.       if (i > count) 
  199. {
  200.   i = count;
  201.   count = 0;
  202.       else count -= i;
  203.       while (i--) 
  204. {
  205.   RESAMPLATION;
  206.   ofs += incr;
  207. }
  208.       if (ofs>=le) 
  209. {
  210.   /* fold the overshoot back in */
  211.   ofs = le2 - ofs;
  212.   incr *= -1;
  213.       else if (ofs <= ls) 
  214. {
  215.   ofs = ls2 - ofs;
  216.   incr *= -1;
  217. }
  218.     }
  219. #else /* PRECALC_LOOPS */
  220.   /* Play normally until inside the loop region */
  221.   if (ofs < ls)
  222.     {
  223.       while (count--)
  224. {
  225.   RESAMPLATION;
  226.   ofs += incr;
  227.   if (ofs>=ls)
  228.     break;
  229. }
  230.     }
  231.   /* Then do the bidirectional looping */
  232.   if (count>0)
  233.     while (count--)
  234.       {
  235. RESAMPLATION;
  236. ofs += incr;
  237. if (ofs>=le)
  238.   {
  239.     /* fold the overshoot back in */
  240.     ofs = le - (ofs - le);
  241.     incr = -incr;
  242.   }
  243. else if (ofs <= ls)
  244.   {
  245.     ofs = ls + (ls - ofs);
  246.     incr = -incr;
  247.   }
  248.       }  
  249. #endif /* PRECALC_LOOPS */
  250.   vp->sample_increment=incr;
  251.   vp->sample_offset=ofs; /* Update offset */
  252.   return resample_buffer;
  253. }
  254. /*********************** vibrato versions ***************************/
  255. /* We only need to compute one half of the vibrato sine cycle */
  256. static int vib_phase_to_inc_ptr(int phase)
  257. {
  258.   if (phase < VIBRATO_SAMPLE_INCREMENTS/2)
  259.     return VIBRATO_SAMPLE_INCREMENTS/2-1-phase;
  260.   else if (phase >= 3*VIBRATO_SAMPLE_INCREMENTS/2)
  261.     return 5*VIBRATO_SAMPLE_INCREMENTS/2-1-phase;
  262.   else
  263.     return phase-VIBRATO_SAMPLE_INCREMENTS/2;
  264. }
  265. static int32 update_vibrato(Voice *vp, int sign)
  266. {
  267.   int32 depth;
  268.   int phase, pb;
  269.   double a;
  270.   if (vp->vibrato_phase++ >= 2*VIBRATO_SAMPLE_INCREMENTS-1)
  271.     vp->vibrato_phase=0;
  272.   phase=vib_phase_to_inc_ptr(vp->vibrato_phase);
  273.   
  274.   if (vp->vibrato_sample_increment[phase])
  275.     {
  276.       if (sign)
  277. return -vp->vibrato_sample_increment[phase];
  278.       else
  279. return vp->vibrato_sample_increment[phase];
  280.     }
  281.   /* Need to compute this sample increment. */
  282.     
  283.   depth=vp->sample->vibrato_depth<<7;
  284.   if (vp->vibrato_sweep)
  285.     {
  286.       /* Need to update sweep */
  287.       vp->vibrato_sweep_position += vp->vibrato_sweep;
  288.       if (vp->vibrato_sweep_position >= (1<<SWEEP_SHIFT))
  289. vp->vibrato_sweep=0;
  290.       else
  291. {
  292.   /* Adjust depth */
  293.   depth *= vp->vibrato_sweep_position;
  294.   depth >>= SWEEP_SHIFT;
  295. }
  296.     }
  297.   a = FSCALE(((double)(vp->sample->sample_rate) *
  298.       (double)(vp->frequency)) /
  299.      ((double)(vp->sample->root_freq) *
  300.       (double)(play_mode->rate)),
  301.      FRACTION_BITS);
  302.   pb=(int)((sine(vp->vibrato_phase * 
  303.  (SINE_CYCLE_LENGTH/(2*VIBRATO_SAMPLE_INCREMENTS)))
  304.     * (double)(depth) * VIBRATO_AMPLITUDE_TUNING));
  305.   if (pb<0)
  306.     {
  307.       pb=-pb;
  308.       a /= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13];
  309.     }
  310.   else
  311.     a *= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13];
  312.   
  313.   /* If the sweep's over, we can store the newly computed sample_increment */
  314.   if (!vp->vibrato_sweep)
  315.     vp->vibrato_sample_increment[phase]=(int32) a;
  316.   if (sign)
  317.     a = -a; /* need to preserve the loop direction */
  318.   return (int32) a;
  319. }
  320. static resample_t *rs_vib_plain(int v, int32 *countptr)
  321. {
  322.   /* Play sample until end, then free the voice. */
  323.   INTERPVARS;
  324.   Voice *vp=&voice[v];
  325.   resample_t 
  326.     *dest=resample_buffer; 
  327.   sample_t 
  328.     *src=vp->sample->data;
  329.   int32 
  330.     le=vp->sample->data_length,
  331.     ofs=vp->sample_offset, 
  332.     incr=vp->sample_increment, 
  333.     count=*countptr;
  334.   int 
  335.     cc=vp->vibrato_control_counter;
  336.   /* This has never been tested */
  337.   if (incr<0) incr = -incr; /* In case we're coming out of a bidir loop */
  338.   while (count--)
  339.     {
  340.       if (!cc--)
  341. {
  342.   cc=vp->vibrato_control_ratio;
  343.   incr=update_vibrato(vp, 0);
  344. }
  345.       RESAMPLATION;
  346.       ofs += incr;
  347.       if (ofs >= le)
  348. {
  349.   FINALINTERP;
  350.   vp->status=VOICE_FREE;
  351.     ctl->note(v);
  352.   *countptr-=count+1;
  353.   break;
  354. }
  355.     }
  356.   
  357.   vp->vibrato_control_counter=cc;
  358.   vp->sample_increment=incr;
  359.   vp->sample_offset=ofs; /* Update offset */
  360.   return resample_buffer;
  361. }
  362. static resample_t *rs_vib_loop(Voice *vp, int32 count)
  363. {
  364.   /* Play sample until end-of-loop, skip back and continue. */
  365.   
  366.   INTERPVARS;
  367.   int32 
  368.     ofs=vp->sample_offset, 
  369.     incr=vp->sample_increment, 
  370.     le=vp->sample->loop_end,
  371.     ll=le - vp->sample->loop_start;
  372.   resample_t 
  373.     *dest=resample_buffer; 
  374.   sample_t 
  375.     *src=vp->sample->data;
  376.   int 
  377.     cc=vp->vibrato_control_counter;
  378. #ifdef PRECALC_LOOPS
  379.   int32 i;
  380.   int
  381.     vibflag=0;
  382.   while (count) 
  383.     {
  384.       /* Hopefully the loop is longer than an increment */
  385.       if(ofs >= le)
  386. ofs -= ll;
  387.       /* Precalc how many times to go through the loop, taking
  388.  the vibrato control ratio into account this time. */
  389.       i = (le - ofs) / incr + 1;
  390.       if(i > count) i = count;
  391.       if(i > cc)
  392. {
  393.   i = cc;
  394.   vibflag = 1;
  395.       else cc -= i;
  396.       count -= i;
  397.       while(i--) 
  398. {
  399.   RESAMPLATION;
  400.   ofs += incr;
  401. }
  402.       if(vibflag) 
  403. {
  404.   cc = vp->vibrato_control_ratio;
  405.   incr = update_vibrato(vp, 0);
  406.   vibflag = 0;
  407. }
  408.     }
  409. #else /* PRECALC_LOOPS */
  410.   while (count--)
  411.     {
  412.       if (!cc--)
  413. {
  414.   cc=vp->vibrato_control_ratio;
  415.   incr=update_vibrato(vp, 0);
  416. }
  417.       RESAMPLATION;
  418.       ofs += incr;
  419.       if (ofs>=le)
  420. ofs -= ll; /* Hopefully the loop is longer than an increment. */
  421.     }
  422. #endif /* PRECALC_LOOPS */
  423.   vp->vibrato_control_counter=cc;
  424.   vp->sample_increment=incr;
  425.   vp->sample_offset=ofs; /* Update offset */
  426.   return resample_buffer;
  427. }
  428. static resample_t *rs_vib_bidir(Voice *vp, int32 count)
  429. {
  430.   INTERPVARS;
  431.   int32 
  432.     ofs=vp->sample_offset, 
  433.     incr=vp->sample_increment,
  434.     le=vp->sample->loop_end, 
  435.     ls=vp->sample->loop_start;
  436.   resample_t 
  437.     *dest=resample_buffer; 
  438.   sample_t 
  439.     *src=vp->sample->data;
  440.   int 
  441.     cc=vp->vibrato_control_counter;
  442. #ifdef PRECALC_LOOPS
  443.   int32
  444.     le2=le<<1,
  445.     ls2=ls<<1,
  446.     i;
  447.   int
  448.     vibflag = 0;
  449.   /* Play normally until inside the loop region */
  450.   while (count && (ofs <= ls)) 
  451.     {
  452.       i = (ls - ofs) / incr + 1;
  453.       if (i > count) i = count;
  454.       if (i > cc) 
  455. {
  456.   i = cc;
  457.   vibflag = 1;
  458.       else cc -= i;
  459.       count -= i;
  460.       while (i--) 
  461. {
  462.   RESAMPLATION;
  463.   ofs += incr;
  464. }
  465.       if (vibflag) 
  466. {
  467.   cc = vp->vibrato_control_ratio;
  468.   incr = update_vibrato(vp, 0);
  469.   vibflag = 0;
  470. }
  471.     }
  472.   
  473.   /* Then do the bidirectional looping */
  474.   while (count) 
  475.     {
  476.       /* Precalc how many times we should go through the loop */
  477.       i = ((incr > 0 ? le : ls) - ofs) / incr + 1;
  478.       if(i > count) i = count;
  479.       if(i > cc) 
  480. {
  481.   i = cc;
  482.   vibflag = 1;
  483.       else cc -= i;
  484.       count -= i;
  485.       while (i--) 
  486. {
  487.   RESAMPLATION;
  488.   ofs += incr;
  489. }
  490.       if (vibflag) 
  491. {
  492.   cc = vp->vibrato_control_ratio;
  493.   incr = update_vibrato(vp, (incr < 0));
  494.   vibflag = 0;
  495. }
  496.       if (ofs >= le) 
  497. {
  498.   /* fold the overshoot back in */
  499.   ofs = le2 - ofs;
  500.   incr *= -1;
  501.       else if (ofs <= ls) 
  502. {
  503.   ofs = ls2 - ofs;
  504.   incr *= -1;
  505. }
  506.     }
  507. #else /* PRECALC_LOOPS */
  508.   /* Play normally until inside the loop region */
  509.   if (ofs < ls)
  510.     {
  511.       while (count--)
  512. {
  513.   if (!cc--)
  514.     {
  515.       cc=vp->vibrato_control_ratio;
  516.       incr=update_vibrato(vp, 0);
  517.     }
  518.   RESAMPLATION;
  519.   ofs += incr;
  520.   if (ofs>=ls)
  521.     break;
  522. }
  523.     }
  524.   /* Then do the bidirectional looping */
  525.   if (count>0)
  526.     while (count--)
  527.       {
  528. if (!cc--)
  529.   {
  530.     cc=vp->vibrato_control_ratio;
  531.     incr=update_vibrato(vp, (incr < 0));
  532.   }
  533. RESAMPLATION;
  534. ofs += incr;
  535. if (ofs>=le)
  536.   {
  537.     /* fold the overshoot back in */
  538.     ofs = le - (ofs - le);
  539.     incr = -incr;
  540.   }
  541. else if (ofs <= ls)
  542.   {
  543.     ofs = ls + (ls - ofs);
  544.     incr = -incr;
  545.   }
  546.       }
  547. #endif /* PRECALC_LOOPS */
  548.   vp->vibrato_control_counter=cc;
  549.   vp->sample_increment=incr;
  550.   vp->sample_offset=ofs; /* Update offset */
  551.   return resample_buffer;
  552. }
  553. resample_t *resample_voice(int v, int32 *countptr)
  554. {
  555.   int32 ofs;
  556.   uint8 modes;
  557.   Voice *vp=&voice[v];
  558.   
  559.   if (!(vp->sample->sample_rate))
  560.     {
  561.       /* Pre-resampled data -- just update the offset and check if
  562.          we're out of data. */
  563.       ofs=vp->sample_offset >> FRACTION_BITS; /* Kind of silly to use
  564.  FRACTION_BITS here... */
  565.       if (*countptr >= (vp->sample->data_length>>FRACTION_BITS) - ofs)
  566. {
  567.   /* Note finished. Free the voice. */
  568.   vp->status = VOICE_FREE;
  569.   ctl->note(v);
  570.   
  571.   /* Let the caller know how much data we had left */
  572.   *countptr = (vp->sample->data_length>>FRACTION_BITS) - ofs;
  573. }
  574.       else
  575. vp->sample_offset += *countptr << FRACTION_BITS;
  576.       
  577.       return (resample_t *)vp->sample->data+ofs;
  578.     }
  579.   /* Need to resample. Use the proper function. */
  580.   modes=vp->sample->modes;
  581.   if (vp->vibrato_control_ratio)
  582.     {
  583.       if ((modes & MODES_LOOPING) &&
  584.   ((modes & MODES_ENVELOPE) ||
  585.    (vp->status==VOICE_ON || vp->status==VOICE_SUSTAINED)))
  586. {
  587.   if (modes & MODES_PINGPONG)
  588.     return rs_vib_bidir(vp, *countptr);
  589.   else
  590.     return rs_vib_loop(vp, *countptr);
  591. }
  592.       else
  593. return rs_vib_plain(v, countptr);
  594.     }
  595.   else
  596.     {
  597.       if ((modes & MODES_LOOPING) &&
  598.   ((modes & MODES_ENVELOPE) ||
  599.    (vp->status==VOICE_ON || vp->status==VOICE_SUSTAINED)))
  600. {
  601.   if (modes & MODES_PINGPONG)
  602.     return rs_bidir(vp, *countptr);
  603.   else
  604.     return rs_loop(vp, *countptr);
  605. }
  606.       else
  607. return rs_plain(v, countptr);
  608.     }
  609. }
  610. void pre_resample(Sample * sp)
  611. {
  612.   double a, xdiff;
  613.   int32 incr, ofs, newlen, count;
  614.   int16 *src = (int16 *) sp->data;
  615.   resample_t *newdata, *dest;
  616.   int16 v1, v2, v3, v4, *vptr;
  617.   static const char note_name[12][3] =
  618.   {
  619.     "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
  620.   };
  621.   ctl->cmsg(CMSG_INFO, VERB_NOISY, " * pre-resampling for note %d (%s%d)",
  622.     sp->note_to_use,
  623.     note_name[sp->note_to_use % 12], (sp->note_to_use & 0x7F) / 12);
  624.   a = ((double) (sp->sample_rate) * freq_table[(int) (sp->note_to_use)]) /
  625.     ((double) (sp->root_freq) * play_mode->rate);
  626.   if (a <= 0) return;
  627.   newlen = (int32)(sp->data_length / a);
  628.   if (newlen < 0 || (newlen >> FRACTION_BITS) > MAX_SAMPLE_SIZE) return;
  629.   dest = newdata = safe_malloc(newlen >> (FRACTION_BITS - 1));
  630.   count = (newlen >> FRACTION_BITS) - 1;
  631.   ofs = incr = (sp->data_length - (1 << FRACTION_BITS)) / count;
  632.   if (--count)
  633.     *dest++ = src[0];
  634.   /* Since we're pre-processing and this doesn't have to be done in
  635.      real-time, we go ahead and do the full sliding cubic interpolation. */
  636.   while (--count)
  637.     {
  638.       vptr = src + (ofs >> FRACTION_BITS);
  639.       v1 = (vptr == src) ? *vptr : *(vptr - 1);
  640.       v2 = *vptr;
  641.       v3 = *(vptr + 1);
  642.       v4 = *(vptr + 2);
  643.       xdiff = FSCALENEG(ofs & FRACTION_MASK, FRACTION_BITS);
  644.       *dest++ = (int16)(v2 + (xdiff / 6.0) * (-2 * v1 - 3 * v2 + 6 * v3 - v4 +
  645.       xdiff * (3 * (v1 - 2 * v2 + v3) + xdiff * (-v1 + 3 * (v2 - v3) + v4))));
  646.       ofs += incr;
  647.     }
  648.   if (ofs & FRACTION_MASK)
  649.     {
  650.       v1 = src[ofs >> FRACTION_BITS];
  651.       v2 = src[(ofs >> FRACTION_BITS) + 1];
  652.       *dest++ = (resample_t)(v1 + (((v2 - v1) * (ofs & FRACTION_MASK)) >> FRACTION_BITS));
  653.     }
  654.   else
  655.     *dest++ = src[ofs >> FRACTION_BITS];
  656.   sp->data_length = newlen;
  657.   sp->loop_start = (int32)(sp->loop_start / a);
  658.   sp->loop_end = (int32)(sp->loop_end / a);
  659.   free(sp->data);
  660.   sp->data = (sample_t *) newdata;
  661.   sp->sample_rate = 0;
  662. }