aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/client/SND_DMA.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jake2/client/SND_DMA.java')
-rw-r--r--src/jake2/client/SND_DMA.java1218
1 files changed, 0 insertions, 1218 deletions
diff --git a/src/jake2/client/SND_DMA.java b/src/jake2/client/SND_DMA.java
deleted file mode 100644
index 0409e8b..0000000
--- a/src/jake2/client/SND_DMA.java
+++ /dev/null
@@ -1,1218 +0,0 @@
-/*
- * S_DMA.java
- * Copyright (C) 2004
- *
- * $Id: SND_DMA.java,v 1.3 2004-07-08 20:24:29 hzi Exp $
- */
-/*
-Copyright (C) 1997-2001 Id Software, Inc.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-// Created on 26.01.2004 by RST.
-
-package jake2.client;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Arrays;
-
-import jake2.game.*;
-import jake2.game.Cmd;
-import jake2.game.cvar_t;
-import jake2.qcommon.*;
-import jake2.util.Vargs;
-
-
-
-/**
- * SND_DMA
- * TODO implement sound system
- */
-public class SND_DMA extends SND_MIX {
-//// snd_dma.c -- main control for any streaming sound output device
-//
-// #include "client.h"
-// #include "snd_loc.h"
-//
-// void S_Play(void);
-// void S_SoundList(void);
-// void S_Update_();
-// void S_StopAllSounds(void);
-//
-//
-//// =======================================================================
-//// Internal sound data & structures
-//// =======================================================================
-//
-//// only begin attenuating sound volumes when outside the FULLVOLUME range
-// #define SOUND_FULLVOLUME 80
-//
-// #define SOUND_LOOPATTENUATE 0.003
-//
- static int s_registration_sequence;
-//
- static channel_t[] channels = new channel_t[MAX_CHANNELS];
- static {
- for(int i=0; i < MAX_CHANNELS; i++)
- channels[i] = new channel_t();
- }
-//
-// qboolean snd_initialized = false;
- static boolean sound_started = false;
-
- static float[] listener_origin = {0, 0, 0};
- static float[] listener_forward = {0, 0, 0};
- static float[] listener_right = {0, 0, 0};
- static float[] listener_up = {0, 0, 0};
-
- static boolean s_registering;
-
- static int soundtime; // sample PAIRS
- static int paintedtime; // sample PAIRS
-//
-//// during registration it is possible to have more sounds
-//// than could actually be referenced during gameplay,
-//// because we don't want to free anything until we are
-//// sure we won't need it.
- static final int MAX_SFX = (MAX_SOUNDS*2);
- static sfx_t[] known_sfx = new sfx_t[MAX_SFX];
- static {
- for (int i = 0; i< known_sfx.length; i++)
- known_sfx[i] = new sfx_t();
- }
- static int num_sfx;
-//
- static final int MAX_PLAYSOUNDS = 128;
- static playsound_t[] s_playsounds = new playsound_t[MAX_PLAYSOUNDS];
- static {
- for( int i = 0; i < MAX_PLAYSOUNDS; i++) {
- s_playsounds[i] = new playsound_t();
- }
- }
- static playsound_t s_freeplays = new playsound_t();
- static playsound_t s_pendingplays = new playsound_t();
-
- static int s_beginofs;
-
- static cvar_t s_testsound;
- static cvar_t s_loadas8bit;
- static cvar_t s_khz;
- static cvar_t s_show;
- static cvar_t s_mixahead;
- static cvar_t s_primary;
-//
-//
-// int s_rawend;
-// portable_samplepair_t s_rawsamples[MAX_RAW_SAMPLES];
-//
-//
-// ====================================================================
-// User-setable variables
-// ====================================================================
-
-
- static void SoundInfo_f() {
- if (!sound_started) {
- Com.Printf("sound system not started\n");
- return;
- }
-
- Com.Printf("%5d stereo\n", new Vargs(1).add(dma.channels - 1));
- Com.Printf("%5d samples\n", new Vargs(1).add(dma.samples));
- Com.Printf("%5d samplepos\n", new Vargs(1).add(dma.samplepos));
- Com.Printf("%5d samplebits\n", new Vargs(1).add(dma.samplebits));
- Com.Printf("%5d submission_chunk\n", new Vargs(1).add(dma.submission_chunk));
- Com.Printf("%5d speed\n", new Vargs(1).add(dma.speed));
- }
-
- /*
- ================
- S_Init
- ================
- */
- public static void Init() {
- cvar_t cv;
-
- Com.Printf("\n------- sound initialization -------\n");
-
- cv = Cvar.Get("s_initsound", "0", 0);
- if (cv.value == 0.0f)
- Com.Printf("not initializing.\n");
- else {
- s_volume = Cvar.Get("s_volume", "0.7", CVAR_ARCHIVE);
- s_khz = Cvar.Get("s_khz", "11", CVAR_ARCHIVE);
- s_loadas8bit = Cvar.Get("s_loadas8bit", "1", CVAR_ARCHIVE);
- s_mixahead = Cvar.Get("s_mixahead", "0.2", CVAR_ARCHIVE);
- s_show = Cvar.Get("s_show", "0", 0);
- s_testsound = Cvar.Get("s_testsound", "0", 0);
- s_primary = Cvar.Get("s_primary", "0", CVAR_ARCHIVE); // win32 specific
-
- Cmd.AddCommand("play", new xcommand_t() {
- public void execute() {
- S.Play();
- }
- });
- Cmd.AddCommand("stopsound", new xcommand_t() {
- public void execute() {
- S.StopAllSounds();
- }
- });
- Cmd.AddCommand("soundlist", new xcommand_t() {
- public void execute() {
- S.SoundList();
- }
- });
- Cmd.AddCommand("soundinfo", new xcommand_t() {
- public void execute() {
- S.SoundInfo_f();
- }
- });
-
- if (!SNDDMA_Init())
- return;
-
- S.InitScaletable();
-
- sound_started = true;
- num_sfx = 0;
-
- soundtime = 0;
- paintedtime = 0;
-
- Com.Printf("sound sampling rate: " + dma.speed + "\n");
-
- S.StopAllSounds();
- }
-
- Com.Printf("------------------------------------\n");
- }
-
-
-// =======================================================================
-// Shutdown sound engine
-// =======================================================================
-
- static void Shutdown() {
- int i;
- sfx_t[] sfx;
-
- if (!sound_started)
- return;
-
- SNDDMA_Shutdown();
-
- sound_started = false;
-
- Cmd.RemoveCommand("play");
- Cmd.RemoveCommand("stopsound");
- Cmd.RemoveCommand("soundlist");
- Cmd.RemoveCommand("soundinfo");
-
- // free all sounds
- for (i = 0, sfx = known_sfx; i < num_sfx; i++) {
- if (sfx[i].name == null)
- continue;
-
- //memset (sfx, 0, sizeof(*sfx));
- sfx[i].clear();
- }
-
- num_sfx = 0;
- }
-
-// =======================================================================
-// Load a sound
-// =======================================================================
-
- /*
- ==================
- S_FindName
-
- ==================
- */
- static sfx_t FindName(String name, boolean create) {
- int i;
- sfx_t sfx = null;
-
- if (name == null)
- Com.Error(ERR_FATAL, "S_FindName: NULL\n");
- if (name.length() == 0)
- Com.Error(ERR_FATAL, "S_FindName: empty name\n");
-
- if (name.length() >= MAX_QPATH)
- Com.Error(ERR_FATAL, "Sound name too long: " + name);
-
- // see if already loaded
- for (i = 0; i < num_sfx; i++)
- if (name.equals(known_sfx[i].name)) {
- return known_sfx[i];
- }
-
- if (!create)
- return null;
-
- // find a free sfx
- for (i = 0; i < num_sfx; i++)
- if (known_sfx[i].name == null)
- // registration_sequence < s_registration_sequence)
- break;
-
- if (i == num_sfx) {
- if (num_sfx == MAX_SFX)
- Com.Error(ERR_FATAL, "S_FindName: out of sfx_t");
- num_sfx++;
- }
-
- sfx = known_sfx[i];
- //memset (sfx, 0, sizeof(*sfx));
- sfx.clear();
- sfx.name = name;
- sfx.registration_sequence = s_registration_sequence;
-
- return sfx;
- }
-//
-//
- /*
- ==================
- S_AliasName
-
- ==================
- */
- static sfx_t AliasName(String aliasname, String truename)
- {
- sfx_t sfx = null;
-// char *s;
-// int i;
-//
-// s = Z_Malloc (MAX_QPATH);
-// strcpy (s, truename);
-//
-// // find a free sfx
-// for (i=0 ; i < num_sfx ; i++)
-// if (!known_sfx[i].name[0])
-// break;
-//
-// if (i == num_sfx)
-// {
-// if (num_sfx == MAX_SFX)
-// Com_Error (ERR_FATAL, "S_FindName: out of sfx_t");
-// num_sfx++;
-// }
-//
-// sfx = &known_sfx[i];
-// memset (sfx, 0, sizeof(*sfx));
-// strcpy (sfx->name, aliasname);
-// sfx->registration_sequence = s_registration_sequence;
-// sfx->truename = s;
-//
- return sfx;
- }
-
-
- /*
- =====================
- S_BeginRegistration
-
- =====================
- */
- static void BeginRegistration() {
- s_registration_sequence++;
- s_registering = true;
- }
-
- /*
- ==================
- S_RegisterSound
-
- ==================
- */
- static sfx_t RegisterSound(String name) {
- sfx_t sfx = null;
-
- if (!sound_started)
- return null;
-
- sfx = S.FindName(name, true);
- sfx.registration_sequence = s_registration_sequence;
-
- if (!s_registering)
- S.LoadSound(sfx);
-
- return sfx;
- }
-
-
- /*
- =====================
- S_EndRegistration
-
- =====================
- */
- static void EndRegistration() {
- int i;
- sfx_t sfx;
- int size;
-
- // free any sounds not from this registration sequence
- for (i = 0; i < num_sfx; i++) {
- sfx = known_sfx[i];
- if (sfx.name == null)
- continue;
- if (sfx.registration_sequence != s_registration_sequence) { // don't need this sound
- //memset (sfx, 0, sizeof(*sfx));
- sfx.clear();
- } else {
- // make sure it is paged in
- // if (sfx->cache)
- // {
- // size = sfx->cache->length*sfx->cache->width;
- // Com_PageInMemory ((byte *)sfx->cache, size);
- // }
- }
-
- }
-
- // load everything in
- for (i = 0; i < num_sfx; i++) {
- sfx = known_sfx[i];
- if (sfx.name == null)
- continue;
- S.LoadSound(sfx);
- }
-
- s_registering = false;
- }
-//
-//
-//// =============================================================================
-//
-// /*
-// =================
-// S_PickChannel
-// =================
-// */
-// channel_t *S_PickChannel(int entnum, int entchannel)
-// {
-// int ch_idx;
-// int first_to_die;
-// int life_left;
-// channel_t *ch;
-//
-// if (entchannel<0)
-// Com_Error (ERR_DROP, "S_PickChannel: entchannel<0");
-//
-//// Check for replacement sound, or find the best one to replace
-// first_to_die = -1;
-// life_left = 0x7fffffff;
-// for (ch_idx=0 ; ch_idx < MAX_CHANNELS ; ch_idx++)
-// {
-// if (entchannel != 0 // channel 0 never overrides
-// && channels[ch_idx].entnum == entnum
-// && channels[ch_idx].entchannel == entchannel)
-// { // always override sound from same entity
-// first_to_die = ch_idx;
-// break;
-// }
-//
-// // don't let monster sounds override player sounds
-// if (channels[ch_idx].entnum == cl.playernum+1 && entnum != cl.playernum+1 && channels[ch_idx].sfx)
-// continue;
-//
-// if (channels[ch_idx].end - paintedtime < life_left)
-// {
-// life_left = channels[ch_idx].end - paintedtime;
-// first_to_die = ch_idx;
-// }
-// }
-//
-// if (first_to_die == -1)
-// return NULL;
-//
-// ch = &channels[first_to_die];
-// memset (ch, 0, sizeof(*ch));
-//
-// return ch;
-// }
-//
-// /*
-// =================
-// S_SpatializeOrigin
-//
-// Used for spatializing channels and autosounds
-// =================
-// */
-// void S_SpatializeOrigin (vec3_t origin, float master_vol, float dist_mult, int *left_vol, int *right_vol)
-// {
-// vec_t dot;
-// vec_t dist;
-// vec_t lscale, rscale, scale;
-// vec3_t source_vec;
-//
-// if (cls.state != ca_active)
-// {
-// *left_vol = *right_vol = 255;
-// return;
-// }
-//
-//// calculate stereo seperation and distance attenuation
-// VectorSubtract(origin, listener_origin, source_vec);
-//
-// dist = VectorNormalize(source_vec);
-// dist -= SOUND_FULLVOLUME;
-// if (dist < 0)
-// dist = 0; // close enough to be at full volume
-// dist *= dist_mult; // different attenuation levels
-//
-// dot = DotProduct(listener_right, source_vec);
-//
-// if (dma.channels == 1 || !dist_mult)
-// { // no attenuation = no spatialization
-// rscale = 1.0;
-// lscale = 1.0;
-// }
-// else
-// {
-// rscale = 0.5 * (1.0 + dot);
-// lscale = 0.5*(1.0 - dot);
-// }
-//
-// // add in distance effect
-// scale = (1.0 - dist) * rscale;
-// *right_vol = (int) (master_vol * scale);
-// if (*right_vol < 0)
-// *right_vol = 0;
-//
-// scale = (1.0 - dist) * lscale;
-// *left_vol = (int) (master_vol * scale);
-// if (*left_vol < 0)
-// *left_vol = 0;
-// }
-//
-// /*
-// =================
-// S_Spatialize
-// =================
-// */
- static void Spatialize(channel_t ch)
- {
-// vec3_t origin;
-//
-// // anything coming from the view entity will always be full volume
-// if (ch->entnum == cl.playernum+1)
-// {
-// ch->leftvol = ch->master_vol;
-// ch->rightvol = ch->master_vol;
-// return;
-// }
-//
-// if (ch->fixed_origin)
-// {
-// VectorCopy (ch->origin, origin);
-// }
-// else
-// CL_GetEntitySoundOrigin (ch->entnum, origin);
-//
-// S_SpatializeOrigin (origin, ch->master_vol, ch->dist_mult, &ch->leftvol, &ch->rightvol);
- }
-
- /*
- =================
- S_AllocPlaysound
- =================
- */
- static playsound_t AllocPlaysound ()
- {
- playsound_t ps;
-
- ps = s_freeplays.next;
- if (ps == s_freeplays)
- return null; // no free playsounds
-
- // unlink from freelist
- ps.prev.next = ps.next;
- ps.next.prev = ps.prev;
-
- return ps;
- }
-//
-//
-// /*
-// =================
-// S_FreePlaysound
-// =================
-// */
-// void S_FreePlaysound (playsound_t *ps)
-// {
-// // unlink from channel
-// ps->prev->next = ps->next;
-// ps->next->prev = ps->prev;
-//
-// // add to free list
-// ps->next = s_freeplays.next;
-// s_freeplays.next->prev = ps;
-// ps->prev = &s_freeplays;
-// s_freeplays.next = ps;
-// }
-//
-//
-//
-// /*
-// ===============
-// S_IssuePlaysound
-//
-// Take the next playsound and begin it on the channel
-// This is never called directly by S_Play*, but only
-// by the update loop.
-// ===============
-// */
-// void S_IssuePlaysound (playsound_t *ps)
-// {
-// channel_t *ch;
-// sfxcache_t *sc;
-//
-// if (s_show->value)
-// Com_Printf ("Issue %i\n", ps->begin);
-// // pick a channel to play on
-// ch = S_PickChannel(ps->entnum, ps->entchannel);
-// if (!ch)
-// {
-// S_FreePlaysound (ps);
-// return;
-// }
-//
-// // spatialize
-// if (ps->attenuation == ATTN_STATIC)
-// ch->dist_mult = ps->attenuation * 0.001;
-// else
-// ch->dist_mult = ps->attenuation * 0.0005;
-// ch->master_vol = ps->volume;
-// ch->entnum = ps->entnum;
-// ch->entchannel = ps->entchannel;
-// ch->sfx = ps->sfx;
-// VectorCopy (ps->origin, ch->origin);
-// ch->fixed_origin = ps->fixed_origin;
-//
-// S_Spatialize(ch);
-//
-// ch->pos = 0;
-// sc = S_LoadSound (ch->sfx);
-// ch->end = paintedtime + sc->length;
-//
-// // free the playsound
-// S_FreePlaysound (ps);
-// }
-
- static sfx_t RegisterSexedSound(entity_state_t ent, String base) {
- sfx_t sfx = null;
-
- // determine what model the client is using
- String model = "male";
- int n = CS_PLAYERSKINS + ent.number - 1;
- if (cl.configstrings[n] != null) {
- int p = cl.configstrings[n].indexOf('\\');
- if (p >= 0) {
- p++;
- model = cl.configstrings[n].substring(p);
- //strcpy(model, p);
- p = model.indexOf('/');
- if (p > 0)
- model = model.substring(0, p - 1);
- }
- }
- // if we can't figure it out, they're male
- if (model == null || model.length() == 0)
- model = "male";
-
- // see if we already know of the model specific sound
- String sexedFilename = "#players/" + model + "/" + base.substring(1);
- //Com_sprintf (sexedFilename, sizeof(sexedFilename), "#players/%s/%s", model, base+1);
- sfx = S.FindName(sexedFilename, false);
-
- if (sfx == null) {
- // no, so see if it exists
- RandomAccessFile f = null;
- try {
- f = FS.FOpenFile(sexedFilename.substring(1));
- } catch (IOException e) {}
- if (f != null) {
- // yes, close the file and register it
- try {
- FS.FCloseFile(f);
- } catch (IOException e1) {}
- sfx = S.RegisterSound(sexedFilename);
- } else {
- // no, revert to the male sound in the pak0.pak
- //Com_sprintf (maleFilename, sizeof(maleFilename), "player/%s/%s", "male", base+1);
- String maleFilename = "player/male/" + base.substring(1);
- sfx = S.AliasName(sexedFilename, maleFilename);
- }
- }
-
- return sfx;
- }
-
-
-// =======================================================================
-// Start a sound effect
-// =======================================================================
-
- /*
- ====================
- S_StartSound
-
- Validates the parms and ques the sound up
- if pos is NULL, the sound will be dynamically sourced from the entity
- Entchannel 0 will never override a playing sound
- ====================
- */
- static void StartSound(float[] origin, int entnum, int entchannel, sfx_t sfx, float fvol, float attenuation, float timeofs) {
-
- if (!sound_started)
- return;
-
- if (sfx == null)
- return;
-
- if (sfx.name.charAt(0) == '*')
- sfx = S.RegisterSexedSound(cl_entities[entnum].current, sfx.name);
-
- // make sure the sound is loaded
- sfxcache_t sc = S.LoadSound(sfx);
- if (sc == null)
- return; // couldn't load the sound's data
-
- int vol = (int) (fvol * 255);
-
- // make the playsound_t
- playsound_t ps = S.AllocPlaysound();
- if (ps == null)
- return;
-
- if (origin != null) {
- VectorCopy(origin, ps.origin);
- ps.fixed_origin = true;
- } else
- ps.fixed_origin = false;
-
- ps.entnum = entnum;
- ps.entchannel = entchannel;
- ps.attenuation = attenuation;
- ps.volume = vol;
- ps.sfx = sfx;
-
- // drift s_beginofs
- int start = (int) (cl.frame.servertime * 0.001f * dma.speed + s_beginofs);
- if (start < paintedtime) {
- start = paintedtime;
- s_beginofs = (int) (start - (cl.frame.servertime * 0.001f * dma.speed));
- } else if (start > paintedtime + 0.3f * dma.speed) {
- start = (int) (paintedtime + 0.1f * dma.speed);
- s_beginofs = (int) (start - (cl.frame.servertime * 0.001f * dma.speed));
- } else {
- s_beginofs -= 10;
- }
-
- if (timeofs == 0.0f)
- ps.begin = paintedtime;
- else
- ps.begin = (long) (start + timeofs * dma.speed);
-
- // sort into the pending sound list
- playsound_t sort;
- for (sort = s_pendingplays.next; sort != s_pendingplays && sort.begin < ps.begin; sort = sort.next);
-
- ps.next = sort;
- ps.prev = sort.prev;
-
- ps.next.prev = ps;
- ps.prev.next = ps;
- }
-
- /*
- ==================
- S_StartLocalSound
- ==================
- */
- static void StartLocalSound(String sound) {
- sfx_t sfx;
-
- if (!sound_started)
- return;
-
- sfx = S.RegisterSound(sound);
- if (sfx == null) {
- Com.Printf("S_StartLocalSound: can't cache " + sound + "\n");
- return;
- }
- S.StartSound(null, cl.playernum + 1, 0, sfx, 1, 1, 0);
- }
-
-
- /*
- ==================
- S_ClearBuffer
- ==================
- */
- static void ClearBuffer()
- {
- int clear;
-
- if (!sound_started)
- return;
-
- s_rawend = 0;
-
- if (dma.samplebits == 8)
- clear = 0x80;
- else
- clear = 0;
-
- SNDDMA_BeginPainting ();
- if (dma.buffer != null)
- //memset(dma.buffer, clear, dma.samples * dma.samplebits/8);
- Arrays.fill(dma.buffer, (byte)clear);
- SNDDMA_Submit ();
- }
-
- /*
- ==================
- S_StopAllSounds
- ==================
- */
- static void StopAllSounds()
- {
- int i;
-
- if (!sound_started)
- return;
-
- // clear all the playsounds
- //memset(s_playsounds, 0, sizeof(s_playsounds));
- s_freeplays.next = s_freeplays.prev = s_freeplays;
- s_pendingplays.next = s_pendingplays.prev = s_pendingplays;
-
- for (i=0 ; i<MAX_PLAYSOUNDS ; i++)
- {
- s_playsounds[i].clear();
- s_playsounds[i].prev = s_freeplays;
- s_playsounds[i].next = s_freeplays.next;
- s_playsounds[i].prev.next = s_playsounds[i];
- s_playsounds[i].next.prev = s_playsounds[i];
- }
-
- // clear all the channels
- //memset(channels, 0, sizeof(channels));
- for (i = 0; i < MAX_CHANNELS; i++)
- channels[i].clear();
-
- S.ClearBuffer();
- }
-//
- /*
- ==================
- S_AddLoopSounds
-
- Entities with a ->sound field will generated looped sounds
- that are automatically started, stopped, and merged together
- as the entities are sent to the client
- ==================
- */
- static void AddLoopSounds()
- {
-// int i, j;
-// int sounds[MAX_EDICTS];
-// int left, right, left_total, right_total;
-// channel_t *ch;
-// sfx_t *sfx;
-// sfxcache_t *sc;
-// int num;
-// entity_state_t *ent;
-//
-// if (cl_paused->value)
-// return;
-//
-// if (cls.state != ca_active)
-// return;
-//
-// if (!cl.sound_prepped)
-// return;
-//
-// for (i=0 ; i<cl.frame.num_entities ; i++)
-// {
-// num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
-// ent = &cl_parse_entities[num];
-// sounds[i] = ent->sound;
-// }
-//
-// for (i=0 ; i<cl.frame.num_entities ; i++)
-// {
-// if (!sounds[i])
-// continue;
-//
-// sfx = cl.sound_precache[sounds[i]];
-// if (!sfx)
-// continue; // bad sound effect
-// sc = sfx->cache;
-// if (!sc)
-// continue;
-//
-// num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
-// ent = &cl_parse_entities[num];
-//
-// // find the total contribution of all sounds of this type
-// S_SpatializeOrigin (ent->origin, 255.0, SOUND_LOOPATTENUATE,
-// &left_total, &right_total);
-// for (j=i+1 ; j<cl.frame.num_entities ; j++)
-// {
-// if (sounds[j] != sounds[i])
-// continue;
-// sounds[j] = 0; // don't check this again later
-//
-// num = (cl.frame.parse_entities + j)&(MAX_PARSE_ENTITIES-1);
-// ent = &cl_parse_entities[num];
-//
-// S_SpatializeOrigin (ent->origin, 255.0, SOUND_LOOPATTENUATE,
-// &left, &right);
-// left_total += left;
-// right_total += right;
-// }
-//
-// if (left_total == 0 && right_total == 0)
-// continue; // not audible
-//
-// // allocate a channel
-// ch = S_PickChannel(0, 0);
-// if (!ch)
-// return;
-//
-// if (left_total > 255)
-// left_total = 255;
-// if (right_total > 255)
-// right_total = 255;
-// ch->leftvol = left_total;
-// ch->rightvol = right_total;
-// ch->autosound = true; // remove next frame
-// ch->sfx = sfx;
-// ch->pos = paintedtime % sc->length;
-// ch->end = paintedtime + sc->length - ch->pos;
-// }
- }
-//
-//// =============================================================================
-//
-// /*
-// ============
-// S_RawSamples
-//
-// Cinematic streaming and voice over network
-// ============
-// */
-// void S_RawSamples (int samples, int rate, int width, int channels, byte *data)
-// {
-// int i;
-// int src, dst;
-// float scale;
-//
-// if (!sound_started)
-// return;
-//
-// if (s_rawend < paintedtime)
-// s_rawend = paintedtime;
-// scale = (float)rate / dma.speed;
-//
-//// Com_Printf ("%i < %i < %i\n", soundtime, paintedtime, s_rawend);
-// if (channels == 2 && width == 2)
-// {
-// if (scale == 1.0)
-// { // optimized case
-// for (i=0 ; i<samples ; i++)
-// {
-// dst = s_rawend&(MAX_RAW_SAMPLES-1);
-// s_rawend++;
-// s_rawsamples[dst].left =
-// LittleShort(((short *)data)[i*2]) << 8;
-// s_rawsamples[dst].right =
-// LittleShort(((short *)data)[i*2+1]) << 8;
-// }
-// }
-// else
-// {
-// for (i=0 ; ; i++)
-// {
-// src = i*scale;
-// if (src >= samples)
-// break;
-// dst = s_rawend&(MAX_RAW_SAMPLES-1);
-// s_rawend++;
-// s_rawsamples[dst].left =
-// LittleShort(((short *)data)[src*2]) << 8;
-// s_rawsamples[dst].right =
-// LittleShort(((short *)data)[src*2+1]) << 8;
-// }
-// }
-// }
-// else if (channels == 1 && width == 2)
-// {
-// for (i=0 ; ; i++)
-// {
-// src = i*scale;
-// if (src >= samples)
-// break;
-// dst = s_rawend&(MAX_RAW_SAMPLES-1);
-// s_rawend++;
-// s_rawsamples[dst].left =
-// LittleShort(((short *)data)[src]) << 8;
-// s_rawsamples[dst].right =
-// LittleShort(((short *)data)[src]) << 8;
-// }
-// }
-// else if (channels == 2 && width == 1)
-// {
-// for (i=0 ; ; i++)
-// {
-// src = i*scale;
-// if (src >= samples)
-// break;
-// dst = s_rawend&(MAX_RAW_SAMPLES-1);
-// s_rawend++;
-// s_rawsamples[dst].left =
-// ((char *)data)[src*2] << 16;
-// s_rawsamples[dst].right =
-// ((char *)data)[src*2+1] << 16;
-// }
-// }
-// else if (channels == 1 && width == 1)
-// {
-// for (i=0 ; ; i++)
-// {
-// src = i*scale;
-// if (src >= samples)
-// break;
-// dst = s_rawend&(MAX_RAW_SAMPLES-1);
-// s_rawend++;
-// s_rawsamples[dst].left =
-// (((byte *)data)[src]-128) << 16;
-// s_rawsamples[dst].right = (((byte *)data)[src]-128) << 16;
-// }
-// }
-// }
-//
-//// =============================================================================
-
- /*
- ============
- S_Update
-
- Called once each time through the main loop
- ============
- */
- static void Update(float[] origin, float[] forward, float[] right, float[] up) {
-
- if (!sound_started)
- return;
-
- // if the laoding plaque is up, clear everything
- // out to make sure we aren't looping a dirty
- // dma buffer while loading
- if (cls.disable_screen != 0.0f) {
- S.ClearBuffer();
- return;
- }
-
- // rebuild scale tables if volume is modified
- if (s_volume.modified)
- S.InitScaletable();
-
- VectorCopy(origin, listener_origin);
- VectorCopy(forward, listener_forward);
- VectorCopy(right, listener_right);
- VectorCopy(up, listener_up);
-
- channel_t combine = null;
-
- // update spatialization for dynamic sounds
- channel_t ch;
- for (int i = 0; i < MAX_CHANNELS; i++) {
- ch = channels[i];
- if (ch.sfx == null)
- continue;
- if (ch.autosound) { // autosounds are regenerated fresh each frame
- //memset (ch, 0, sizeof(*ch));
- ch.clear();
- continue;
- }
- S.Spatialize(ch); // respatialize channel
- if (ch.leftvol == 0 && ch.rightvol == 0) {
- //memset (ch, 0, sizeof(*ch));
- ch.clear();
- continue;
- }
- }
-
- // add loopsounds
- S.AddLoopSounds();
-
- //
- // debugging output
- //
- if (s_show.value != 0.0f) {
- int total = 0;
-
- for (int i = 0; i < MAX_CHANNELS; i++) {
- ch = channels[i];
- if (ch.sfx != null && (ch.leftvol != 0 || ch.rightvol != 0)) {
- Com.Printf(ch.leftvol + " " + ch.rightvol + " " + ch.sfx.name + "\n");
- total++;
- }
- }
-
- Com.Printf("----(" + total + ")---- painted: " + paintedtime + "\n");
- }
-
- // mix some sound
- S.Update_();
- }
-
-//
-// void GetSoundtime(void)
-// {
-// int samplepos;
-// static int buffers;
-// static int oldsamplepos;
-// int fullsamples;
-//
-// fullsamples = dma.samples / dma.channels;
-//
-//// it is possible to miscount buffers if it has wrapped twice between
-//// calls to S_Update. Oh well.
-// samplepos = SNDDMA_GetDMAPos();
-//
-// if (samplepos < oldsamplepos)
-// {
-// buffers++; // buffer wrapped
-//
-// if (paintedtime > 0x40000000)
-// { // time to chop things off to avoid 32 bit limits
-// buffers = 0;
-// paintedtime = fullsamples;
-// S_StopAllSounds ();
-// }
-// }
-// oldsamplepos = samplepos;
-//
-// soundtime = buffers*fullsamples + samplepos/dma.channels;
-// }
-//
-//
- static void Update_()
- {
-// unsigned endtime;
-// int samps;
-//
-// if (!sound_started)
-// return;
-//
-// SNDDMA_BeginPainting ();
-//
-// if (!dma.buffer)
-// return;
-//
-//// Updates DMA time
-// GetSoundtime();
-//
-//// check to make sure that we haven't overshot
-// if (paintedtime < soundtime)
-// {
-// Com_DPrintf ("S_Update_ : overflow\n");
-// paintedtime = soundtime;
-// }
-//
-//// mix ahead of current position
-// endtime = soundtime + s_mixahead->value * dma.speed;
-//// endtime = (soundtime + 4096) & ~4095;
-//
-// // mix to an even submission block size
-// endtime = (endtime + dma.submission_chunk-1)
-// & ~(dma.submission_chunk-1);
-// samps = dma.samples >> (dma.channels-1);
-// if (endtime - soundtime > samps)
-// endtime = soundtime + samps;
-//
-// S_PaintChannels (endtime);
-//
-// SNDDMA_Submit ();
- }
-
- /*
- ===============================================================================
-
- console functions
-
- ===============================================================================
- */
-
- static void Play() {
- int i;
- String name;
- sfx_t sfx;
-
- i = 1;
- while (i < Cmd.Argc()) {
- name = new String(Cmd.Argv(i));
- if (name.indexOf('.') == -1)
- name += ".wav";
-
- sfx = S.RegisterSound(name);
- S.StartSound(null, cl.playernum + 1, 0, sfx, 1.0f, 1.0f, 0.0f);
- i++;
- }
- }
-
- static void SoundList() {
- int i;
- sfx_t sfx;
- sfxcache_t sc;
- int size, total;
-
- total = 0;
- for (i = 0; i < num_sfx; i++) {
- sfx = known_sfx[i];
- if (sfx.registration_sequence == 0)
- continue;
- sc = sfx.cache;
- if (sc != null) {
- size = sc.length * sc.width * (sc.stereo + 1);
- total += size;
- if (sc.loopstart >= 0)
- Com.Printf("L");
- else
- Com.Printf(" ");
- Com.Printf("(%2db) %6i : %s\n", new Vargs(3).add(sc.width * 8).add(size).add(sfx.name));
- } else {
- if (sfx.name.charAt(0) == '*')
- Com.Printf(" placeholder : " + sfx.name + "\n");
- else
- Com.Printf(" not loaded : " + sfx.name + "\n");
- }
- }
- Com.Printf("Total resident: " + total + "\n");
- }
-
-}