- if (fracstep == 256)
- {
- // fast case for direct transfer
- if (sc->width == 1) // 8bit
- for (i = 0;i < srclength;i++)
- ((signed char *)sc->data)[i] = ((unsigned char *)data)[i] - 128;
- else //if (sc->width == 2) // 16bit
- for (i = 0;i < srclength;i++)
- ((short *)sc->data)[i] = ((short *)data)[i];
- }
- else
- {
- // general case
- samplefrac = 0;
- if ((fracstep & 255) == 0) // skipping points on perfect multiple
- {
- srcsample = 0;
- fracstep >>= 8;
- if (sc->width == 2)
- {
- short *out = (void *)sc->data, *in = (void *)data;
- if (sc->stereo) // 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 = (void *)sc->data;
- unsigned char *in = (void *)data;
- if (sc->stereo) // LordHavoc: stereo sound support
- {
- 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 (sc->width == 2)
- {
- short *out = (void *)sc->data, *in = (void *)data;
- if (sc->stereo) // LordHavoc: stereo sound support
- {
- 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 = (void *)sc->data;
- unsigned char *in = (void *)data;
- if (sc->stereo) // LordHavoc: stereo sound support
- {
- 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;
- }
- }
- }
- }
- }
-
- // LordHavoc: use this for testing if it ever becomes useful again
- //COM_WriteFile (va("sound/%s.pcm", name), sc->data, (sc->length << sc->stereo) * sc->width);
-}
-
-//=============================================================================
-
-/*
-==============
-S_LoadWavFile
-==============