From f6d047712d37371f1795ef910b21fd9e0dedb51c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 26 Feb 2001 17:39:32 +0000 Subject: [PATCH] all -snd* params and environment checking have been removed from the sound subsystem in favor of Cvars*. These new cvars are: o snd_device defaults to "" which selects the default device of the system (eg, plug:0,0 for ALSA 0.9 or /dev/dsp for OSS) o snd_rate defaults to 0 which selects the system default rate. o snd_bits defaults to 0 which selects the system default bit depth. o snd_stereo defaults to 1 (0 is mono) * actually, not that thorough: alsa and oss only. The rest have just ws :/ --- qw/include/sound.h | 4 + qw/source/snd_alsa_0_5.c | 26 ++- qw/source/snd_alsa_0_9.c | 345 ++++++++++++++++++++------------------- qw/source/snd_dma.c | 83 +++++++--- qw/source/snd_mem.c | 9 +- qw/source/snd_mix.c | 68 ++++---- qw/source/snd_null.c | 3 +- qw/source/snd_oss.c | 71 ++++---- qw/source/snd_sun.c | 2 +- qw/source/snd_win.c | 77 +++++---- 10 files changed, 366 insertions(+), 322 deletions(-) diff --git a/qw/include/sound.h b/qw/include/sound.h index 9afee4078..a148af562 100644 --- a/qw/include/sound.h +++ b/qw/include/sound.h @@ -172,6 +172,10 @@ extern cvar_t *loadas8bit; extern cvar_t *bgmvolume; extern cvar_t *volume; +extern cvar_t *snd_device; +extern cvar_t *snd_rate; +extern cvar_t *snd_bits; +extern cvar_t *snd_stereo; extern cvar_t *snd_interp; extern cvar_t *snd_stereo_phase_separation; diff --git a/qw/source/snd_alsa_0_5.c b/qw/source/snd_alsa_0_5.c index 923839072..eac53d574 100644 --- a/qw/source/snd_alsa_0_5.c +++ b/qw/source/snd_alsa_0_5.c @@ -123,14 +123,11 @@ SNDDMA_Init (void) Con_Printf ("No sound cards detected\n"); return 0; } - if ((i = COM_CheckParm ("-sndcard")) != 0) { - card = atoi (com_argv[i + 1]); + if (snd_device->string[0]) { + sscanf (snd_device->string, "%d,%d", &card, &dev); } - if ((i = COM_CheckParm ("-snddev")) != 0) { - dev = atoi (com_argv[i + 1]); - } - if ((i = COM_CheckParm ("-sndbits")) != 0) { - i = atoi (com_argv[i + 1]); + if (snd_bits->int_val) { + i = snd_bits->int_val; if (i == 16) { format = SND_PCM_SFMT_S16_LE; } else if (i == 8) { @@ -140,16 +137,14 @@ SNDDMA_Init (void) return 0; } } - if ((i = COM_CheckParm ("-sndspeed")) != 0) { - rate = atoi (com_argv[i + 1]); + if (snd_rate->int_val) { + rate = snd_rate->int_val; if (rate != 44100 && rate != 22050 && rate != 11025) { Con_Printf ("Error: invalid sample rate: %d\n", rate); return 0; } } - if ((i = COM_CheckParm ("-sndmono")) != 0) { - stereo = 0; - } + stereo = snd_stereo->int_val; if (card == -1) { for (card = 0; card < SND_CARDS; card++) { if (!(mask & (1 << card))) @@ -273,9 +268,10 @@ SNDDMA_Init (void) shm->samplebits = setup.format.format == SND_PCM_SFMT_S16_LE ? 16 : 8; shm->samples = setup.buf.block.frags * setup.buf.block.frag_size / (shm->samplebits / 8); // mono - // samples - // in - // buffer + // + // samples + // in + // buffer shm->speed = setup.format.rate; shm->buffer = (unsigned char *) mmap_data; Con_Printf ("%5d stereo\n", shm->channels - 1); diff --git a/qw/source/snd_alsa_0_9.c b/qw/source/snd_alsa_0_9.c index 1b4cc6b0f..b5e646f29 100644 --- a/qw/source/snd_alsa_0_9.c +++ b/qw/source/snd_alsa_0_9.c @@ -40,190 +40,193 @@ #include "qargs.h" #include "console.h" -static int snd_inited; +static int snd_inited; static snd_pcm_t *pcm; static const snd_pcm_channel_area_t *mmap_areas; static char *pcmname = NULL; -size_t buffer_size; +size_t buffer_size; -qboolean SNDDMA_Init(void) +qboolean +SNDDMA_Init (void) { - int err,i; - int rate=-1,bps=-1,stereo=-1,frag_size; + int err; + int rate = -1, bps = -1, stereo = -1, frag_size; snd_pcm_hw_params_t *hw; snd_pcm_sw_params_t *sw; - snd_pcm_hw_params_alloca(&hw); - snd_pcm_sw_params_alloca(&sw); - if ((i=COM_CheckParm("-sndpcm"))!=0) { - pcmname=com_argv[i+1]; - } - if ((i=COM_CheckParm("-sndbits")) != 0) { - bps = atoi(com_argv[i+1]); + snd_pcm_hw_params_alloca (&hw); + snd_pcm_sw_params_alloca (&sw); + + if (snd_device->string[0]) + pcmname = snd_device->string; + if (snd_bits->int_val) { + bps = snd_bits->int_val; if (bps != 16 && bps != 8) { - Con_Printf("Error: invalid sample bits: %d\n", i); + Con_Printf ("Error: invalid sample bits: %d\n", bps); return 0; } } - if ((i=COM_CheckParm("-sndspeed")) != 0) { - rate = atoi(com_argv[i+1]); - if (rate!=44100 && rate!=22050 && rate!=11025) { - Con_Printf("Error: invalid sample rate: %d\n", rate); + if (snd_rate->int_val) { + rate = snd_rate->int_val; + if (rate != 44100 && rate != 22050 && rate != 11025) { + Con_Printf ("Error: invalid sample rate: %d\n", rate); return 0; } } - if ((i=COM_CheckParm("-sndmono")) != 0) { - stereo=0; - } - if ((i=COM_CheckParm("-sndstereo")) != 0) { - stereo=1; - } + stereo = snd_stereo->int_val; if (!pcmname) pcmname = "plug:0,0"; - if ((err=snd_pcm_open(&pcm, pcmname, - SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK))<0) { - Con_Printf("Error: audio open error: %s\n", snd_strerror(err)); + if ((err = snd_pcm_open (&pcm, pcmname, + SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + Con_Printf ("Error: audio open error: %s\n", snd_strerror (err)); return 0; } - Con_Printf("Using PCM %s.\n", pcmname); - snd_pcm_hw_params_any(pcm, hw); + Con_Printf ("Using PCM %s.\n", pcmname); + snd_pcm_hw_params_any (pcm, hw); switch (rate) { - case -1: - if (snd_pcm_hw_params_set_rate_near(pcm, hw, 44100, 0) >= 0) { - frag_size = 256; /* assuming stereo 8 bit */ - rate = 44100; - } else if (snd_pcm_hw_params_set_rate_near(pcm, hw, 22050, 0) >= 0) { - frag_size = 128; /* assuming stereo 8 bit */ - rate = 22050; - } else if (snd_pcm_hw_params_set_rate_near(pcm, hw, 11025, 0) >= 0) { - frag_size = 64; /* assuming stereo 8 bit */ - rate = 11025; - } else { - Con_Printf("ALSA: no useable rates\n"); - goto error; - } - break; - case 11025: - case 22050: - case 44100: - if (snd_pcm_hw_params_set_rate_near(pcm, hw, rate, 0) >= 0) { - frag_size = 64 * rate / 11025; /* assuming stereo 8 bit */ + case -1: + if (snd_pcm_hw_params_set_rate_near (pcm, hw, 44100, 0) >= 0) { + frag_size = 256; /* assuming stereo 8 bit */ + rate = 44100; + } else if (snd_pcm_hw_params_set_rate_near (pcm, hw, 22050, 0) >= 0) { + frag_size = 128; /* assuming stereo 8 bit */ + rate = 22050; + } else if (snd_pcm_hw_params_set_rate_near (pcm, hw, 11025, 0) >= 0) { + frag_size = 64; /* assuming stereo 8 bit */ + rate = 11025; + } else { + Con_Printf ("ALSA: no useable rates\n"); + goto error; + } break; - } - /* Fall through */ - default: - Con_Printf("ALSA: desired rate not supported\n"); - goto error; + case 11025: + case 22050: + case 44100: + if (snd_pcm_hw_params_set_rate_near (pcm, hw, rate, 0) >= 0) { + frag_size = 64 * rate / 11025; /* assuming stereo 8 bit */ + break; + } + /* Fall through */ + default: + Con_Printf ("ALSA: desired rate not supported\n"); + goto error; } switch (bps) { - case -1: - if (snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_S16_LE) >= 0) { - bps = 16; - } else if (snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_U8) >= 0) { - bps = 8; - } else { - Con_Printf("ALSA: no useable formats\n"); + case -1: + if (snd_pcm_hw_params_set_format (pcm, hw, SND_PCM_FORMAT_S16_LE) >= + 0) { + bps = 16; + } else if (snd_pcm_hw_params_set_format (pcm, hw, SND_PCM_FORMAT_U8) + >= 0) { + bps = 8; + } else { + Con_Printf ("ALSA: no useable formats\n"); + goto error; + } + break; + case 8: + case 16: + if (snd_pcm_hw_params_set_format (pcm, hw, + bps == 8 ? SND_PCM_FORMAT_U8 : + SND_PCM_FORMAT_S16) >= 0) { + break; + } + /* Fall through */ + default: + Con_Printf ("ALSA: desired format not supported\n"); goto error; - } - break; - case 8: - case 16: - if (snd_pcm_hw_params_set_format(pcm, hw, - bps == 8 ? SND_PCM_FORMAT_U8 : - SND_PCM_FORMAT_S16) >= 0) { - break; - } - /* Fall through */ - default: - Con_Printf("ALSA: desired format not supported\n"); - goto error; } - if (snd_pcm_hw_params_set_access(pcm, hw, - SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) { - Con_Printf("ALSA: interleaved is not supported\n"); + if (snd_pcm_hw_params_set_access (pcm, hw, + SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) { + Con_Printf ("ALSA: interleaved is not supported\n"); goto error; } switch (stereo) { - case -1: - if (snd_pcm_hw_params_set_channels(pcm, hw, 2) >= 0) { - stereo = 1; - } else if (snd_pcm_hw_params_set_channels(pcm, hw, 1) >= 0) { - stereo = 0; - } else { - Con_Printf("ALSA: no useable channels\n"); + case -1: + if (snd_pcm_hw_params_set_channels (pcm, hw, 2) >= 0) { + stereo = 1; + } else if (snd_pcm_hw_params_set_channels (pcm, hw, 1) >= 0) { + stereo = 0; + } else { + Con_Printf ("ALSA: no useable channels\n"); + goto error; + } + break; + case 0: + case 1: + if (snd_pcm_hw_params_set_channels (pcm, hw, stereo ? 2 : 1) >= 0) + break; + /* Fall through */ + default: + Con_Printf ("ALSA: desired channels not supported\n"); goto error; - } - break; - case 0: - case 1: - if (snd_pcm_hw_params_set_channels(pcm, hw, stereo ? 2 : 1) >= 0) - break; - /* Fall through */ - default: - Con_Printf("ALSA: desired channels not supported\n"); - goto error; } - snd_pcm_hw_params_set_period_size_near(pcm, hw, frag_size, 0); - - err = snd_pcm_hw_params(pcm, hw); + snd_pcm_hw_params_set_period_size_near (pcm, hw, frag_size, 0); + + err = snd_pcm_hw_params (pcm, hw); if (err < 0) { - Con_Printf("ALSA: unable to install hw params\n"); + Con_Printf ("ALSA: unable to install hw params\n"); goto error; } - snd_pcm_sw_params_current(pcm, sw); - snd_pcm_sw_params_set_start_mode(pcm, sw, SND_PCM_START_EXPLICIT); - snd_pcm_sw_params_set_xrun_mode(pcm, sw, SND_PCM_XRUN_NONE); + snd_pcm_sw_params_current (pcm, sw); + snd_pcm_sw_params_set_start_mode (pcm, sw, SND_PCM_START_EXPLICIT); + snd_pcm_sw_params_set_xrun_mode (pcm, sw, SND_PCM_XRUN_NONE); - err = snd_pcm_sw_params(pcm, sw); + err = snd_pcm_sw_params (pcm, sw); if (err < 0) { - Con_Printf("ALSA: unable to install sw params\n"); + Con_Printf ("ALSA: unable to install sw params\n"); goto error; } - mmap_areas = snd_pcm_mmap_running_areas(pcm); + mmap_areas = snd_pcm_mmap_running_areas (pcm); - shm=&sn; - memset((dma_t*)shm,0,sizeof(*shm)); + shm = &sn; + memset ((dma_t *) shm, 0, sizeof (*shm)); shm->splitbuffer = 0; - shm->channels=stereo+1; - shm->submission_chunk=snd_pcm_hw_params_get_period_size(hw, 0); // don't mix less than this # - shm->samplepos=0; // in mono samples - shm->samplebits=bps; - buffer_size = snd_pcm_hw_params_get_buffer_size(hw); - shm->samples=buffer_size*shm->channels; // mono samples in buffer - shm->speed=rate; - shm->buffer=(unsigned char*)mmap_areas->addr; - Con_Printf("%5d stereo\n", shm->channels - 1); - Con_Printf("%5d samples\n", shm->samples); - Con_Printf("%5d samplepos\n", shm->samplepos); - Con_Printf("%5d samplebits\n", shm->samplebits); - Con_Printf("%5d submission_chunk\n", shm->submission_chunk); - Con_Printf("%5d speed\n", shm->speed); - Con_Printf("0x%x dma buffer\n", (int)shm->buffer); - Con_Printf("%5d total_channels\n", total_channels); + shm->channels = stereo + 1; + shm->submission_chunk = snd_pcm_hw_params_get_period_size (hw, 0); // don't + // mix + // less + // than + // this + // # + shm->samplepos = 0; // in mono samples + shm->samplebits = bps; + buffer_size = snd_pcm_hw_params_get_buffer_size (hw); + shm->samples = buffer_size * shm->channels; // mono samples in buffer + shm->speed = rate; + shm->buffer = (unsigned char *) mmap_areas->addr; + Con_Printf ("%5d stereo\n", shm->channels - 1); + Con_Printf ("%5d samples\n", shm->samples); + Con_Printf ("%5d samplepos\n", shm->samplepos); + Con_Printf ("%5d samplebits\n", shm->samplebits); + Con_Printf ("%5d submission_chunk\n", shm->submission_chunk); + Con_Printf ("%5d speed\n", shm->speed); + Con_Printf ("0x%x dma buffer\n", (int) shm->buffer); + Con_Printf ("%5d total_channels\n", total_channels); - snd_inited=1; + snd_inited = 1; return 1; - error: - snd_pcm_close(pcm); + error: + snd_pcm_close (pcm); return 0; } static inline int -get_hw_ptr() +get_hw_ptr () { - size_t app_ptr; + size_t app_ptr; snd_pcm_sframes_t delay; - int hw_ptr; + int hw_ptr; if (snd_pcm_state (pcm) != SND_PCM_STATE_RUNNING) return 0; @@ -235,23 +238,25 @@ get_hw_ptr() return hw_ptr; } -int SNDDMA_GetDMAPos(void) +int +SNDDMA_GetDMAPos (void) { - int hw_ptr; + int hw_ptr; - if (!snd_inited) return 0; + if (!snd_inited) + return 0; - hw_ptr = get_hw_ptr(); + hw_ptr = get_hw_ptr (); hw_ptr *= shm->channels; shm->samplepos = hw_ptr; return shm->samplepos; } -void SNDDMA_Shutdown(void) +void +SNDDMA_Shutdown (void) { - if (snd_inited) - { - snd_pcm_close(pcm); + if (snd_inited) { + snd_pcm_close (pcm); snd_inited = 0; } } @@ -263,46 +268,46 @@ SNDDMA_Submit Send sound to device if buffer isn't really the dma buffer =============== */ -void SNDDMA_Submit(void) +void +SNDDMA_Submit (void) { - int count = paintedtime - soundtime; - int avail; - int missed; - int state; - int hw_ptr; - int offset; + int count = paintedtime - soundtime; + int avail; + int missed; + int state; + int hw_ptr; + int offset; state = snd_pcm_state (pcm); switch (state) { - case SND_PCM_STATE_PREPARED: - snd_pcm_mmap_forward (pcm, count); - snd_pcm_start (pcm); - break; - case SND_PCM_STATE_RUNNING: - hw_ptr = get_hw_ptr(); - missed = hw_ptr - shm->samplepos / shm->channels; - if (missed < 0) - missed += buffer_size; - count -= missed; - offset = snd_pcm_mmap_offset (pcm); - if (offset > hw_ptr) - count -= (offset - hw_ptr); - else - count -= (buffer_size - hw_ptr + offset); - if (count < 0) { - snd_pcm_rewind (pcm, -count); - } else { - avail = snd_pcm_avail_update(pcm); - if (avail < 0) - avail = buffer_size; - if (count > avail) - count = avail; + case SND_PCM_STATE_PREPARED: snd_pcm_mmap_forward (pcm, count); - } - break; - default: - break; + snd_pcm_start (pcm); + break; + case SND_PCM_STATE_RUNNING: + hw_ptr = get_hw_ptr (); + missed = hw_ptr - shm->samplepos / shm->channels; + if (missed < 0) + missed += buffer_size; + count -= missed; + offset = snd_pcm_mmap_offset (pcm); + if (offset > hw_ptr) + count -= (offset - hw_ptr); + else + count -= (buffer_size - hw_ptr + offset); + if (count < 0) { + snd_pcm_rewind (pcm, -count); + } else { + avail = snd_pcm_avail_update (pcm); + if (avail < 0) + avail = buffer_size; + if (count > avail) + count = avail; + snd_pcm_mmap_forward (pcm, count); + } + break; + default: + break; } } - diff --git a/qw/source/snd_dma.c b/qw/source/snd_dma.c index 0b96bd5e4..267ec3464 100644 --- a/qw/source/snd_dma.c +++ b/qw/source/snd_dma.c @@ -101,6 +101,10 @@ int sound_started = 0; cvar_t *bgmvolume; cvar_t *volume; +cvar_t *snd_device; +cvar_t *snd_rate; +cvar_t *snd_bits; +cvar_t *snd_stereo; cvar_t *nosound; cvar_t *precache; cvar_t *loadas8bit; @@ -197,13 +201,18 @@ void S_Init (void) { - Con_Printf("\nSound Initialization\n"); + Con_Printf ("\nSound Initialization\n"); - Cmd_AddCommand ("play", S_Play, "Play selected sound effect (play pathto/sound.wav)"); - Cmd_AddCommand ("playvol", S_PlayVol, "Play selected sound effect at selected volume (playvol pathto/sound.wav num"); - Cmd_AddCommand ("stopsound", S_StopAllSoundsC, "Stops all sounds currently being played"); - Cmd_AddCommand ("soundlist", S_SoundList, "Reports a list of sounds in the cache"); - Cmd_AddCommand ("soundinfo", S_SoundInfo_f, "Report information on the sound system"); + Cmd_AddCommand ("play", S_Play, + "Play selected sound effect (play pathto/sound.wav)"); + Cmd_AddCommand ("playvol", S_PlayVol, + "Play selected sound effect at selected volume (playvol pathto/sound.wav num"); + Cmd_AddCommand ("stopsound", S_StopAllSoundsC, + "Stops all sounds currently being played"); + Cmd_AddCommand ("soundlist", S_SoundList, + "Reports a list of sounds in the cache"); + Cmd_AddCommand ("soundinfo", S_SoundInfo_f, + "Report information on the sound system"); if (COM_CheckParm ("-nosound")) return; @@ -221,7 +230,7 @@ S_Init (void) S_Startup (); - if (sound_started == 0) // sound startup failed? Bail out. + if (sound_started == 0) // sound startup failed? Bail out. return; SND_InitScaletable (); @@ -261,22 +270,47 @@ S_Init (void) void S_Init_Cvars (void) { + snd_device = Cvar_Get ("snd_device", "", CVAR_ROM, + "sound device. \"\" is system default"); + snd_rate = Cvar_Get ("snd_rate", "0", CVAR_ROM, + "sound playback rate. 0 is system default"); + snd_bits = Cvar_Get ("snd_bits", "0", CVAR_ROM, + "sound sample depth. 0 is system default"); + snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, + "sound stereo output"); nosound = Cvar_Get ("nosound", "0", CVAR_NONE, "Set to turn sound off"); - volume = Cvar_Get ("volume", "0.7", CVAR_ARCHIVE, "Set the volume for sound playback"); - precache = Cvar_Get ("precache", "1", CVAR_NONE, "Toggle the use of a precache"); - loadas8bit = Cvar_Get ("loadas8bit", "0", CVAR_NONE, "Toggles if sounds are loaded as 8-bit samples"); + volume = + Cvar_Get ("volume", "0.7", CVAR_ARCHIVE, + "Set the volume for sound playback"); + precache = + Cvar_Get ("precache", "1", CVAR_NONE, "Toggle the use of a precache"); + loadas8bit = + Cvar_Get ("loadas8bit", "0", CVAR_NONE, + "Toggles if sounds are loaded as 8-bit samples"); bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, "Volume of CD music"); - ambient_level = Cvar_Get ("ambient_level", "0.3", CVAR_NONE, "Ambient sounds' volume"); - ambient_fade = Cvar_Get ("ambient_fade", "100", CVAR_NONE, "How quickly ambient sounds fade in or out"); - snd_noextraupdate = Cvar_Get ("snd_noextraupdate", "0", CVAR_NONE, - "Toggles the correct value display in host_speeds. Usually messes up sound playback when in effect"); - snd_show = Cvar_Get ("snd_show", "0", CVAR_NONE, "Toggles the display of sounds currently being played"); + ambient_level = + Cvar_Get ("ambient_level", "0.3", CVAR_NONE, "Ambient sounds' volume"); + ambient_fade = + Cvar_Get ("ambient_fade", "100", CVAR_NONE, + "How quickly ambient sounds fade in or out"); + snd_noextraupdate = + Cvar_Get ("snd_noextraupdate", "0", CVAR_NONE, + "Toggles the correct value display in host_speeds. Usually messes up sound playback when in effect"); + snd_show = + Cvar_Get ("snd_show", "0", CVAR_NONE, + "Toggles the display of sounds currently being played"); snd_interp = Cvar_Get ("snd_interp", "1", CVAR_ARCHIVE, "control sample interpolation"); - snd_phasesep = Cvar_Get ("snd_phasesep", "0.0", CVAR_ARCHIVE, "max stereo phase separation in ms. 0.6 is for 20cm head"); - snd_volumesep = Cvar_Get("snd_volumesep", "1.0", CVAR_ARCHIVE, "max stereo volume separation in ms. 1.0 is max"); - _snd_mixahead = Cvar_Get ("_snd_mixahead", "0.1", CVAR_ARCHIVE, "Delay time for sounds"); + snd_phasesep = + Cvar_Get ("snd_phasesep", "0.0", CVAR_ARCHIVE, + "max stereo phase separation in ms. 0.6 is for 20cm head"); + snd_volumesep = + Cvar_Get ("snd_volumesep", "1.0", CVAR_ARCHIVE, + "max stereo volume separation in ms. 1.0 is max"); + _snd_mixahead = + Cvar_Get ("_snd_mixahead", "0.1", CVAR_ARCHIVE, + "Delay time for sounds"); } @@ -428,7 +462,7 @@ SND_Spatialize (channel_t *ch) { vec_t dot; vec_t dist; - int phase; // in samples + int phase; // in samples vec_t lscale, rscale, scale; vec3_t source_vec; sfx_t *snd; @@ -605,7 +639,8 @@ S_ClearBuffer (void) clear = 0; #ifdef _WIN32 - if (pDSBuf) DSOUND_ClearBuffer(clear); + if (pDSBuf) + DSOUND_ClearBuffer (clear); else #endif { @@ -737,7 +772,8 @@ S_Update (vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) for (i = NUM_AMBIENTS; i < total_channels; i++, ch++) { if (!ch->sfx) continue; - ch->oldphase = ch->phase; // prepare to lerp from prev to next phase + ch->oldphase = ch->phase; // prepare to lerp from prev to next + // phase SND_Spatialize (ch); // respatialize channel if (!ch->leftvol && !ch->rightvol) continue; @@ -811,7 +847,7 @@ GetSoundtime (void) buffers++; // buffer wrapped if (paintedtime > 0x40000000) { // time to chop things off to avoid - // 32 bit limits + // 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds (true); @@ -861,7 +897,8 @@ S_Update_ (void) endtime = soundtime + samps; #ifdef _WIN32 - if(pDSBuf) DSOUND_Restore(); + if (pDSBuf) + DSOUND_Restore (); #endif S_PaintChannels (endtime); diff --git a/qw/source/snd_mem.c b/qw/source/snd_mem.c index e2c5acaab..0b78c4099 100644 --- a/qw/source/snd_mem.c +++ b/qw/source/snd_mem.c @@ -71,7 +71,8 @@ ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte * data) ob = sc->data; stepscale = (float) inrate / shm->speed; // this is usually 0.5, 1, or - // 2 + // + // 2 outcount = sc->length / stepscale; @@ -370,9 +371,9 @@ GetWavinfo (char *name, byte * wav, int wavlength) FindNextChunk ("LIST"); if (data_p) { if (!strncmp (data_p + 28, "mark", 4)) { // this is not a - // proper parse, but - // it works with - // cooledit... + // proper parse, but + // it works with + // cooledit... data_p += 24; i = GetLittleLong (); // samples in loop info.samples = info.loopstart + i; diff --git a/qw/source/snd_mix.c b/qw/source/snd_mix.c index c739ac7c1..4ec1ff84f 100644 --- a/qw/source/snd_mix.c +++ b/qw/source/snd_mix.c @@ -47,7 +47,9 @@ #define PAINTBUFFER_SIZE 512 portable_samplepair_t paintbuffer[PAINTBUFFER_SIZE * 2]; -int max_overpaint; // number of extra samples painted due to phase shift +int max_overpaint; // number of extra samples painted + + // due to phase shift int snd_scaletable[32][256]; int *snd_p, snd_linear_count, snd_vol; short *snd_out; @@ -94,14 +96,13 @@ S_TransferStereo16 (int endtime) lpaintedtime = paintedtime; #ifdef _WIN32 - if (pDSBuf) { - pbuf=DSOUND_LockBuffer(true); - if(!pbuf) { - Con_Printf("DSOUND_LockBuffer fails!\n"); - return; - } - } - else + if (pDSBuf) { + pbuf = DSOUND_LockBuffer (true); + if (!pbuf) { + Con_Printf ("DSOUND_LockBuffer fails!\n"); + return; + } + } else #endif { pbuf = (DWORD *) shm->buffer; @@ -127,7 +128,8 @@ S_TransferStereo16 (int endtime) } #ifdef _WIN32 - if (pDSBuf) DSOUND_LockBuffer(false); + if (pDSBuf) + DSOUND_LockBuffer (false); #endif } @@ -156,14 +158,13 @@ S_TransferPaintBuffer (int endtime) snd_vol = volume->value * 256; #ifdef _WIN32 - if (pDSBuf) { - pbuf=DSOUND_LockBuffer(true); - if(!pbuf) { - Con_Printf("DSOUND_LockBuffer fails!\n"); - return; - } - } - else + if (pDSBuf) { + pbuf = DSOUND_LockBuffer (true); + if (!pbuf) { + Con_Printf ("DSOUND_LockBuffer fails!\n"); + return; + } + } else #endif { pbuf = (DWORD *) shm->buffer; @@ -197,7 +198,8 @@ S_TransferPaintBuffer (int endtime) } } #ifdef _WIN32 - if (pDSBuf) DSOUND_LockBuffer(false); + if (pDSBuf) + DSOUND_LockBuffer (false); #endif } @@ -225,8 +227,8 @@ S_PaintChannels (int endtime) end = paintedtime + PAINTBUFFER_SIZE; // clear the paint buffer -// memset (paintbuffer, 0, -// (end - paintedtime) * sizeof (portable_samplepair_t)); +// memset (paintbuffer, 0, +// (end - paintedtime) * sizeof (portable_samplepair_t)); max_overpaint = 0; // paint in the channels. @@ -274,9 +276,9 @@ S_PaintChannels (int endtime) S_TransferPaintBuffer (end); memmove (paintbuffer, paintbuffer + end - paintedtime, - max_overpaint * sizeof (paintbuffer[0])); + max_overpaint * sizeof (paintbuffer[0])); memset (paintbuffer + max_overpaint, 0, sizeof (paintbuffer) - - max_overpaint * sizeof (paintbuffer[0])); + - max_overpaint * sizeof (paintbuffer[0])); paintedtime = end; } @@ -331,14 +333,14 @@ SND_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int count) int left, right; int leftvol, rightvol; signed short *sfx; - unsigned int i = 0; - unsigned int left_phase, right_phase; // Never allowed < 0 anyway + unsigned int i = 0; + unsigned int left_phase, right_phase; // Never allowed < 0 anyway leftvol = ch->leftvol; rightvol = ch->rightvol; max_overpaint = max (abs (ch->phase), - max (abs (ch->oldphase), max_overpaint)); + max (abs (ch->oldphase), max_overpaint)); sfx = (signed short *) sc->data + ch->pos; ch->pos += count; @@ -352,9 +354,9 @@ SND_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int count) } if (ch->oldphase != ch->phase) { - unsigned int old_phase_left, old_phase_right; - unsigned int new_phase_left, new_phase_right; - unsigned int count_left, count_right, c; + unsigned int old_phase_left, old_phase_right; + unsigned int new_phase_left, new_phase_right; + unsigned int count_left, count_right, c; if (ch->oldphase >= 0) { old_phase_left = ch->oldphase; @@ -364,7 +366,7 @@ SND_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int count) old_phase_right = -ch->oldphase; } new_phase_left = left_phase; - new_phase_right = right_phase; + new_phase_right = right_phase; if (new_phase_left > old_phase_left) count_left = 2 * (new_phase_left - old_phase_left); @@ -379,9 +381,9 @@ SND_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int count) c = min (count, max (count_right, count_left)); count -= c; while (c) { - int data = sfx[i]; - int left = (data * leftvol) >> 8; - int right = (data * rightvol) >> 8; + int data = sfx[i]; + int left = (data * leftvol) >> 8; + int right = (data * rightvol) >> 8; if (new_phase_left < old_phase_left) { if (!(count_left & 1)) { diff --git a/qw/source/snd_null.c b/qw/source/snd_null.c index 79d19984b..45f533e19 100644 --- a/qw/source/snd_null.c +++ b/qw/source/snd_null.c @@ -57,7 +57,8 @@ void S_Init_Cvars (void) { volume = Cvar_Get ("volume", "0.7", CVAR_ARCHIVE, "Volume level of sounds"); - loadas8bit = Cvar_Get ("loadas8bit", "0", CVAR_NONE, "Load samples as 8-bit"); + loadas8bit = + Cvar_Get ("loadas8bit", "0", CVAR_NONE, "Load samples as 8-bit"); bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, "CD music volume"); } diff --git a/qw/source/snd_oss.c b/qw/source/snd_oss.c index 61e80dfad..8387a93af 100644 --- a/qw/source/snd_oss.c +++ b/qw/source/snd_oss.c @@ -64,8 +64,9 @@ # define MAP_FAILED ((void *) -1) #endif -int audio_fd; -int snd_inited; +static int audio_fd; +static int snd_inited; +static char *snd_dev; static int tryrates[] = { 11025, 22050, 22051, 44100, 8000 }; @@ -76,38 +77,40 @@ SNDDMA_Init (void) int fmt; int tmp; int i; - char *s; struct audio_buf_info info; int caps; int retries = 3; snd_inited = 0; - // open /dev/dsp, confirm capability to mmap, and get size of dma buffer - audio_fd = open ("/dev/dsp", O_RDWR); + // open snd_dev, confirm capability to mmap, and get size of dma buffer + if (snd_device->string[0]) + snd_dev = snd_device->string; + + audio_fd = open (snd_dev, O_RDWR); if (audio_fd < 0) { // Failed open, retry up to 3 times - // if it's busy + // if it's busy while ((audio_fd < 0) && retries-- && ((errno == EAGAIN) || (errno == EBUSY))) { sleep (1); - audio_fd = open ("/dev/dsp", O_RDWR); + audio_fd = open (snd_dev, O_RDWR); } if (audio_fd < 0) { - perror ("/dev/dsp"); - Con_Printf ("Could not open /dev/dsp\n"); + perror (snd_dev); + Con_Printf ("Could not open %s\n", snd_dev); return 0; } } if ((rc = ioctl (audio_fd, SNDCTL_DSP_RESET, 0)) < 0) { - perror ("/dev/dsp"); - Con_Printf ("Could not reset /dev/dsp\n"); + perror (snd_dev); + Con_Printf ("Could not reset %s\n", snd_dev); close (audio_fd); return 0; } if (ioctl (audio_fd, SNDCTL_DSP_GETCAPS, &caps) == -1) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Sound driver too old\n"); close (audio_fd); return 0; @@ -130,13 +133,7 @@ SNDDMA_Init (void) shm->splitbuffer = 0; // set sample bits & speed - if ((i = COM_CheckParm ("-sndbits"))) { - shm->samplebits = atoi (com_argv[i + 1]); - } else { - if ((s = getenv ("QF_SND_BITS"))) { - shm->samplebits = atoi (s); - } - } + shm->samplebits = snd_bits->int_val; if (shm->samplebits != 16 && shm->samplebits != 8) { ioctl (audio_fd, SNDCTL_DSP_GETFMTS, &fmt); @@ -150,10 +147,8 @@ SNDDMA_Init (void) } } - if ((i = COM_CheckParm ("-sndspeed"))) { - shm->speed = atoi (com_argv[i + 1]); - } else if ((s = getenv ("QF_SND_SPEED"))) { - shm->speed = atoi (s); + if (snd_rate->int_val) { + shm->speed = snd_rate->int_val; } else { for (i = 0; i < (sizeof (tryrates) / 4); i++) if (!ioctl (audio_fd, SNDCTL_DSP_SPEED, &tryrates[i])) @@ -161,12 +156,8 @@ SNDDMA_Init (void) shm->speed = tryrates[i]; } - if ((i = COM_CheckParm ("-sndmono"))) { + if (!snd_stereo->int_val) { shm->channels = 1; - } else if ((i = COM_CheckParm ("-sndstereo"))) { - shm->channels = 2; - } else if ((s = getenv ("QF_SND_CHANNELS"))) { - shm->channels = atoi (s); } else { shm->channels = 2; } @@ -181,8 +172,8 @@ SNDDMA_Init (void) MAP_FILE | MAP_SHARED, audio_fd, 0); if (shm->buffer == MAP_FAILED) { - perror ("/dev/dsp"); - Con_Printf ("Could not mmap /dev/dsp\n"); + perror (snd_dev); + Con_Printf ("Could not mmap %s\n", snd_dev); close (audio_fd); return 0; } @@ -192,8 +183,8 @@ SNDDMA_Init (void) tmp = 1; rc = ioctl (audio_fd, SNDCTL_DSP_STEREO, &tmp); if (rc < 0) { - perror ("/dev/dsp"); - Con_Printf ("Could not set /dev/dsp to stereo=%d", shm->channels); + perror (snd_dev); + Con_Printf ("Could not set %s to stereo=%d", snd_dev, shm->channels); close (audio_fd); return 0; } @@ -205,8 +196,8 @@ SNDDMA_Init (void) rc = ioctl (audio_fd, SNDCTL_DSP_SPEED, &shm->speed); if (rc < 0) { - perror ("/dev/dsp"); - Con_Printf ("Could not set /dev/dsp speed to %d", shm->speed); + perror (snd_dev); + Con_Printf ("Could not set %s speed to %d", snd_dev, shm->speed); close (audio_fd); return 0; } @@ -215,7 +206,7 @@ SNDDMA_Init (void) rc = AFMT_S16_LE; rc = ioctl (audio_fd, SNDCTL_DSP_SETFMT, &rc); if (rc < 0) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Could not support 16-bit data. Try 8-bit.\n"); close (audio_fd); return 0; @@ -224,13 +215,13 @@ SNDDMA_Init (void) rc = AFMT_U8; rc = ioctl (audio_fd, SNDCTL_DSP_SETFMT, &rc); if (rc < 0) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Could not support 8-bit data.\n"); close (audio_fd); return 0; } } else { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("%d-bit sound not supported.", shm->samplebits); close (audio_fd); return 0; @@ -241,7 +232,7 @@ SNDDMA_Init (void) tmp = 0; rc = ioctl (audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp); if (rc < 0) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Could not toggle.\n"); close (audio_fd); return 0; @@ -249,7 +240,7 @@ SNDDMA_Init (void) tmp = PCM_ENABLE_OUTPUT; rc = ioctl (audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp); if (rc < 0) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Could not toggle.\n"); close (audio_fd); return 0; @@ -272,7 +263,7 @@ SNDDMA_GetDMAPos (void) return 0; if (ioctl (audio_fd, SNDCTL_DSP_GETOPTR, &count) == -1) { - perror ("/dev/dsp"); + perror (snd_dev); Con_Printf ("Uh, sound dead.\n"); close (audio_fd); snd_inited = 0; diff --git a/qw/source/snd_sun.c b/qw/source/snd_sun.c index c3c2bff81..0d8e11193 100644 --- a/qw/source/snd_sun.c +++ b/qw/source/snd_sun.c @@ -30,7 +30,7 @@ #ifdef HAVE_CONFIG_H # include "config.h" -#endif +#endif #ifdef HAVE_UNISTD_H # include #endif diff --git a/qw/source/snd_win.c b/qw/source/snd_win.c index 42f136547..b91798a71 100644 --- a/qw/source/snd_win.c +++ b/qw/source/snd_win.c @@ -40,7 +40,8 @@ #define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c) HRESULT (WINAPI * pDirectSoundCreate) (GUID FAR * lpGUID, - LPDIRECTSOUND FAR * lplpDS,IUnknown FAR * pUnkOuter); + LPDIRECTSOUND FAR * lplpDS, + IUnknown FAR * pUnkOuter); // 64K is > 1 second at 16-bit, 22050 Hz #define WAV_BUFFERS 64 @@ -181,8 +182,7 @@ FreeSound (void) Direct-Sound support */ -sndinitstat -SNDDMA_InitDirect (void) +sndinitstat SNDDMA_InitDirect (void) { DSBUFFERDESC dsbuf; DSBCAPS dsbcaps; @@ -269,9 +269,10 @@ SNDDMA_InitDirect (void) if (DS_OK == IDirectSound_CreateSoundBuffer (pDS, &dsbuf, &pDSPBuf, NULL)) { pformat = format; - + if (DS_OK != IDirectSoundBuffer_SetFormat (pDSPBuf, &pformat)) { - } else primary_format_set = true; + } else + primary_format_set = true; } } @@ -305,7 +306,7 @@ SNDDMA_InitDirect (void) } else { if (DS_OK != IDirectSound_SetCooperativeLevel (pDS, mainwindow, - DSSCL_WRITEPRIMARY)) { + DSSCL_WRITEPRIMARY)) { Con_Printf ("Set coop level failed\n"); FreeSound (); return SIS_FAILURE; @@ -328,7 +329,8 @@ SNDDMA_InitDirect (void) reps = 0; while ((hresult = IDirectSoundBuffer_Lock (pDSBuf, 0, gSndBufSize, - (LPVOID *) & lpData, &dwSize, NULL,NULL, 0)) != DS_OK) { + (LPVOID *) & lpData, &dwSize, + NULL, NULL, 0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Con_Printf ("SNDDMA_InitDirect: DS::Lock Sound Buffer Failed\n"); FreeSound (); @@ -354,7 +356,7 @@ SNDDMA_InitDirect (void) IDirectSoundBuffer_Stop (pDSBuf); IDirectSoundBuffer_GetCurrentPosition (pDSBuf, &mmstarttime.u.sample, - &dwWrite); + &dwWrite); IDirectSoundBuffer_Play (pDSBuf, 0, 0, DSBPLAY_LOOPING); shm->soundalive = true; @@ -403,7 +405,8 @@ SNDDMA_InitWav (void) /* Open a waveform device for output using window callback. */ while ((hr = waveOutOpen ((LPHWAVEOUT) & hWaveOut, WAVE_MAPPER, - &format,0, 0L, CALLBACK_NULL)) != MMSYSERR_NOERROR) { + &format, 0, 0L, + CALLBACK_NULL)) != MMSYSERR_NOERROR) { if (hr != MMSYSERR_ALLOCATED) { Con_Printf ("waveOutOpen failed\n"); return false; @@ -501,7 +504,7 @@ SNDDMA_Init (void) dsound_init = wav_init = 0; stat = SIS_FAILURE; // assume DirectSound won't - // initialize + // initialize /* Init DirectSound */ if (!wavonly) { @@ -565,7 +568,8 @@ SNDDMA_GetDMAPos (void) if (dsound_init) { mmtime.wType = TIME_SAMPLES; - IDirectSoundBuffer_GetCurrentPosition (pDSBuf, &mmtime.u.sample, &dwWrite); + IDirectSoundBuffer_GetCurrentPosition (pDSBuf, &mmtime.u.sample, + &dwWrite); s = mmtime.u.sample - mmstarttime.u.sample; } else if (wav_init) { s = snd_sent * WAV_BUFFER_SIZE; @@ -642,16 +646,16 @@ SNDDMA_Shutdown (void) FreeSound (); } -DWORD * -DSOUND_LockBuffer(qboolean lockit) +DWORD * +DSOUND_LockBuffer (qboolean lockit) { int reps; - static DWORD dwSize; - static DWORD dwSize2; - static DWORD *pbuf1; - static DWORD *pbuf2; - HRESULT hresult; + static DWORD dwSize; + static DWORD dwSize2; + static DWORD *pbuf1; + static DWORD *pbuf2; + HRESULT hresult; if (!pDSBuf) return NULL; @@ -659,8 +663,9 @@ DSOUND_LockBuffer(qboolean lockit) if (lockit) { reps = 0; while ((hresult = IDirectSoundBuffer_Lock (pDSBuf, 0, gSndBufSize, - (LPVOID *) & pbuf1, &dwSize, - (LPVOID *) & pbuf2, &dwSize2,0)) != DS_OK) { + (LPVOID *) & pbuf1, &dwSize, + (LPVOID *) & pbuf2, &dwSize2, + 0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Con_Printf ("S_TransferStereo16: DS::Lock Sound Buffer Failed\n"); @@ -679,33 +684,36 @@ DSOUND_LockBuffer(qboolean lockit) } } else { IDirectSoundBuffer_Unlock (pDSBuf, pbuf1, dwSize, NULL, 0); - pbuf1=NULL; - pbuf2=NULL; - dwSize=0; - dwSize2=0; + pbuf1 = NULL; + pbuf2 = NULL; + dwSize = 0; + dwSize2 = 0; } - return(pbuf1); + return (pbuf1); } -void DSOUND_ClearBuffer(int clear) +void +DSOUND_ClearBuffer (int clear) { - DWORD *pData; + DWORD *pData; // FIXME: this should be called with 2nd pbuf2 = NULL, dwsize =0 - pData=DSOUND_LockBuffer(true); + pData = DSOUND_LockBuffer (true); memset (pData, clear, shm->samples * shm->samplebits / 8); - DSOUND_LockBuffer(false); + DSOUND_LockBuffer (false); } -void DSOUND_Restore(void) +void +DSOUND_Restore (void) { // if the buffer was lost or stopped, restore it and/or restart it - DWORD dwStatus; + DWORD dwStatus; - if (!pDSBuf) return; + if (!pDSBuf) + return; if (IDirectSoundBuffer_GetStatus (pDSBuf, &dwStatus) != DD_OK) - Con_Printf ("Couldn't get sound buffer status\n"); + Con_Printf ("Couldn't get sound buffer status\n"); if (dwStatus & DSBSTATUS_BUFFERLOST) IDirectSoundBuffer_Restore (pDSBuf); @@ -713,6 +721,5 @@ void DSOUND_Restore(void) if (!(dwStatus & DSBSTATUS_PLAYING)) IDirectSoundBuffer_Play (pDSBuf, 0, 0, DSBPLAY_LOOPING); - return; + return; } -