diff options
Diffstat (limited to 'src')
29 files changed, 529 insertions, 2417 deletions
diff --git a/src/jake2/client/CL.java b/src/jake2/client/CL.java index 18d19be..5b30e34 100644 --- a/src/jake2/client/CL.java +++ b/src/jake2/client/CL.java @@ -2,7 +2,7 @@ * CL.java * Copyright (C) 2004 * - * $Id: CL.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: CL.java,v 1.4 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -30,6 +30,7 @@ import jake2.Globals; import jake2.game.*; import jake2.qcommon.*; import jake2.server.SV_MAIN; +import jake2.sound.*; import jake2.sys.*; import jake2.util.Vargs; diff --git a/src/jake2/client/CL_ents.java b/src/jake2/client/CL_ents.java index 4dc4330..d406ff2 100644 --- a/src/jake2/client/CL_ents.java +++ b/src/jake2/client/CL_ents.java @@ -2,7 +2,7 @@ * CL_ents.java * Copyright (C) 2004 * - * $Id: CL_ents.java,v 1.2 2004-07-08 15:58:42 hzi Exp $ + * $Id: CL_ents.java,v 1.3 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -1268,7 +1268,7 @@ public class CL_ents extends CL_inv { Called to get the sound spatialization origin =============== */ - void GetEntitySoundOrigin(int ent, float[] org) { + public static void GetEntitySoundOrigin(int ent, float[] org) { centity_t old; if (ent < 0 || ent >= MAX_EDICTS) diff --git a/src/jake2/client/CL_fx.java b/src/jake2/client/CL_fx.java index 2a77d21..45e9fdd 100644 --- a/src/jake2/client/CL_fx.java +++ b/src/jake2/client/CL_fx.java @@ -2,7 +2,7 @@ * CL_fx.java * Copyright (C) 2004 * - * $Id: CL_fx.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: CL_fx.java,v 1.4 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -30,6 +30,7 @@ import jake2.game.M_Flash; import jake2.game.entity_state_t; import jake2.qcommon.Com; import jake2.qcommon.MSG; +import jake2.sound.*; /** * CL_fx diff --git a/src/jake2/client/CL_parse.java b/src/jake2/client/CL_parse.java index f636ba0..ad19960 100644 --- a/src/jake2/client/CL_parse.java +++ b/src/jake2/client/CL_parse.java @@ -2,7 +2,7 @@ * CL_parse.java * Copyright (C) 2004 * - * $Id: CL_parse.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: CL_parse.java,v 1.4 2004-07-08 20:56:49 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -25,24 +25,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package jake2.client; -import java.io.IOException; -import java.io.RandomAccessFile; - import jake2.Defines; import jake2.game.Cmd; import jake2.game.entity_state_t; -import jake2.qcommon.CM; -import jake2.qcommon.Cbuf; -import jake2.qcommon.Com; -import jake2.qcommon.Cvar; -import jake2.qcommon.FS; -import jake2.qcommon.MSG; -import jake2.qcommon.SZ; -import jake2.qcommon.xcommand_t; +import jake2.qcommon.*; import jake2.render.model_t; +import jake2.sound.S; import jake2.sys.Sys; import jake2.util.Lib; +import java.io.IOException; +import java.io.RandomAccessFile; + /** * CL_parse */ @@ -200,7 +194,7 @@ public class CL_parse extends CL_view { S.BeginRegistration(); CL.RegisterTEntSounds(); for (int i = 1; i < MAX_SOUNDS; i++) { - if (cl.configstrings[CS_SOUNDS + i] == null || cl.configstrings[CS_SOUNDS + i] == "") + if (cl.configstrings[CS_SOUNDS + i] == null || cl.configstrings[CS_SOUNDS + i].equals("") || cl.configstrings[CS_SOUNDS + i].equals("\0")) break; cl.sound_precache[i] = S.RegisterSound(cl.configstrings[CS_SOUNDS + i]); Sys.SendKeyEvents(); // pump message loop @@ -555,7 +549,7 @@ public class CL_parse extends CL_view { } else if (i >= CS_SOUNDS && i < CS_SOUNDS + MAX_MODELS) { if (cl.refresh_prepped) - cl.sound_precache[i - CS_SOUNDS] = SND_DMA.RegisterSound(cl.configstrings[i]); + cl.sound_precache[i - CS_SOUNDS] = S.RegisterSound(cl.configstrings[i]); } else if (i >= CS_IMAGES && i < CS_IMAGES + MAX_MODELS) { if (cl.refresh_prepped) @@ -632,7 +626,7 @@ public class CL_parse extends CL_view { if (null==cl.sound_precache[sound_num]) return; - SND_DMA.StartSound(pos, ent, channel, cl.sound_precache[sound_num], volume, attenuation, ofs); + S.StartSound(pos, ent, channel, cl.sound_precache[sound_num], volume, attenuation, ofs); } public static void SHOWNET(String s) { @@ -709,7 +703,7 @@ public class CL_parse extends CL_view { case svc_print : i = MSG.ReadByte(net_message); if (i == PRINT_CHAT) { - SND_DMA.StartLocalSound("misc/talk.wav"); + S.StartLocalSound("misc/talk.wav"); con.ormask = 128; } Com.Printf(MSG.ReadString(net_message)); diff --git a/src/jake2/client/CL_tent.java b/src/jake2/client/CL_tent.java index 939f3ca..8966e01 100644 --- a/src/jake2/client/CL_tent.java +++ b/src/jake2/client/CL_tent.java @@ -2,7 +2,7 @@ * CL_tent.java * Copyright (C) 2004 * - * $Id: CL_tent.java,v 1.2 2004-07-08 20:24:29 hzi Exp $ + * $Id: CL_tent.java,v 1.3 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -30,6 +30,7 @@ import jake2.game.player_state_t; import jake2.qcommon.Com; import jake2.qcommon.MSG; import jake2.render.model_t; +import jake2.sound.*; /** * CL_tent diff --git a/src/jake2/client/M.java b/src/jake2/client/M.java index dd8304f..3e076a6 100644 --- a/src/jake2/client/M.java +++ b/src/jake2/client/M.java @@ -2,7 +2,7 @@ * M.java * Copyright (C) 2003 * - * $Id: M.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: M.java,v 1.4 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -28,7 +28,6 @@ package jake2.client; import jake2.Defines; import jake2.Globals; import jake2.game.*; -import jake2.qcommon.Com; import jake2.server.SV; import jake2.util.Lib; import jake2.util.Math3D; diff --git a/src/jake2/client/Menu.java b/src/jake2/client/Menu.java index 8ac689f..00944ed 100644 --- a/src/jake2/client/Menu.java +++ b/src/jake2/client/Menu.java @@ -2,7 +2,7 @@ * Menu.java * Copyright (C) 2004 * - * $Id: Menu.java,v 1.2 2004-07-08 15:58:42 hzi Exp $ + * $Id: Menu.java,v 1.3 2004-07-08 20:56:49 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -29,6 +29,7 @@ import jake2.Globals; import jake2.game.Cmd; import jake2.game.cvar_t; import jake2.qcommon.*; +import jake2.sound.*; import jake2.sys.NET; import jake2.sys.Sys; import jake2.util.Lib; diff --git a/src/jake2/client/S.java b/src/jake2/client/S.java deleted file mode 100644 index 302de14..0000000 --- a/src/jake2/client/S.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * S.java - * Copyright (C) 2003 - * - * $Id: S.java,v 1.1 2004-07-07 19:58:51 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. - -*/ -package jake2.client; - -/** - * S - */ -public class S extends SND_DMA { - -} diff --git a/src/jake2/client/SCR.java b/src/jake2/client/SCR.java index 6a426d1..66b5c33 100644 --- a/src/jake2/client/SCR.java +++ b/src/jake2/client/SCR.java @@ -2,7 +2,7 @@ * SCR.java * Copyright (C) 2003 * - * $Id: SCR.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: SCR.java,v 1.4 2004-07-08 20:56:49 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -30,6 +30,7 @@ import jake2.Globals; import jake2.game.Cmd; import jake2.game.cvar_t; import jake2.qcommon.*; +import jake2.sound.*; import jake2.sys.Sys; import jake2.util.Vargs; 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"); - } - -} diff --git a/src/jake2/client/SND_JAVA.java b/src/jake2/client/SND_JAVA.java deleted file mode 100644 index ddfa020..0000000 --- a/src/jake2/client/SND_JAVA.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * SND_JAVA.java - * Copyright (C) 2004 - * - * $Id: SND_JAVA.java,v 1.2 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. - -*/ -package jake2.client; - -import jake2.Globals; -import jake2.game.cvar_t; -import jake2.qcommon.Cvar; -import jake2.qcommon.FS; - -import java.io.*; -import java.io.FileInputStream; -import java.io.IOException; - -import javax.sound.sampled.*; - -/** - * SND_JAVA - */ -public class SND_JAVA extends Globals { - - static boolean snd_inited= false; - - static cvar_t sndbits; - static cvar_t sndspeed; - static cvar_t sndchannels; - -// static int tryrates[] = { 11025, 22051, 44100, 8000 }; - static class dma_t { - int channels; - int samples; // mono samples in buffer - int submission_chunk; // don't mix less than this # - int samplepos; // in mono samples - int samplebits; - int speed; - byte[] buffer; - } - static SND_DMA.dma_t dma = new dma_t(); - - static SourceDataLine line; - static AudioFormat format; - - - static boolean SNDDMA_Init() { - - if (snd_inited) - return true; - - if (sndbits == null) { - sndbits = Cvar.Get("sndbits", "16", CVAR_ARCHIVE); - sndspeed = Cvar.Get("sndspeed", "0", CVAR_ARCHIVE); - sndchannels = Cvar.Get("sndchannels", "2", CVAR_ARCHIVE); - } - - byte[] sound = FS.LoadFile("sound/misc/menu1.wav"); - AudioInputStream stream; - try { - stream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(sound)); - } catch (UnsupportedAudioFileException e) { - return false; - } catch (IOException e) { - return false; - } - format = stream.getFormat(); - - DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, format); - //format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits(), 2, 2*format.getFrameSize(), format.getFrameRate(), format.isBigEndian()); - - try { - line = (SourceDataLine)AudioSystem.getLine(dinfo); - } catch (LineUnavailableException e4) { - return false; - } - dma.buffer = new byte[65536]; -// try { -// stream.read(dma.buffer); -// } catch (IOException e3) { -// // TODO Auto-generated catch block -// e3.printStackTrace(); -// } - - dma.channels = format.getChannels(); - dma.samplebits = format.getSampleSizeInBits(); - dma.samples = dma.buffer.length / format.getFrameSize(); - dma.speed = (int)format.getSampleRate(); - dma.samplepos = 0; - dma.submission_chunk = 1; - - try { - line.open(format, 4096); - } catch (LineUnavailableException e5) { - return false; - } - - line.start(); - runLine(); - - snd_inited = true; - return true; - - } - - static int SNDDMA_GetDMAPos() { - dma.samplepos = line.getFramePosition() % dma.samples; - return dma.samplepos; - } - - static void SNDDMA_Shutdown() { - line.stop(); - line.flush(); - line.close(); - line=null; - snd_inited = false; - } - - /* - ============== - SNDDMA_Submit - - Send sound to device if buffer isn't really the dma buffer - =============== - */ - public static void SNDDMA_Submit() { - runLine(); - } - - static void SNDDMA_BeginPainting() {} - - private static int pos = 0; - static void runLine() { - - int p = line.getFramePosition() * format.getFrameSize() % dma.buffer.length; - System.out.println("run " + p + " " + pos); - if (p == 0) { - writeLine(); - } - else if (pos - p < 2048 ) writeLine(); - } - - static void writeLine() { - line.write(dma.buffer, pos, 4096); - pos+=4096; - if (pos>=dma.buffer.length) pos = 0; - } - -} diff --git a/src/jake2/client/SND_MEM.java b/src/jake2/client/SND_MEM.java deleted file mode 100644 index 85215d1..0000000 --- a/src/jake2/client/SND_MEM.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * SND_MEM.java - * Copyright (C) 2004 - * - * $Id: SND_MEM.java,v 1.2 2004-07-08 15:58:42 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. - -*/ -package jake2.client; - -import jake2.qcommon.Com; -import jake2.qcommon.FS; - -/** - * SND_MEM - */ -public class SND_MEM extends SND_JAVA { - -//// snd_mem.c: sound caching -// -// #include "client.h" -// #include "snd_loc.h" -// -// int cache_full_cycle; -// -// byte *S_Alloc (int size); -// - /* - ================ - ResampleSfx - ================ - */ - static void ResampleSfx (sfx_t sfx, int inrate, int inwidth, byte[] data, int ofs) - { - int outcount; - int srcsample; - float stepscale; - int i; - int sample, samplefrac, fracstep; - sfxcache_t sc; - - sc = sfx.cache; - if (sc == null) - return; - - stepscale = (float)inrate / dma.speed; // this is usually 0.5, 1, or 2 - - outcount = (int)(sc.length / stepscale); - sc.length = outcount; - if (sc.loopstart != -1) - sc.loopstart = (int)(sc.loopstart / stepscale); - - sc.speed = dma.speed; - if (SND_DMA.s_loadas8bit.value != 0.0f) - sc.width = 1; - else - sc.width = inwidth; - sc.stereo = 0; - -// resample / decimate to the current source rate - - if (stepscale == 1 && inwidth == 1 && sc.width == 1) - { -// fast special case - for (i=0 ; i<outcount ; i++) - sc.data[i+ofs] = (byte)((data[i+ofs] & 0xFF) - 128); - } - else - { -// general case - samplefrac = 0; - fracstep = (int)(stepscale*256); -// 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; -// if (sc->width == 2) -// ((short *)sc->data)[i] = sample; -// else -// ((signed char *)sc->data)[i] = sample >> 8; -// } - } - } -// -//// ============================================================================= -// - /* - ============== - S_LoadSound - ============== - */ - static sfxcache_t LoadSound(sfx_t s) { - String namebuffer; - byte[] data; - wavinfo_t info; - int len; - float stepscale; - sfxcache_t sc = null; - int size; - String name; - - if (s.name.charAt(0) == '*') - return null; - - // see if still in memory - sc = s.cache; - if (sc != null) - return sc; - - // load it in - if (s.truename != null) - name = s.truename; - else - name = s.name; - - if (name.charAt(0) == '#') - namebuffer = name.substring(1); - //strcpy(namebuffer, &name[1]); - else - namebuffer = "sound/" + name; - //Com_sprintf (namebuffer, sizeof(namebuffer), "sound/%s", name); - - data = FS.LoadFile(namebuffer); - - if (data == null) { - Com.DPrintf("Couldn't load " + namebuffer + "\n"); - return null; - } - size = data.length; - - info = GetWavinfo(s.name, data, size); - if (info.channels != 1) { - Com.Printf(s.name + " is a stereo sample\n"); - FS.FreeFile(data); - return null; - } - - stepscale = ((float)info.rate) / dma.speed; - len = (int) (info.samples / stepscale); - - len = len * info.width * info.channels; - - //sc = s.cache = Z_Malloc (len + sizeof(sfxcache_t)); - sc = s.cache = new sfxcache_t(len); - - sc.length = info.samples; - sc.loopstart = info.loopstart; - sc.speed = info.rate; - sc.width = info.width; - sc.stereo = info.channels; - - ResampleSfx(s, sc.speed, sc.width, data, info.dataofs); - - FS.FreeFile(data); - - return sc; - } -// -// -// -// /* -// =============================================================================== -// -// WAV loading -// -// =============================================================================== -// */ -// - static byte[] data_b; - static int data_p; - static int iff_end; - static int last_chunk; - static int iff_data; - static int iff_chunk_len; - - - static short GetLittleShort() { - short val = 0; - val = data_b[data_p]; - data_p++; - val |= (data_b[data_p] << 8); - data_p++; - return val; - } - - static int GetLittleLong() { - int val = 0; - val = data_b[data_p]; - data_p++; - val |= (data_b[data_p] << 8); - data_p++; - val |= (data_b[data_p] << 16); - data_p++; - val |= (data_b[data_p] << 24); - data_p++; - return val; - } - - static void FindNextChunk(String name) { - while (true) { - data_p = last_chunk; - - if (data_p >= iff_end) { // didn't find the chunk - data_p = 0; - return; - } - - data_p += 4; - iff_chunk_len = GetLittleLong(); - if (iff_chunk_len < 0) { - data_p = 0; - return; - } - // if (iff_chunk_len > 1024*1024) - // Sys_Error ("FindNextChunk: %i length is past the 1 meg sanity limit", iff_chunk_len); - data_p -= 8; - last_chunk = data_p + 8 + ((iff_chunk_len + 1) & ~1); - String s = new String(data_b, data_p, 4); - if (s.equals(name)) - return; - } - } - - static void FindChunk(String name) { - last_chunk = iff_data; - FindNextChunk(name); - } -// -// -// void DumpChunks(void) -// { -// char str[5]; -// -// str[4] = 0; -// data_p=iff_data; -// do -// { -// memcpy (str, data_p, 4); -// data_p += 4; -// iff_chunk_len = GetLittleLong(); -// Com_Printf ("0x%x : %s (%d)\n", (int)(data_p - 4), str, iff_chunk_len); -// data_p += (iff_chunk_len + 1) & ~1; -// } while (data_p < iff_end); -// } -// - /* - ============ - GetWavinfo - ============ - */ - static wavinfo_t GetWavinfo(String name, byte[] wav, int wavlength) { - wavinfo_t info = new wavinfo_t(); - int i; - int format; - int samples; - - if (wav == null) - return info; - - iff_data = 0; - iff_end = wavlength; - data_b = wav; - - // find "RIFF" chunk - FindChunk("RIFF"); - String s = new String(data_b, data_p + 8, 4); - if (!((data_p != 0) && s.equals("WAVE"))) { - Com.Printf("Missing RIFF/WAVE chunks\n"); - return info; - } - - // get "fmt " chunk - iff_data = data_p + 12; - // DumpChunks (); - - FindChunk("fmt "); - if (data_p == 0) { - Com.Printf("Missing fmt chunk\n"); - return info; - } - data_p += 8; - format = GetLittleShort(); - if (format != 1) { - Com.Printf("Microsoft PCM format only\n"); - return info; - } - - info.channels = GetLittleShort(); - info.rate = GetLittleLong(); - data_p += 4 + 2; - info.width = GetLittleShort() / 8; - - // get cue chunk - FindChunk("cue "); - if (data_p != 0) { - data_p += 32; - info.loopstart = GetLittleLong(); - // Com_Printf("loopstart=%d\n", sfx->loopstart); - - // if the next chunk is a LIST chunk, look for a cue length marker - FindNextChunk("LIST"); - if (data_p != 0) { - s = new String(data_b, data_p + 28, 4); - if (s.equals("MARK")) { // this is not a proper parse, but it works with cooledit... - data_p += 24; - i = GetLittleLong(); // samples in loop - info.samples = info.loopstart + i; - // Com_Printf("looped length: %i\n", i); - } - } - } else - info.loopstart = -1; - - // find data chunk - FindChunk("data"); - if (data_p == 0) { - Com.Printf("Missing data chunk\n"); - return info; - } - - data_p += 4; - samples = GetLittleLong() / info.width; - - if (info.samples != 0) { - if (samples < info.samples) - Com.Error(ERR_DROP, "Sound " + name + " has a bad loop length"); - } else - info.samples = samples; - - info.dataofs = data_p; - - return info; - } - - static class wavinfo_t { - int rate; - int width; - int channels; - int loopstart; - int samples; - int dataofs; // chunk starts this many bytes from file start - } -} diff --git a/src/jake2/client/SND_MIX.java b/src/jake2/client/SND_MIX.java deleted file mode 100644 index 39f80a2..0000000 --- a/src/jake2/client/SND_MIX.java +++ /dev/null @@ -1,565 +0,0 @@ -/* - * SND_MIX.java - * Copyright (C) 2004 - * - * $Id: SND_MIX.java,v 1.2 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. - -*/ -package jake2.client; - -import jake2.game.cvar_t; -import jake2.util.Math3D; - -/** - * SND_MIX - */ -public class SND_MIX extends SND_MEM { - - static final int MAX_CHANNELS = 32; - - static class playsound_t { - playsound_t prev, next; - sfx_t sfx; - float volume; - float attenuation; - int entnum; - int entchannel; - boolean fixed_origin; // use origin field instead of entnum's origin - float[] origin = { 0, 0, 0 }; - long begin; // begin on this sample - - public void clear() { - prev = next = null; - sfx = null; - volume = attenuation = begin = entnum = entchannel = 0; - fixed_origin = false; - Math3D.VectorClear(origin); - } - }; - - static class channel_t { - sfx_t sfx; // sfx number - int leftvol; // 0-255 volume - int rightvol; // 0-255 volume - int end; // end time in global paintsamples - int pos; // sample position in sfx - int looping; // where to loop, -1 = no looping OBSOLETE? - int entnum; // to allow overriding a specific sound - int entchannel; // - float[] origin = { 0, 0, 0 }; // only use if fixed_origin is set - float[] dist_mult = { 0, 0, 0 }; // distance multiplier (attenuation/clipK) - int master_vol; // 0-255 master volume - boolean fixed_origin; // use origin instead of fetching entnum's origin - boolean autosound; // from an entity->sound, cleared each frame - - void clear() { - sfx = null; - leftvol = rightvol = end = pos = looping = entnum = entchannel = master_vol = 0; - Math3D.VectorClear(origin); - Math3D.VectorClear(dist_mult); - fixed_origin = autosound = false; - } - }; - - static cvar_t s_volume; - static int s_rawend; -//// snd_mix.c -- portable code to mix sounds for snd_dma.c -// -// #include "client.h" -// #include "snd_loc.h" -// -// #define PAINTBUFFER_SIZE 2048 -// portable_samplepair_t paintbuffer[PAINTBUFFER_SIZE]; - static int[][] snd_scaletable = new int[32][256]; -// int *snd_p, snd_linear_count, snd_vol; -// short *snd_out; -// -// void S_WriteLinearBlastStereo16 (void); -// -// #if !(defined __linux__ && defined __i386__) -// #if !id386 -// -// void S_WriteLinearBlastStereo16 (void) -// { -// int i; -// int val; -// -// for (i=0 ; i<snd_linear_count ; i+=2) -// { -// val = snd_p[i]>>8; -// if (val > 0x7fff) -// snd_out[i] = 0x7fff; -// else if (val < (short)0x8000) -// snd_out[i] = (short)0x8000; -// else -// snd_out[i] = val; -// -// val = snd_p[i+1]>>8; -// if (val > 0x7fff) -// snd_out[i+1] = 0x7fff; -// else if (val < (short)0x8000) -// snd_out[i+1] = (short)0x8000; -// else -// snd_out[i+1] = val; -// } -// } -// #else -// __declspec( naked ) void S_WriteLinearBlastStereo16 (void) -// { -// __asm { -// -// push edi -// push ebx -// mov ecx,ds:dword ptr[snd_linear_count] -// mov ebx,ds:dword ptr[snd_p] -// mov edi,ds:dword ptr[snd_out] -// LWLBLoopTop: -// mov eax,ds:dword ptr[-8+ebx+ecx*4] -// sar eax,8 -// cmp eax,07FFFh -// jg LClampHigh -// cmp eax,0FFFF8000h -// jnl LClampDone -// mov eax,0FFFF8000h -// jmp LClampDone -// LClampHigh: -// mov eax,07FFFh -// LClampDone: -// mov edx,ds:dword ptr[-4+ebx+ecx*4] -// sar edx,8 -// cmp edx,07FFFh -// jg LClampHigh2 -// cmp edx,0FFFF8000h -// jnl LClampDone2 -// mov edx,0FFFF8000h -// jmp LClampDone2 -// LClampHigh2: -// mov edx,07FFFh -// LClampDone2: -// shl edx,16 -// and eax,0FFFFh -// or edx,eax -// mov ds:dword ptr[-4+edi+ecx*2],edx -// sub ecx,2 -// jnz LWLBLoopTop -// pop ebx -// pop edi -// ret -// } -// } -// -// #endif -// #endif -// -// void S_TransferStereo16 (unsigned long *pbuf, int endtime) -// { -// int lpos; -// int lpaintedtime; -// -// snd_p = (int *) paintbuffer; -// lpaintedtime = paintedtime; -// -// while (lpaintedtime < endtime) -// { -// // handle recirculating buffer issues -// lpos = lpaintedtime & ((dma.samples>>1)-1); -// -// snd_out = (short *) pbuf + (lpos<<1); -// -// snd_linear_count = (dma.samples>>1) - lpos; -// if (lpaintedtime + snd_linear_count > endtime) -// snd_linear_count = endtime - lpaintedtime; -// -// snd_linear_count <<= 1; -// -// // write a linear blast of samples -// S_WriteLinearBlastStereo16 (); -// -// snd_p += snd_linear_count; -// lpaintedtime += (snd_linear_count>>1); -// } -// } -// -// /* -// =================== -// S_TransferPaintBuffer -// -// =================== -// */ -// void S_TransferPaintBuffer(int endtime) -// { -// int out_idx; -// int count; -// int out_mask; -// int *p; -// int step; -// int val; -// unsigned long *pbuf; -// -// pbuf = (unsigned long *)dma.buffer; -// -// if (s_testsound->value) -// { -// int i; -// int count; -// -// // write a fixed sine wave -// count = (endtime - paintedtime); -// for (i=0 ; i<count ; i++) -// paintbuffer[i].left = paintbuffer[i].right = sin((paintedtime+i)*0.1)*20000*256; -// } -// -// -// if (dma.samplebits == 16 && dma.channels == 2) -// { // optimized case -// S_TransferStereo16 (pbuf, endtime); -// } -// else -// { // general case -// p = (int *) paintbuffer; -// count = (endtime - paintedtime) * dma.channels; -// out_mask = dma.samples - 1; -// out_idx = paintedtime * dma.channels & out_mask; -// step = 3 - dma.channels; -// -// if (dma.samplebits == 16) -// { -// short *out = (short *) pbuf; -// while (count--) -// { -// val = *p >> 8; -// p+= step; -// if (val > 0x7fff) -// val = 0x7fff; -// else if (val < (short)0x8000) -// val = (short)0x8000; -// out[out_idx] = val; -// out_idx = (out_idx + 1) & out_mask; -// } -// } -// else if (dma.samplebits == 8) -// { -// unsigned char *out = (unsigned char *) pbuf; -// while (count--) -// { -// val = *p >> 8; -// p+= step; -// if (val > 0x7fff) -// val = 0x7fff; -// else if (val < (short)0x8000) -// val = (short)0x8000; -// out[out_idx] = (val>>8) + 128; -// out_idx = (out_idx + 1) & out_mask; -// } -// } -// } -// } -// -// -// /* -// =============================================================================== -// -// CHANNEL MIXING -// -// =============================================================================== -// */ -// -// void S_PaintChannelFrom8 (channel_t *ch, sfxcache_t *sc, int endtime, int offset); -// void S_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int endtime, int offset); -// -// void S_PaintChannels(int endtime) -// { -// int i; -// int end; -// channel_t *ch; -// sfxcache_t *sc; -// int ltime, count; -// playsound_t *ps; -// -// snd_vol = s_volume->value*256; -// -//// Com_Printf ("%i to %i\n", paintedtime, endtime); -// while (paintedtime < endtime) -// { -// // if paintbuffer is smaller than DMA buffer -// end = endtime; -// if (endtime - paintedtime > PAINTBUFFER_SIZE) -// end = paintedtime + PAINTBUFFER_SIZE; -// -// // start any playsounds -// while (1) -// { -// ps = s_pendingplays.next; -// if (ps == &s_pendingplays) -// break; // no more pending sounds -// if (ps->begin <= paintedtime) -// { -// S_IssuePlaysound (ps); -// continue; -// } -// -// if (ps->begin < end) -// end = ps->begin; // stop here -// break; -// } -// -// // clear the paint buffer -// if (s_rawend < paintedtime) -// { -//// Com_Printf ("clear\n"); -// memset(paintbuffer, 0, (end - paintedtime) * sizeof(portable_samplepair_t)); -// } -// else -// { // copy from the streaming sound source -// int s; -// int stop; -// -// stop = (end < s_rawend) ? end : s_rawend; -// -// for (i=paintedtime ; i<stop ; i++) -// { -// s = i&(MAX_RAW_SAMPLES-1); -// paintbuffer[i-paintedtime] = s_rawsamples[s]; -// } -//// if (i != end) -//// Com_Printf ("partial stream\n"); -//// else -//// Com_Printf ("full stream\n"); -// for ( ; i<end ; i++) -// { -// paintbuffer[i-paintedtime].left = -// paintbuffer[i-paintedtime].right = 0; -// } -// } -// -// -// // paint in the channels. -// ch = channels; -// for (i=0; i<MAX_CHANNELS ; i++, ch++) -// { -// ltime = paintedtime; -// -// while (ltime < end) -// { -// if (!ch->sfx || (!ch->leftvol && !ch->rightvol) ) -// break; -// -// // max painting is to the end of the buffer -// count = end - ltime; -// -// // might be stopped by running out of data -// if (ch->end - ltime < count) -// count = ch->end - ltime; -// -// sc = S_LoadSound (ch->sfx); -// if (!sc) -// break; -// -// if (count > 0 && ch->sfx) -// { -// if (sc->width == 1)// FIXME; 8 bit asm is wrong now -// S_PaintChannelFrom8(ch, sc, count, ltime - paintedtime); -// else -// S_PaintChannelFrom16(ch, sc, count, ltime - paintedtime); -// -// ltime += count; -// } -// -// // if at end of loop, restart -// if (ltime >= ch->end) -// { -// if (ch->autosound) -// { // autolooping sounds always go back to start -// ch->pos = 0; -// ch->end = ltime + sc->length; -// } -// else if (sc->loopstart >= 0) -// { -// ch->pos = sc->loopstart; -// ch->end = ltime + sc->length - ch->pos; -// } -// else -// { // channel just stopped -// ch->sfx = NULL; -// } -// } -// } -// -// } -// -// // transfer out according to DMA format -// S_TransferPaintBuffer(end); -// paintedtime = end; -// } -// } -// - static void InitScaletable () - { - int i, j; - int scale; - - s_volume.modified = false; - for (i=0 ; i<32 ; i++) - { - scale = (int)(i * 8 * 256 * s_volume.value); - for (j=0 ; j<256 ; j++) - snd_scaletable[i][j] = ((byte)j) * scale; - } - } -// -// -// #if !(defined __linux__ && defined __i386__) -// #if !id386 -// -// void S_PaintChannelFrom8 (channel_t *ch, sfxcache_t *sc, int count, int offset) -// { -// int data; -// int *lscale, *rscale; -// unsigned char *sfx; -// int i; -// portable_samplepair_t *samp; -// -// if (ch->leftvol > 255) -// ch->leftvol = 255; -// if (ch->rightvol > 255) -// ch->rightvol = 255; -// -// //ZOID-- >>11 has been changed to >>3, >>11 didn't make much sense -// //as it would always be zero. -// lscale = snd_scaletable[ ch->leftvol >> 3]; -// rscale = snd_scaletable[ ch->rightvol >> 3]; -// sfx = (signed char *)sc->data + ch->pos; -// -// samp = &paintbuffer[offset]; -// -// for (i=0 ; i<count ; i++, samp++) -// { -// data = sfx[i]; -// samp->left += lscale[data]; -// samp->right += rscale[data]; -// } -// -// ch->pos += count; -// } -// -// #else -// -// __declspec( naked ) void S_PaintChannelFrom8 (channel_t *ch, sfxcache_t *sc, int count, int offset) -// { -// __asm { -// push esi -// push edi -// push ebx -// push ebp -// mov ebx,ds:dword ptr[4+16+esp] -// mov esi,ds:dword ptr[8+16+esp] -// mov eax,ds:dword ptr[4+ebx] -// mov edx,ds:dword ptr[8+ebx] -// cmp eax,255 -// jna LLeftSet -// mov eax,255 -// LLeftSet: -// cmp edx,255 -// jna LRightSet -// mov edx,255 -// LRightSet: -// and eax,0F8h -// add esi,20 -// and edx,0F8h -// mov edi,ds:dword ptr[16+ebx] -// mov ecx,ds:dword ptr[12+16+esp] -// add esi,edi -// shl eax,7 -// add edi,ecx -// shl edx,7 -// mov ds:dword ptr[16+ebx],edi -// add eax,offset snd_scaletable -// add edx,offset snd_scaletable -// sub ebx,ebx -// mov bl,ds:byte ptr[-1+esi+ecx*1] -// test ecx,1 -// jz LMix8Loop -// mov edi,ds:dword ptr[eax+ebx*4] -// mov ebp,ds:dword ptr[edx+ebx*4] -// add edi,ds:dword ptr[paintbuffer+0-8+ecx*8] -// add ebp,ds:dword ptr[paintbuffer+4-8+ecx*8] -// mov ds:dword ptr[paintbuffer+0-8+ecx*8],edi -// mov ds:dword ptr[paintbuffer+4-8+ecx*8],ebp -// mov bl,ds:byte ptr[-2+esi+ecx*1] -// dec ecx -// jz LDone -// LMix8Loop: -// mov edi,ds:dword ptr[eax+ebx*4] -// mov ebp,ds:dword ptr[edx+ebx*4] -// add edi,ds:dword ptr[paintbuffer+0-8+ecx*8] -// add ebp,ds:dword ptr[paintbuffer+4-8+ecx*8] -// mov bl,ds:byte ptr[-2+esi+ecx*1] -// mov ds:dword ptr[paintbuffer+0-8+ecx*8],edi -// mov ds:dword ptr[paintbuffer+4-8+ecx*8],ebp -// mov edi,ds:dword ptr[eax+ebx*4] -// mov ebp,ds:dword ptr[edx+ebx*4] -// mov bl,ds:byte ptr[-3+esi+ecx*1] -// add edi,ds:dword ptr[paintbuffer+0-8*2+ecx*8] -// add ebp,ds:dword ptr[paintbuffer+4-8*2+ecx*8] -// mov ds:dword ptr[paintbuffer+0-8*2+ecx*8],edi -// mov ds:dword ptr[paintbuffer+4-8*2+ecx*8],ebp -// sub ecx,2 -// jnz LMix8Loop -// LDone: -// pop ebp -// pop ebx -// pop edi -// pop esi -// ret -// } -// } -// -// #endif -// #endif -// -// void S_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int count, int offset) -// { -// int data; -// int left, right; -// int leftvol, rightvol; -// signed short *sfx; -// int i; -// portable_samplepair_t *samp; -// -// leftvol = ch->leftvol*snd_vol; -// rightvol = ch->rightvol*snd_vol; -// sfx = (signed short *)sc->data + ch->pos; -// -// samp = &paintbuffer[offset]; -// for (i=0 ; i<count ; i++, samp++) -// { -// data = sfx[i]; -// left = (data * leftvol)>>8; -// right = (data * rightvol)>>8; -// samp->left += left; -// samp->right += right; -// } -// -// ch->pos += count; -// } -// -// -}
\ No newline at end of file diff --git a/src/jake2/client/VID.java b/src/jake2/client/VID.java index 2b8cb81..53a943f 100644 --- a/src/jake2/client/VID.java +++ b/src/jake2/client/VID.java @@ -2,7 +2,7 @@ * VID.java * Copyright (C) 2003 * - * $Id: VID.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: VID.java,v 1.4 2004-07-08 20:56:50 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -31,6 +31,7 @@ import jake2.game.Cmd; import jake2.game.cvar_t; import jake2.qcommon.*; import jake2.render.Renderer; +import jake2.sound.*; import jake2.sys.IN; import jake2.sys.KBD; import jake2.util.Vargs; diff --git a/src/jake2/client/centity_t.java b/src/jake2/client/centity_t.java index 0c26bed..0d4f822 100644 --- a/src/jake2/client/centity_t.java +++ b/src/jake2/client/centity_t.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 27.11.2003 by RST. -// $Id: centity_t.java,v 1.1 2004-07-07 19:58:52 hzi Exp $ +// $Id: centity_t.java,v 1.2 2004-07-08 20:56:50 hzi Exp $ package jake2.client; @@ -27,7 +27,7 @@ import jake2.game.entity_state_t; public class centity_t { entity_state_t baseline= new entity_state_t(null); // delta from this if not from a previous frame - entity_state_t current= new entity_state_t(null); + public entity_state_t current= new entity_state_t(null); entity_state_t prev= new entity_state_t(null); // will always be valid, but might just be a copy of current int serverframe; // if not current, this ent isn't in the frame diff --git a/src/jake2/client/client_state_t.java b/src/jake2/client/client_state_t.java index 3577932..ff86070 100644 --- a/src/jake2/client/client_state_t.java +++ b/src/jake2/client/client_state_t.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 27.11.2003 by RST. -//$Id: client_state_t.java,v 1.1 2004-07-07 19:58:52 hzi Exp $ +//$Id: client_state_t.java,v 1.2 2004-07-08 20:56:51 hzi Exp $ package jake2.client; @@ -28,6 +28,7 @@ import jake2.game.cmodel_t; import jake2.game.usercmd_t; import jake2.render.image_t; import jake2.render.model_t; +import jake2.sound.*; import java.io.RandomAccessFile; @@ -118,9 +119,9 @@ public class client_state_t { boolean attractloop; // running the attract loop, any key will menu int servercount; // server identification for prespawns String gamedir =""; - int playernum; + public int playernum; - String configstrings[] = new String[Defines.MAX_CONFIGSTRINGS]; + public String configstrings[] = new String[Defines.MAX_CONFIGSTRINGS]; // // locally derived information from server state diff --git a/src/jake2/client/frame_t.java b/src/jake2/client/frame_t.java index d493363..1e414dc 100644 --- a/src/jake2/client/frame_t.java +++ b/src/jake2/client/frame_t.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 27.11.2003 by RST. -// $Id: frame_t.java,v 1.1 2004-07-07 19:58:52 hzi Exp $ +// $Id: frame_t.java,v 1.2 2004-07-08 20:56:50 hzi Exp $ package jake2.client; @@ -33,7 +33,7 @@ public class frame_t implements Cloneable { boolean valid; // cleared if delta parsing was invalid int serverframe; - int servertime; // server time the message is valid for (in msec) + public int servertime; // server time the message is valid for (in msec) int deltaframe; byte areabits[] = new byte [MAX_MAP_AREAS/8]; // portalarea visibility bits public player_state_t playerstate = new player_state_t(); // mem diff --git a/src/jake2/render/jogl/Impl.java b/src/jake2/render/jogl/Impl.java index ba8b929..991c349 100644 --- a/src/jake2/render/jogl/Impl.java +++ b/src/jake2/render/jogl/Impl.java @@ -2,7 +2,7 @@ * Impl.java * Copyright (C) 2003 * - * $Id: Impl.java,v 1.3 2004-07-08 20:24:30 hzi Exp $ + * $Id: Impl.java,v 1.4 2004-07-08 20:56:55 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -27,7 +27,10 @@ package jake2.render.jogl; import jake2.Defines; import jake2.Globals; +import jake2.client.CL; +import jake2.qcommon.Com; import jake2.qcommon.xcommand_t; +import jake2.server.SV; import jake2.sys.KBD; import java.awt.Dimension; @@ -126,9 +129,7 @@ public class Impl extends Misc implements GLEventListener { // register event listener window.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - R_Shutdown(); - System.out.println("Received event " + e.paramString() + ", exiting...\n"); - System.exit(0); + ri.Cmd_ExecuteText(Defines.EXEC_APPEND, "quit"); } }); diff --git a/src/jake2/render/jogl/Light.java b/src/jake2/render/jogl/Light.java index 214641d..686884a 100644 --- a/src/jake2/render/jogl/Light.java +++ b/src/jake2/render/jogl/Light.java @@ -2,7 +2,7 @@ * Light.java * Copyright (C) 2003 * - * $Id: Light.java,v 1.2 2004-07-08 20:24:30 hzi Exp $ + * $Id: Light.java,v 1.3 2004-07-08 20:56:55 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -146,6 +146,7 @@ public abstract class Light extends Warp { float dist; msurface_t surf; int i; + int sidebit; if (node.contents != -1) return; @@ -167,7 +168,22 @@ public abstract class Light extends Warp { // mark the polygons for (i=0 ; i<node.numsurfaces ; i++) { + surf = r_worldmodel.surfaces[node.firstsurface + i]; + + /* + * cwei + * bugfix for dlight behind the walls + */ + dist = Math3D.DotProduct (light.origin, surf.plane.normal) - surf.plane.dist; + sidebit = (dist >= 0) ? 0 : Defines.SURF_PLANEBACK; + if ( (surf.flags & Defines.SURF_PLANEBACK) != sidebit ) + continue; + /* + * cwei + * bugfix end + */ + if (surf.dlightframe != r_dlightframecount) { surf.dlightbits = 0; diff --git a/src/jake2/server/SV_GAME.java b/src/jake2/server/SV_GAME.java index 8f920ec..8f6eec4 100644 --- a/src/jake2/server/SV_GAME.java +++ b/src/jake2/server/SV_GAME.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 14.01.2004 by RST. -// $Id: SV_GAME.java,v 1.3 2004-07-08 20:24:30 hzi Exp $ +// $Id: SV_GAME.java,v 1.4 2004-07-08 20:56:54 hzi Exp $ package jake2.server; @@ -312,7 +312,7 @@ public class SV_GAME extends SV_INIT { return; //TODO: impl SV_StartSound - //SV_SEND.SV_StartSound (null, entity, channel, sound_num, volume, attenuation, timeofs); + SV_SEND.SV_StartSound (null, entity, channel, sound_num, volume, attenuation, timeofs); } //============================================== diff --git a/src/jake2/server/SV_SEND.java b/src/jake2/server/SV_SEND.java index 747f2d4..0764ce6 100644 --- a/src/jake2/server/SV_SEND.java +++ b/src/jake2/server/SV_SEND.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 17.01.2004 by RST. -// $Id: SV_SEND.java,v 1.2 2004-07-08 20:24:30 hzi Exp $ +// $Id: SV_SEND.java,v 1.3 2004-07-08 20:56:54 hzi Exp $ package jake2.server; @@ -287,7 +287,7 @@ public class SV_SEND extends SV_MAIN { int flags; int i; int ent; - float[] origin_v = null; + float[] origin_v = {0,0,0}; boolean use_phs; if (volume < 0 || volume > 1.0) diff --git a/src/jake2/sound/DummyDriver.java b/src/jake2/sound/DummyDriver.java new file mode 100644 index 0000000..e663d09 --- /dev/null +++ b/src/jake2/sound/DummyDriver.java @@ -0,0 +1,111 @@ +/* + * Created on Apr 25, 2004 + * + * Copyright (C) 2003 + * + * $Id: DummyDriver.java,v 1.1 2004-07-08 20:56:49 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. + +*/ +package jake2.sound; + +/** + * DummyDriver + * + * @author cwei + */ +public final class DummyDriver implements Sound { + + static { + S.register(new DummyDriver()); + }; + + private DummyDriver() { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#Init() + */ + public boolean Init() { + return true; + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#Shutdown() + */ + public void Shutdown() { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#BeginRegistration() + */ + public void BeginRegistration() { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#RegisterSound(java.lang.String) + */ + public sfx_t RegisterSound(String sample) { + return null; + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#EndRegistration() + */ + public void EndRegistration() { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#StartLocalSound(java.lang.String) + */ + public void StartLocalSound(String sound) { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#StartSound(float[], int, int, jake2.sound.sfx_t, float, float, float) + */ + public void StartSound(float[] origin, int entnum, int entchannel, sfx_t sfx, float fvol, float attenuation, float timeofs) { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#Update(float[], float[], float[], float[]) + */ + public void Update(float[] origin, float[] forward, float[] right, float[] up) { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#RawSamples(int, int, int, int, byte[]) + */ + public void RawSamples(int samples, int rate, int width, int channels, byte[] data) { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#StopAllSounds() + */ + public void StopAllSounds() { + } + + /* (non-Javadoc) + * @see jake2.sound.Sound#getName() + */ + public String getName() { + return "dummy"; + } +} diff --git a/src/jake2/sound/S.java b/src/jake2/sound/S.java new file mode 100644 index 0000000..c696501 --- /dev/null +++ b/src/jake2/sound/S.java @@ -0,0 +1,187 @@ +/* + * S.java + * Copyright (C) 2003 + * + * $Id: S.java,v 1.1 2004-07-08 20:56:49 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. + +*/ +package jake2.sound; + +import jake2.Defines; +import jake2.game.cvar_t; +import jake2.qcommon.Com; +import jake2.qcommon.Cvar; + +import java.util.Vector; + +/** + * S + */ +public class S { + + static Sound impl; + static cvar_t s_impl; + + static Vector drivers = new Vector(3); + + static { + try { + Class.forName("jake2.sound.DummyDriver"); + Class.forName("jake2.sound.joal.JOALSoundImpl"); + Class.forName("jake2.sound.jsound.JSoundImpl"); + } + catch (ClassNotFoundException e) { + } + }; + + public static void register(Sound driver) { + if (driver == null) { + throw new IllegalArgumentException("Sound implementation can't be null"); + } + if (!drivers.contains(driver)) { + drivers.add(driver); + } + } + + public static void useDriver(String driverName) { + Sound driver = null; + int count = drivers.size(); + for (int i = 0; i < count; i++) { + driver = (Sound) drivers.get(i); + if (driver.getName().equals(driverName)) { + impl = driver; + return; + } + } + // if driver not found use dummy + impl = (Sound)drivers.get(0); + } + + public static void Init() { + + Com.Printf("\n------- sound initialization -------\n"); + + cvar_t cv = Cvar.Get("s_initsound", "1", 0); + if (cv.value == 0.0f) { + Com.Printf("not initializing.\n"); + useDriver("dummy"); + return; + } + + s_impl = Cvar.Get("s_impl", "joal", Defines.CVAR_ARCHIVE); + useDriver(s_impl.string); + + if (impl.Init()) { + // driver ok + Cvar.Set("s_impl", impl.getName()); + } else { + // fallback + useDriver("dummy"); + } + + Com.Printf("\n------- use sound driver \"" + impl.getName() + "\" -------\n"); + StopAllSounds(); + } + + public static void Shutdown() { + impl.Shutdown(); + } + + /* + ===================== + S_BeginRegistration + ===================== + */ + public static void BeginRegistration() { + impl.BeginRegistration(); + } + + /* + ===================== + S_RegisterSound + ===================== + */ + public static sfx_t RegisterSound(String sample) { + return impl.RegisterSound(sample); + } + + /* + ===================== + S_EndRegistration + ===================== + */ + public static void EndRegistration() { + impl.EndRegistration(); + } + + /* + ================== + S_StartLocalSound + ================== + */ + public static void StartLocalSound(String sound) { + impl.StartLocalSound(sound); + } + + /* + ==================== + 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 + ==================== + */ + public static void StartSound(float[] origin, int entnum, int entchannel, sfx_t sfx, float fvol, float attenuation, float timeofs) { + impl.StartSound(origin, entnum, entchannel, sfx, fvol, attenuation, timeofs); + } + + /* + ============ + S_Update + + Called once each time through the main loop + ============ + */ + public static void Update(float[] origin, float[] forward, float[] right, float[] up) { + impl.Update(origin, forward, right, up); + } + + /* + ============ + S_RawSamples + + Cinematic streaming and voice over network + ============ + */ + public static void RawSamples(int samples, int rate, int width, int channels, byte[] data) { + impl.RawSamples(samples, rate, width, channels, data); + } + + /* + ================== + S_StopAllSounds + ================== + */ + public static void StopAllSounds() { + impl.StopAllSounds(); + } +} diff --git a/src/jake2/sound/Sound.java b/src/jake2/sound/Sound.java new file mode 100644 index 0000000..30bd8c6 --- /dev/null +++ b/src/jake2/sound/Sound.java @@ -0,0 +1,105 @@ +/* + * Created on Apr 25, 2004 + * + * Copyright (C) 2003 + * + * $Id: Sound.java,v 1.1 2004-07-08 20:56:49 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. + +*/ +package jake2.sound; + +/** + * Sound + * + * @author cwei + */ +public interface Sound { + + + String getName(); + + boolean Init(); + void Shutdown(); + + /* + ===================== + S_BeginRegistration + ===================== + */ + void BeginRegistration(); + + /* + ===================== + S_RegisterSound + ===================== + */ + sfx_t RegisterSound(String sample); + + /* + ===================== + S_EndRegistration + ===================== + */ + void EndRegistration(); + + /* + ================== + S_StartLocalSound + ================== + */ + void StartLocalSound(String sound); + + /* + ==================== + 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 + ==================== + */ + void StartSound(float[] origin, int entnum, int entchannel, sfx_t sfx, float fvol, float attenuation, float timeofs); + + /* + ============ + S_Update + + Called once each time through the main loop + ============ + */ + void Update(float[] origin, float[] forward, float[] right, float[] up); + /* + ============ + S_RawSamples + + Cinematic streaming and voice over network + ============ + */ + void RawSamples(int samples, int rate, int width, int channels, byte[] data); + + /* + ================== + S_StopAllSounds + ================== + */ + void StopAllSounds(); + +} diff --git a/src/jake2/client/sfx_t.java b/src/jake2/sound/sfx_t.java index 71ab344..992c0e7 100644 --- a/src/jake2/client/sfx_t.java +++ b/src/jake2/sound/sfx_t.java @@ -1,14 +1,8 @@ /* * sfx_t.java - * Copyright (C) 2003 - * - * $Id: sfx_t.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ - */ -/* - * sfx_t.java * Copyright (C) 2004 * - * $Id: sfx_t.java,v 1.3 2004-07-08 20:24:29 hzi Exp $ + * $Id: sfx_t.java,v 1.1 2004-07-08 20:56:49 hzi Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -32,17 +26,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Created on 28.11.2003 by RST. -package jake2.client; +package jake2.sound; + public class sfx_t { - String name; //mem - int registration_sequence; - sfxcache_t cache; //ptr - String truename; //ptr + public String name; //mem + public int registration_sequence; + public sfxcache_t cache; //ptr + public String truename; //ptr + + // cwei + public int id = -1; public void clear() { name = truename = null; cache = null; registration_sequence = 0; + + // cwei + id = -1; } } diff --git a/src/jake2/client/sfxcache_t.java b/src/jake2/sound/sfxcache_t.java index 245d921..7f4428a 100644 --- a/src/jake2/client/sfxcache_t.java +++ b/src/jake2/sound/sfxcache_t.java @@ -19,17 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 28.11.2003 by RST. -// $Id: sfxcache_t.java,v 1.2 2004-07-08 15:58:43 hzi Exp $ +// $Id: sfxcache_t.java,v 1.1 2004-07-08 20:56:49 hzi Exp $ -package jake2.client; +package jake2.sound; public class sfxcache_t { - int length; - int loopstart; - int speed; // not needed, because converted on load? - int width; - int stereo; - byte data[]; // variable sized + public int length; + public int loopstart; + public int speed; // not needed, because converted on load? + public int width; + public int stereo; + public byte data[]; // variable sized public sfxcache_t(int size) { data = new byte[size]; diff --git a/src/jake2/sound/soundinfo_t.java b/src/jake2/sound/soundinfo_t.java new file mode 100644 index 0000000..2c9e6c6 --- /dev/null +++ b/src/jake2/sound/soundinfo_t.java @@ -0,0 +1,19 @@ +/* + * soundinfo_t.java + * Copyright (C) 2004 + * + * $Id: soundinfo_t.java,v 1.1 2004-07-08 20:56:49 hzi Exp $ + */ +package jake2.sound; + +/** + * soundinfo_t + */ +public class soundinfo_t { + int channels; + int samples; // mono samples in buffer + int submission_chunk; // don't mix less than this # + int samplepos; // in mono samples + int samplebits; + int speed; +} diff --git a/src/jake2/sound/wavinfo_t.java b/src/jake2/sound/wavinfo_t.java new file mode 100644 index 0000000..76a28fc --- /dev/null +++ b/src/jake2/sound/wavinfo_t.java @@ -0,0 +1,19 @@ +/* + * wavinfo_t.java + * Copyright (C) 2004 + * + * $Id: wavinfo_t.java,v 1.1 2004-07-08 20:56:49 hzi Exp $ + */ +package jake2.sound; + +/** + * wavinfo_t + */ +public class wavinfo_t { + public int rate; + public int width; + public int channels; + public int loopstart; + public int samples; + public int dataofs; // chunk starts this many bytes from file start +} diff --git a/src/jake2/util/Math3D.java b/src/jake2/util/Math3D.java index fcdeaee..a434a05 100644 --- a/src/jake2/util/Math3D.java +++ b/src/jake2/util/Math3D.java @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 09.12.2003 by RST. -// $Id: Math3D.java,v 1.3 2004-07-08 20:24:31 hzi Exp $ +// $Id: Math3D.java,v 1.4 2004-07-08 20:56:54 hzi Exp $ package jake2.util; @@ -459,13 +459,14 @@ public class Math3D extends Lib { float angle; float sr, sp, sy, cr, cp, cy; - angle = (float) (angles[Defines.YAW] * (2.0f * piratio)); + cr = 2.0f * piratio; + angle = (float) (angles[Defines.YAW] * (cr)); sy = (float) Math.sin(angle); cy = (float) Math.cos(angle); - angle = (float) (angles[Defines.PITCH] * (2.0f * piratio)); + angle = (float) (angles[Defines.PITCH] * (cr)); sp = (float) Math.sin(angle); cp = (float) Math.cos(angle); - angle = (float) (angles[Defines.ROLL] * (2.0f * piratio)); + angle = (float) (angles[Defines.ROLL] * (cr)); sr = (float) Math.sin(angle); cr = (float) Math.cos(angle); @@ -475,9 +476,9 @@ public class Math3D extends Lib { forward[2] = -sp; } if (right != null) { - right[0] = (-1 * sr * sp * cy + -1 * cr * -sy); - right[1] = (-1 * sr * sp * sy + -1 * cr * cy); - right[2] = -1 * sr * cp; + right[0] = (-sr * sp * cy + cr * sy); + right[1] = (-sr * sp * sy + -cr * cy); + right[2] = -sr * cp; } if (up != null) { up[0] = (cr * sp * cy + -sr * -sy); |