X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=snd_dma.c;h=87ef8a5cf78f8e890db6dcaa9b148419bb92b1b5;hb=071f4b01d2665d6f77635425a2212b423d02a4b6;hp=11fb8c326a991da7f51e052e97b0bcd1d0b581c4;hpb=c0cf058bf3c8d866dd2279b2ae418550803360cd;p=xonotic%2Fdarkplaces.git diff --git a/snd_dma.c b/snd_dma.c index 11fb8c32..87ef8a5c 100644 --- a/snd_dma.c +++ b/snd_dma.c @@ -40,6 +40,9 @@ void S_Update_(); void S_StopAllSounds(qboolean clear); void S_StopAllSoundsC(void); +void S_ClearBuffer (void); + + // ======================================================================= // Internal sound data & structures // ======================================================================= @@ -48,7 +51,6 @@ channel_t channels[MAX_CHANNELS]; unsigned int total_channels; int snd_blocked = 0; -static qboolean snd_ambient = 1; cvar_t snd_initialized = { CVAR_READONLY, "snd_initialized", "0"}; cvar_t snd_streaming = { CVAR_SAVE, "snd_streaming", "1"}; @@ -107,18 +109,6 @@ qboolean fakedma = false; int fakedma_updates = 15; -void S_AmbientOff (void) -{ - snd_ambient = false; -} - - -void S_AmbientOn (void) -{ - snd_ambient = true; -} - - void S_SoundInfo_f(void) { if (!sound_started || !shm) @@ -132,7 +122,7 @@ void S_SoundInfo_f(void) Con_Printf("%5d samplepos\n", shm->samplepos); Con_Printf("%5d samplebits\n", shm->format.width * 8); Con_Printf("%5d speed\n", shm->format.speed); - Con_Printf("0x%x dma buffer\n", shm->buffer); + Con_Printf("%p dma buffer\n", shm->buffer); Con_Printf("%5u total_channels\n", total_channels); } @@ -220,8 +210,6 @@ void S_Init(void) { Con_DPrint("\nSound Initialization\n"); - S_RawSamples_ClearQueue(); - Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&bgmvolume); Cvar_RegisterVariable(&snd_staticvolume); @@ -261,8 +249,8 @@ void S_Init(void) SND_InitScaletable (); - ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav", false); - ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav", false); + ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav", false, true); + ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav", false, true); total_channels = MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS; // no statics memset(channels, 0, MAX_CHANNELS * sizeof(channel_t)); @@ -281,21 +269,25 @@ S_GetCached ========= */ -sfx_t *S_GetCached (const char *name) +sfx_t *S_GetCached (const char *name, qboolean stdpath) { + char namebuffer [MAX_QPATH]; + size_t len; int i; if (!snd_initialized.integer) return NULL; if (!name) - Host_Error("S_IsCached: NULL\n"); + Host_Error("S_GetCached: NULL"); - if (strlen(name) >= MAX_QPATH) - Host_Error("Sound name too long: %s", name); + // Add the default sound directory to the path + len = snprintf (namebuffer, sizeof (namebuffer), stdpath ? "sound/%s" : "%s", name); + if (len >= sizeof (namebuffer)) + Host_Error ("S_GetCached: sound name too long (%s)", name); for(i = 0;i < num_sfx;i++) - if(!strcmp(known_sfx[i].name, name)) + if(!strcmp(known_sfx[i].name, namebuffer)) return &known_sfx[i]; return NULL; @@ -307,31 +299,25 @@ S_FindName ================== */ -sfx_t *S_FindName (char *name) +sfx_t *S_FindName (const char *name, qboolean stdpath) { - int i; sfx_t *sfx; if (!snd_initialized.integer) return NULL; - if (!name) - Host_Error("S_FindName: NULL\n"); - - if (strlen(name) >= MAX_QPATH) - Host_Error("Sound name too long: %s", name); - -// see if already loaded - for (i = 0;i < num_sfx;i++) - if (!strcmp(known_sfx[i].name, name)) - return &known_sfx[i]; + sfx = S_GetCached (name, stdpath); - if (num_sfx == MAX_SFX) - Sys_Error("S_FindName: out of sfx_t"); + // If we haven't allocated a sfx_t struct for it yet + if (sfx == NULL) + { + if (num_sfx == MAX_SFX) + Sys_Error ("S_FindName: out of sfx_t"); - sfx = &known_sfx[num_sfx++]; - memset(sfx, 0, sizeof(*sfx)); - strlcpy (sfx->name, name, sizeof (sfx->name)); + sfx = &known_sfx[num_sfx++]; + memset (sfx, 0, sizeof(*sfx)); + snprintf (sfx->name, sizeof (sfx->name), stdpath ? "sound/%s" : "%s", name); + } return sfx; } @@ -342,11 +328,11 @@ S_TouchSound ================== */ -void S_TouchSound (char *name) +void S_TouchSound (const char *name, qboolean stdpath) { sfx_t *sfx; - sfx = S_FindName (name); + sfx = S_FindName (name, stdpath); // Set the "used" flag for this sound if (sfx != NULL) @@ -397,14 +383,14 @@ S_PrecacheSound ================== */ -sfx_t *S_PrecacheSound (char *name, int complain) +sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean stdpath) { sfx_t *sfx; if (!snd_initialized.integer) return NULL; - sfx = S_FindName(name); + sfx = S_FindName (name, stdpath); if (!nosound.integer && snd_precache.integer) S_LoadSound(sfx, complain); @@ -690,6 +676,12 @@ void S_ResumeGameSounds (void) } } +void S_SetChannelVolume (unsigned int ch_ind, float fvol) +{ + channels[ch_ind].master_vol = fvol * 255; +} + + void S_ClearBuffer(void) { int clear; @@ -808,7 +800,7 @@ void S_UpdateAmbientSounds (void) for (ambient_channel = 0 ; ambient_channel < NUM_AMBIENTS;ambient_channel++) channels[ambient_channel].sfx = NULL; - if (!snd_ambient || ambient_level.value <= 0 || !cl.worldmodel || !cl.worldmodel->brush.AmbientSoundLevelsForPoint) + if (ambient_level.value <= 0 || !cl.worldmodel || !cl.worldmodel->brush.AmbientSoundLevelsForPoint) return; cl.worldmodel->brush.AmbientSoundLevelsForPoint(cl.worldmodel, listener_vieworigin, ambientlevels, sizeof(ambientlevels)); @@ -1042,7 +1034,7 @@ static void S_Play_Common(float fvol, float attenuation) snprintf(name, sizeof(name), "%s.wav", Cmd_Argv(i)); else strlcpy(name, Cmd_Argv(i), sizeof(name)); - sfx = S_PrecacheSound(name, true); + sfx = S_PrecacheSound(name, true, true); // If we need to get the volume from the command line if (fvol == -1.0f) @@ -1100,7 +1092,7 @@ void S_SoundList(void) } -void S_LocalSound (char *sound) +void S_LocalSound (const char *sound, qboolean stdpath) { sfx_t *sfx; int ch_ind; @@ -1108,7 +1100,7 @@ void S_LocalSound (char *sound) if (!snd_initialized.integer || nosound.integer) return; - sfx = S_PrecacheSound (sound, true); + sfx = S_PrecacheSound (sound, true, stdpath); if (!sfx) { Con_Printf("S_LocalSound: can't precache %s\n", sound); @@ -1119,116 +1111,3 @@ void S_LocalSound (char *sound) if (ch_ind >= 0) channels[ch_ind].flags |= CHANNELFLAG_LOCALSOUND; } - - -#define RAWSAMPLESBUFFER 32768 -short s_rawsamplesbuffer[RAWSAMPLESBUFFER * 2]; -int s_rawsamplesbuffer_start; -size_t s_rawsamplesbuffer_count; - -void S_RawSamples_Enqueue(short *samples, unsigned int length) -{ - int b2, b3; - //Con_Printf("S_RawSamples_Enqueue: %i samples\n", length); - if (s_rawsamplesbuffer_count + length > RAWSAMPLESBUFFER) - return; - b2 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count) % RAWSAMPLESBUFFER; - if (b2 + length > RAWSAMPLESBUFFER) - { - b3 = (b2 + length) % RAWSAMPLESBUFFER; - memcpy(s_rawsamplesbuffer + b2 * 2, samples, (RAWSAMPLESBUFFER - b2) * sizeof(short[2])); - memcpy(s_rawsamplesbuffer, samples + (RAWSAMPLESBUFFER - b2) * 2, b3 * sizeof(short[2])); - } - else - memcpy(s_rawsamplesbuffer + b2 * 2, samples, length * sizeof(short[2])); - s_rawsamplesbuffer_count += length; -} - -void S_RawSamples_Dequeue(int *samples, unsigned int length) -{ - int b1, b2; - size_t l; - int i; - short *in; - int *out; - int count; - l = length; - if (l > s_rawsamplesbuffer_count) - l = s_rawsamplesbuffer_count; - b1 = (s_rawsamplesbuffer_start) % RAWSAMPLESBUFFER; - if (b1 + l > RAWSAMPLESBUFFER) - { - b2 = (b1 + l) % RAWSAMPLESBUFFER; - //memcpy(samples, s_rawsamplesbuffer + b1 * 2, (RAWSAMPLESBUFFER - b1) * sizeof(short[2])); - //memcpy(samples + (RAWSAMPLESBUFFER - b1) * 2, s_rawsamplesbuffer, b2 * sizeof(short[2])); - for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = (RAWSAMPLESBUFFER - b1) * 2, i = 0;i < count;i++) - out[i] = in[i]; - for (out = samples + (RAWSAMPLESBUFFER - b1) * 2, in = s_rawsamplesbuffer, count = b2 * 2, i = 0;i < count;i++) - out[i] = in[i]; - //Con_Printf("S_RawSamples_Dequeue: buffer wrap %i %i\n", (RAWSAMPLESBUFFER - b1), b2); - } - else - { - //memcpy(samples, s_rawsamplesbuffer + b1 * 2, l * sizeof(short[2])); - for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = l * 2, i = 0;i < count;i++) - out[i] = in[i]; - //Con_Printf("S_RawSamples_Dequeue: normal %i\n", l); - } - if (l < (int)length) - { - memset(samples + l * 2, 0, (length - l) * sizeof(int[2])); - //Con_Printf("S_RawSamples_Dequeue: padding with %i samples\n", length - l); - } - s_rawsamplesbuffer_start = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; - s_rawsamplesbuffer_count -= l; -} - -void S_RawSamples_ClearQueue(void) -{ - s_rawsamplesbuffer_count = 0; - s_rawsamplesbuffer_start = 0; -} - -int S_RawSamples_QueueWantsMore(void) -{ - if (shm != NULL && s_rawsamplesbuffer_count < min(shm->format.speed >> 1, RAWSAMPLESBUFFER >> 1)) - return RAWSAMPLESBUFFER - s_rawsamplesbuffer_count; - else - return 0; -} - -void S_ResampleBuffer16Stereo(short *input, int inputlength, short *output, int outputlength) -{ - if (inputlength != outputlength) - { - int i, position, stopposition, step; - short *in, *out; - step = (float) inputlength * 256.0f / (float) outputlength; - position = 0; - stopposition = (inputlength - 1) << 8; - out = output; - for (i = 0;i < outputlength && position < stopposition;i++, position += step) - { - in = input + ((position >> 8) << 1); - out[0] = (((in[1] - in[0]) * (position & 255)) >> 8) + in[0]; - out[1] = (((in[3] - in[2]) * (position & 255)) >> 8) + in[2]; - out += 2; - } - stopposition = inputlength << 8; - for (i = 0;i < outputlength && position < stopposition;i++, position += step) - { - in = input + ((position >> 8) << 1); - out[0] = in[0]; - out[1] = in[2]; - out += 2; - } - } - else - memcpy(output, input, inputlength * sizeof(short[2])); -} - -int S_RawSamples_SampleRate(void) -{ - return shm != NULL ? shm->format.speed : 0; -} -