-/*
-================
-ResampleSfx
-================
-*/
-size_t ResampleSfx (const qbyte *in_data, size_t in_length, const snd_format_t* in_format, qbyte *out_data, const char* sfxname)
-{
- int samplefrac, fracstep;
- size_t i, srcsample, srclength, outcount;
-
- // this is usually 0.5 (128), 1 (256), or 2 (512)
- fracstep = ((double) in_format->speed / (double) shm->format.speed) * 256.0;
-
- srclength = in_length * in_format->channels;
-
- outcount = (double) in_length * (double) shm->format.speed / (double) in_format->speed;
- Con_DPrintf("ResampleSfx: resampling sound \"%s\" from %dHz to %dHz (%d samples to %d samples)\n",
- sfxname, in_format->speed, shm->format.speed, in_length, outcount);
-
-// resample / decimate to the current source rate
-
- if (fracstep == 256)
- {
- // fast case for direct transfer
- if (in_format->width == 1) // 8bit
- for (i = 0;i < srclength;i++)
- ((signed char *)out_data)[i] = ((unsigned char *)in_data)[i] - 128;
- else //if (sb->width == 2) // 16bit
- for (i = 0;i < srclength;i++)
- ((short *)out_data)[i] = ((short *)in_data)[i];
- }
- else
- {
- // general case
- samplefrac = 0;
- if ((fracstep & 255) == 0) // skipping points on perfect multiple
- {
- srcsample = 0;
- fracstep >>= 8;
- if (in_format->width == 2)
- {
- short *out = (short*)out_data;
- const short *in = (const short*)in_data;
- if (in_format->channels == 2) // LordHavoc: stereo sound support
- {
- fracstep <<= 1;
- for (i=0 ; i<outcount ; i++)
- {
- *out++ = in[srcsample ];
- *out++ = in[srcsample+1];
- srcsample += fracstep;
- }
- }
- else
- {
- for (i=0 ; i<outcount ; i++)
- {
- *out++ = in[srcsample];
- srcsample += fracstep;
- }
- }
- }
- else
- {
- signed char *out = out_data;
- const unsigned char *in = in_data;
- if (in_format->channels == 2)
- {
- fracstep <<= 1;
- for (i=0 ; i<outcount ; i++)
- {
- *out++ = in[srcsample ] - 128;
- *out++ = in[srcsample+1] - 128;
- srcsample += fracstep;
- }
- }
- else
- {
- for (i=0 ; i<outcount ; i++)
- {
- *out++ = in[srcsample ] - 128;
- srcsample += fracstep;
- }
- }
- }
- }
- else
- {
- int sample;
- int a, b;
- if (in_format->width == 2)
- {
- short *out = (short*)out_data;
- const short *in = (const short*)in_data;
- if (in_format->channels == 2)
- {
- for (i=0 ; i<outcount ; i++)
- {
- srcsample = (samplefrac >> 8) << 1;
- a = in[srcsample ];
- if (srcsample+2 >= srclength)
- b = 0;
- else
- b = in[srcsample+2];
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (short) sample;
- a = in[srcsample+1];
- if (srcsample+2 >= srclength)
- b = 0;
- else
- b = in[srcsample+3];
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (short) sample;
- samplefrac += fracstep;
- }
- }
- else
- {
- for (i=0 ; i<outcount ; i++)
- {
- srcsample = samplefrac >> 8;
- a = in[srcsample ];
- if (srcsample+1 >= srclength)
- b = 0;
- else
- b = in[srcsample+1];
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (short) sample;
- samplefrac += fracstep;
- }
- }
- }
- else
- {
- signed char *out = out_data;
- const unsigned char *in = in_data;
- if (in_format->channels == 2)
- {
- for (i=0 ; i<outcount ; i++)
- {
- srcsample = (samplefrac >> 8) << 1;
- a = (int) in[srcsample ] - 128;
- if (srcsample+2 >= srclength)
- b = 0;
- else
- b = (int) in[srcsample+2] - 128;
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (signed char) sample;
- a = (int) in[srcsample+1] - 128;
- if (srcsample+2 >= srclength)
- b = 0;
- else
- b = (int) in[srcsample+3] - 128;
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (signed char) sample;
- samplefrac += fracstep;
- }
- }
- else
- {
- for (i=0 ; i<outcount ; i++)
- {
- srcsample = samplefrac >> 8;
- a = (int) in[srcsample ] - 128;
- if (srcsample+1 >= srclength)
- b = 0;
- else
- b = (int) in[srcsample+1] - 128;
- sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
- *out++ = (signed char) sample;
- samplefrac += fracstep;
- }
- }
- }
- }
- }
-
- return outcount;
-}
-
-//=============================================================================
-
-wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength);
-