yq2 never had a dma based soundengine. Let's call it just "sound".

This commit is contained in:
Yamagi Burmeister 2013-04-20 13:40:54 +02:00
parent b45876ffdd
commit ef7c85bbcd
3 changed files with 70 additions and 70 deletions

View file

@ -51,10 +51,10 @@
/* Globals */ /* Globals */
cvar_t *s_sdldriver; cvar_t *s_sdldriver;
int *snd_p; int *snd_p;
static dma_t *dmabackend; static sound_t *backend;
static portable_samplepair_t paintbuffer[SDL_PAINTBUFFER_SIZE]; static portable_samplepair_t paintbuffer[SDL_PAINTBUFFER_SIZE];
static int dmapos = 0; static int playpos = 0;
static int dmasize = 0; static int samplesize = 0;
static int snd_inited = 0; static int snd_inited = 0;
static int snd_scaletable[32][256]; static int snd_scaletable[32][256];
static int snd_vol; static int snd_vol;
@ -82,7 +82,7 @@ SDL_TransferPaintBuffer(int endtime)
short *snd_out; short *snd_out;
unsigned char *pbuf; unsigned char *pbuf;
pbuf = dma.buffer; pbuf = sound.buffer;
if (s_testsound->value) if (s_testsound->value)
{ {
@ -99,18 +99,18 @@ SDL_TransferPaintBuffer(int endtime)
} }
} }
if ((dma.samplebits == 16) && (dma.channels == 2)) if ((sound.samplebits == 16) && (sound.channels == 2))
{ {
snd_p = (int *)paintbuffer; snd_p = (int *)paintbuffer;
ls_paintedtime = paintedtime; ls_paintedtime = paintedtime;
while (ls_paintedtime < endtime) while (ls_paintedtime < endtime)
{ {
lpos = ls_paintedtime & ((dma.samples >> 1) - 1); lpos = ls_paintedtime & ((sound.samples >> 1) - 1);
snd_out = (short *)pbuf + (lpos << 1); snd_out = (short *)pbuf + (lpos << 1);
snd_linear_count = (dma.samples >> 1) - lpos; snd_linear_count = (sound.samples >> 1) - lpos;
if (ls_paintedtime + snd_linear_count > endtime) if (ls_paintedtime + snd_linear_count > endtime)
{ {
@ -159,12 +159,12 @@ SDL_TransferPaintBuffer(int endtime)
else else
{ {
p = (int *)paintbuffer; p = (int *)paintbuffer;
count = (endtime - paintedtime) * dma.channels; count = (endtime - paintedtime) * sound.channels;
out_mask = dma.samples - 1; out_mask = sound.samples - 1;
out_idx = paintedtime * dma.channels & out_mask; out_idx = paintedtime * sound.channels & out_mask;
step = 3 - dma.channels; step = 3 - sound.channels;
if (dma.samplebits == 16) if (sound.samplebits == 16)
{ {
short *out = (short *)pbuf; short *out = (short *)pbuf;
@ -187,7 +187,7 @@ SDL_TransferPaintBuffer(int endtime)
out_idx = (out_idx + 1) & out_mask; out_idx = (out_idx + 1) & out_mask;
} }
} }
else if (dma.samplebits == 8) else if (sound.samplebits == 8)
{ {
unsigned char *out = (unsigned char *)pbuf; unsigned char *out = (unsigned char *)pbuf;
@ -300,7 +300,7 @@ SDL_PaintChannels(int endtime)
while (paintedtime < endtime) while (paintedtime < endtime)
{ {
/* if paintbuffer is smaller than DMA buffer */ /* if paintbuffer is smaller than SDL buffer */
end = endtime; end = endtime;
if (endtime - paintedtime > SDL_PAINTBUFFER_SIZE) if (endtime - paintedtime > SDL_PAINTBUFFER_SIZE)
@ -432,7 +432,7 @@ SDL_PaintChannels(int endtime)
} }
} }
/* transfer out according to DMA format */ /* transfer out according to SDL format */
SDL_TransferPaintBuffer(end); SDL_TransferPaintBuffer(end);
paintedtime = end; paintedtime = end;
} }
@ -447,24 +447,24 @@ SDL_PaintChannels(int endtime)
int int
SDL_DriftBeginofs(float timeofs) SDL_DriftBeginofs(float timeofs)
{ {
int start = (int)(cl.frame.servertime * 0.001f * dma.speed + s_beginofs); int start = (int)(cl.frame.servertime * 0.001f * sound.speed + s_beginofs);
if (start < paintedtime) if (start < paintedtime)
{ {
start = paintedtime; start = paintedtime;
s_beginofs = (int)(start - (cl.frame.servertime * 0.001f * dma.speed)); s_beginofs = (int)(start - (cl.frame.servertime * 0.001f * sound.speed));
} }
else if (start > paintedtime + 0.3f * dma.speed) else if (start > paintedtime + 0.3f * sound.speed)
{ {
start = (int)(paintedtime + 0.1f * dma.speed); start = (int)(paintedtime + 0.1f * sound.speed);
s_beginofs = (int)(start - (cl.frame.servertime * 0.001f * dma.speed)); s_beginofs = (int)(start - (cl.frame.servertime * 0.001f * sound.speed));
} }
else else
{ {
s_beginofs -= 10; s_beginofs -= 10;
} }
return timeofs ? start + timeofs * dma.speed : paintedtime; return timeofs ? start + timeofs * sound.speed : paintedtime;
} }
/* /*
@ -499,7 +499,7 @@ SDL_SpatializeOrigin(vec3_t origin, float master_vol, float dist_mult,
dist *= dist_mult; dist *= dist_mult;
dot = DotProduct(listener_right, source_vec); dot = DotProduct(listener_right, source_vec);
if ((dma.channels == 1) || !dist_mult) if ((sound.channels == 1) || !dist_mult)
{ {
rscale = 1.0f; rscale = 1.0f;
lscale = 1.0f; lscale = 1.0f;
@ -696,7 +696,7 @@ SDL_ClearBuffer(void)
{ {
int clear; int clear;
int i; int i;
unsigned char *ptr = dma.buffer; unsigned char *ptr = sound.buffer;
if (!sound_started) if (!sound_started)
{ {
@ -705,7 +705,7 @@ SDL_ClearBuffer(void)
s_rawend = 0; s_rawend = 0;
if (dma.samplebits == 8) if (sound.samplebits == 8)
{ {
clear = 0x80; clear = 0x80;
} }
@ -716,9 +716,9 @@ SDL_ClearBuffer(void)
SDL_LockAudio(); SDL_LockAudio();
if (dma.buffer) if (sound.buffer)
{ {
i = dma.samples * dma.samplebits / 8; i = sound.samples * sound.samplebits / 8;
while (i--) while (i--)
{ {
@ -741,11 +741,11 @@ SDL_UpdateSoundtime(void)
static int oldsamplepos; static int oldsamplepos;
int fullsamples; int fullsamples;
fullsamples = dma.samples / dma.channels; fullsamples = sound.samples / sound.channels;
/* it is possible to miscount buffers if it has wrapped twice between /* it is possible to miscount buffers if it has wrapped twice between
calls to S_Update. Oh well. This a hack around that. */ calls to S_Update. Oh well. This a hack around that. */
if (dmapos < oldsamplepos) if (playpos < oldsamplepos)
{ {
buffers++; /* buffer wrapped */ buffers++; /* buffer wrapped */
@ -758,8 +758,8 @@ SDL_UpdateSoundtime(void)
} }
} }
oldsamplepos = dmapos; oldsamplepos = playpos;
soundtime = buffers * fullsamples + dmapos / dma.channels; soundtime = buffers * fullsamples + playpos / sound.channels;
} }
/* /*
@ -810,7 +810,7 @@ SDL_Cache(sfx_t *sfx, wavinfo_t *info, byte *data)
sfxcache_t *sc; sfxcache_t *sc;
unsigned int samplefrac = 0; unsigned int samplefrac = 0;
stepscale = (float)info->rate / dma.speed; stepscale = (float)info->rate / sound.speed;
len = (int)(info->samples / stepscale); len = (int)(info->samples / stepscale);
if ((info->samples == 0) || (len == 0)) if ((info->samples == 0) || (len == 0))
@ -830,7 +830,7 @@ SDL_Cache(sfx_t *sfx, wavinfo_t *info, byte *data)
sc->loopstart = info->loopstart; sc->loopstart = info->loopstart;
sc->stereo = 0; sc->stereo = 0;
sc->length = (int)(info->samples / stepscale); sc->length = (int)(info->samples / stepscale);
sc->speed = dma.speed; sc->speed = sound.speed;
if ((int)(info->samples / stepscale) == 0) if ((int)(info->samples / stepscale) == 0)
{ {
@ -899,7 +899,7 @@ SDL_RawSamples(int samples, int rate, int width,
int src; int src;
int intVolume; int intVolume;
scale = (float)rate / dma.speed; scale = (float)rate / sound.speed;
intVolume = (int)(256 * volume); intVolume = (int)(256 * volume);
if ((channels == 2) && (width == 2)) if ((channels == 2) && (width == 2))
@ -1064,7 +1064,7 @@ SDL_Update(void)
OGG_Stream(); OGG_Stream();
#endif #endif
if (!dma.buffer) if (!sound.buffer)
{ {
return; return;
} }
@ -1088,11 +1088,11 @@ SDL_Update(void)
} }
/* mix ahead of current position */ /* mix ahead of current position */
endtime = (int)(soundtime + s_mixahead->value * dma.speed); endtime = (int)(soundtime + s_mixahead->value * sound.speed);
/* mix to an even submission block size */ /* mix to an even submission block size */
endtime = (endtime + dma.submission_chunk - 1) & ~(dma.submission_chunk - 1); endtime = (endtime + sound.submission_chunk - 1) & ~(sound.submission_chunk - 1);
samps = dma.samples >> (dma.channels - 1); samps = sound.samples >> (sound.channels - 1);
if (endtime - soundtime > samps) if (endtime - soundtime > samps)
{ {
@ -1112,13 +1112,13 @@ SDL_Update(void)
void void
SDL_SoundInfo(void) SDL_SoundInfo(void)
{ {
Com_Printf("%5d stereo\n", dma.channels - 1); Com_Printf("%5d stereo\n", sound.channels - 1);
Com_Printf("%5d samples\n", dma.samples); Com_Printf("%5d samples\n", sound.samples);
Com_Printf("%5d samplepos\n", dma.samplepos); Com_Printf("%5d samplepos\n", sound.samplepos);
Com_Printf("%5d samplebits\n", dma.samplebits); Com_Printf("%5d samplebits\n", sound.samplebits);
Com_Printf("%5d submission_chunk\n", dma.submission_chunk); Com_Printf("%5d submission_chunk\n", sound.submission_chunk);
Com_Printf("%5d speed\n", dma.speed); Com_Printf("%5d speed\n", sound.speed);
Com_Printf("%p dma buffer\n", dma.buffer); Com_Printf("%p sound buffer\n", sound.buffer);
} }
/* /*
@ -1130,11 +1130,11 @@ SDL_Callback(void *data, Uint8 *stream, int length)
{ {
int length1; int length1;
int length2; int length2;
int pos = (dmapos * (dmabackend->samplebits / 8)); int pos = (playpos * (backend->samplebits / 8));
if (pos >= dmasize) if (pos >= samplesize)
{ {
dmapos = pos = 0; playpos = pos = 0;
} }
/* This can't happen! */ /* This can't happen! */
@ -1144,7 +1144,7 @@ SDL_Callback(void *data, Uint8 *stream, int length)
return; return;
} }
int tobufferend = dmasize - pos; int tobufferend = samplesize - pos;
if (length > tobufferend) if (length > tobufferend)
{ {
@ -1157,22 +1157,22 @@ SDL_Callback(void *data, Uint8 *stream, int length)
length2 = 0; length2 = 0;
} }
memcpy(stream, dmabackend->buffer + pos, length1); memcpy(stream, backend->buffer + pos, length1);
/* Set new position */ /* Set new position */
if (length2 <= 0) if (length2 <= 0)
{ {
dmapos += (length1 / (dmabackend->samplebits / 8)); playpos += (length1 / (backend->samplebits / 8));
} }
else else
{ {
memcpy(stream + length1, dmabackend->buffer, length2); memcpy(stream + length1, backend->buffer, length2);
dmapos = (length2 / (dmabackend->samplebits / 8)); playpos = (length2 / (backend->samplebits / 8));
} }
if (dmapos >= dmasize) if (playpos >= samplesize)
{ {
dmapos = 0; playpos = 0;
} }
} }
@ -1288,11 +1288,11 @@ SDL_BackendInit(void)
} }
/* This points to the frontend */ /* This points to the frontend */
dmabackend = &dma; backend = &sound;
dmapos = 0; playpos = 0;
dmabackend->samplebits = obtained.format & 0xFF; backend->samplebits = obtained.format & 0xFF;
dmabackend->channels = obtained.channels; backend->channels = obtained.channels;
tmp = (obtained.samples * obtained.channels) * 10; tmp = (obtained.samples * obtained.channels) * 10;
if (tmp & (tmp - 1)) if (tmp & (tmp - 1))
@ -1303,12 +1303,12 @@ SDL_BackendInit(void)
tmp = val; tmp = val;
} }
dmabackend->samples = tmp; backend->samples = tmp;
dmabackend->submission_chunk = 1; backend->submission_chunk = 1;
dmabackend->speed = obtained.freq; backend->speed = obtained.freq;
dmasize = (dmabackend->samples * (dmabackend->samplebits / 8)); samplesize = (backend->samples * (backend->samplebits / 8));
dmabackend->buffer = calloc(1, dmasize); backend->buffer = calloc(1, samplesize);
s_numchannels = MAX_CHANNELS; s_numchannels = MAX_CHANNELS;
SDL_UpdateScaletable(); SDL_UpdateScaletable();
@ -1329,9 +1329,9 @@ SDL_BackendShutdown(void)
SDL_PauseAudio(1); SDL_PauseAudio(1);
SDL_CloseAudio(); SDL_CloseAudio();
SDL_QuitSubSystem(SDL_INIT_AUDIO); SDL_QuitSubSystem(SDL_INIT_AUDIO);
free(dmabackend->buffer); free(backend->buffer);
dmabackend->buffer = NULL; backend->buffer = NULL;
dmapos = dmasize = 0; playpos = samplesize = 0;
snd_inited = 0; snd_inited = 0;
Com_Printf("SDL audio device shut down.\n"); Com_Printf("SDL audio device shut down.\n");
} }

View file

@ -80,7 +80,7 @@ typedef struct
int samplebits; int samplebits;
int speed; int speed;
unsigned char *buffer; unsigned char *buffer;
} dma_t; } sound_t;
typedef struct typedef struct
{ {
@ -152,7 +152,7 @@ extern vec3_t listener_origin;
extern vec3_t listener_forward; extern vec3_t listener_forward;
extern vec3_t listener_right; extern vec3_t listener_right;
extern vec3_t listener_up; extern vec3_t listener_up;
extern dma_t dma; extern sound_t sound;
extern playsound_t s_pendingplays; extern playsound_t s_pendingplays;
#define MAX_RAW_SAMPLES 8192 #define MAX_RAW_SAMPLES 8192

View file

@ -47,7 +47,7 @@ int s_numchannels;
qboolean snd_initialized = false; qboolean snd_initialized = false;
sndstarted_t sound_started = SS_NOT; sndstarted_t sound_started = SS_NOT;
dma_t dma; sound_t sound;
vec3_t listener_origin; vec3_t listener_origin;
vec3_t listener_forward; vec3_t listener_forward;
@ -165,7 +165,7 @@ S_Init(void)
soundtime = 0; soundtime = 0;
paintedtime = 0; paintedtime = 0;
Com_Printf("Sound sampling rate: %i\n", dma.speed); Com_Printf("Sound sampling rate: %i\n", sound.speed);
S_StopAllSounds(); S_StopAllSounds();