summaryrefslogtreecommitdiff
path: root/src/client/snd_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/snd_mem.c')
-rw-r--r--src/client/snd_mem.c82
1 files changed, 45 insertions, 37 deletions
diff --git a/src/client/snd_mem.c b/src/client/snd_mem.c
index ecca5292..299d9d34 100644
--- a/src/client/snd_mem.c
+++ b/src/client/snd_mem.c
@@ -114,47 +114,51 @@ ResampleSfx
resample / decimate to the current source rate
================
*/
-static void ResampleSfx( sfx_t *sfx, int inrate, int inwidth, byte *data, qboolean compressed ) {
+static int ResampleSfx( sfx_t *sfx, int channels, int inrate, int inwidth, int samples, byte *data, qboolean compressed ) {
int outcount;
int srcsample;
float stepscale;
- int i;
+ int i, j;
int sample, samplefrac, fracstep;
int part;
sndBuffer *chunk;
stepscale = (float)inrate / dma.speed; // this is usually 0.5, 1, or 2
- outcount = sfx->soundLength / stepscale;
- sfx->soundLength = outcount;
+ outcount = samples / stepscale;
samplefrac = 0;
- fracstep = stepscale * 256;
+ fracstep = stepscale * 256 * channels;
chunk = sfx->soundData;
for (i=0 ; i<outcount ; i++)
{
srcsample = samplefrac >> 8;
samplefrac += fracstep;
- if( inwidth == 2 ) {
- sample = ( ((short *)data)[srcsample] );
- } else {
- sample = (int)( (unsigned char)(data[srcsample]) - 128) << 8;
- }
- part = (i&(SND_CHUNK_SIZE-1));
- if (part == 0) {
- sndBuffer *newchunk;
- newchunk = SND_malloc();
- if (chunk == NULL) {
- sfx->soundData = newchunk;
+ for (j=0 ; j<channels ; j++)
+ {
+ if( inwidth == 2 ) {
+ sample = ( ((short *)data)[srcsample+j] );
} else {
- chunk->next = newchunk;
+ sample = (int)( (unsigned char)(data[srcsample+j]) - 128) << 8;
+ }
+ part = (i*channels+j)&(SND_CHUNK_SIZE-1);
+ if (part == 0) {
+ sndBuffer *newchunk;
+ newchunk = SND_malloc();
+ if (chunk == NULL) {
+ sfx->soundData = newchunk;
+ } else {
+ chunk->next = newchunk;
+ }
+ chunk = newchunk;
}
- chunk = newchunk;
- }
- chunk->sndChunk[part] = sample;
+ chunk->sndChunk[part] = sample;
+ }
}
+
+ return outcount;
}
/*
@@ -164,11 +168,11 @@ ResampleSfx
resample / decimate to the current source rate
================
*/
-static int ResampleSfxRaw( short *sfx, int inrate, int inwidth, int samples, byte *data ) {
+static int ResampleSfxRaw( short *sfx, int channels, int inrate, int inwidth, int samples, byte *data ) {
int outcount;
int srcsample;
float stepscale;
- int i;
+ int i, j;
int sample, samplefrac, fracstep;
stepscale = (float)inrate / dma.speed; // this is usually 0.5, 1, or 2
@@ -176,18 +180,21 @@ static int ResampleSfxRaw( short *sfx, int inrate, int inwidth, int samples, byt
outcount = samples / stepscale;
samplefrac = 0;
- fracstep = stepscale * 256;
+ fracstep = stepscale * 256 * channels;
for (i=0 ; i<outcount ; i++)
{
srcsample = samplefrac >> 8;
samplefrac += fracstep;
- if( inwidth == 2 ) {
- sample = LittleShort ( ((short *)data)[srcsample] );
- } else {
- sample = (int)( (unsigned char)(data[srcsample]) - 128) << 8;
+ for (j=0 ; j<channels ; j++)
+ {
+ if( inwidth == 2 ) {
+ sample = LittleShort ( ((short *)data)[srcsample+j] );
+ } else {
+ sample = (int)( (unsigned char)(data[srcsample+j]) - 128) << 8;
+ }
+ sfx[i*channels+j] = sample;
}
- sfx[i] = sample;
}
return outcount;
}
@@ -226,7 +233,7 @@ qboolean S_LoadSound( sfx_t *sfx )
Com_DPrintf(S_COLOR_YELLOW "WARNING: %s is not a 22kHz audio file\n", sfx->soundName);
}
- samples = Hunk_AllocateTempMemory(info.samples * sizeof(short) * 2);
+ samples = Hunk_AllocateTempMemory(info.channels * info.samples * sizeof(short) * 2);
sfx->lastTimeUsed = Com_Milliseconds()+1;
@@ -236,29 +243,30 @@ qboolean S_LoadSound( sfx_t *sfx )
// manager to do the right thing for us and page
// sound in as needed
- if( sfx->soundCompressed == qtrue) {
+ if( info.channels == 1 && sfx->soundCompressed == qtrue) {
sfx->soundCompressionMethod = 1;
sfx->soundData = NULL;
- sfx->soundLength = ResampleSfxRaw( samples, info.rate, info.width, info.samples, data + info.dataofs );
+ sfx->soundLength = ResampleSfxRaw( samples, info.channels, info.rate, info.width, info.samples, data + info.dataofs );
S_AdpcmEncodeSound(sfx, samples);
#if 0
- } else if (info.samples>(SND_CHUNK_SIZE*16) && info.width >1) {
+ } else if (info.channels == 1 && info.samples>(SND_CHUNK_SIZE*16) && info.width >1) {
sfx->soundCompressionMethod = 3;
sfx->soundData = NULL;
- sfx->soundLength = ResampleSfxRaw( samples, info.rate, info.width, info.samples, (data + info.dataofs) );
+ sfx->soundLength = ResampleSfxRaw( samples, info.channels, info.rate, info.width, info.samples, (data + info.dataofs) );
encodeMuLaw( sfx, samples);
- } else if (info.samples>(SND_CHUNK_SIZE*6400) && info.width >1) {
+ } else if (info.channels == 1 && info.samples>(SND_CHUNK_SIZE*6400) && info.width >1) {
sfx->soundCompressionMethod = 2;
sfx->soundData = NULL;
- sfx->soundLength = ResampleSfxRaw( samples, info.rate, info.width, info.samples, (data + info.dataofs) );
+ sfx->soundLength = ResampleSfxRaw( samples, info.channels, info.rate, info.width, info.samples, (data + info.dataofs) );
encodeWavelet( sfx, samples);
#endif
} else {
sfx->soundCompressionMethod = 0;
- sfx->soundLength = info.samples;
sfx->soundData = NULL;
- ResampleSfx( sfx, info.rate, info.width, data + info.dataofs, qfalse );
+ sfx->soundLength = ResampleSfx( sfx, info.channels, info.rate, info.width, info.samples, data + info.dataofs, qfalse );
}
+
+ sfx->soundChannels = info.channels;
Hunk_FreeTempMemory(samples);
Hunk_FreeTempMemory(data);