diff options
Diffstat (limited to 'src/jake2/sound')
-rw-r--r-- | src/jake2/sound/DummyDriver.java | 111 | ||||
-rw-r--r-- | src/jake2/sound/S.java | 187 | ||||
-rw-r--r-- | src/jake2/sound/Sound.java | 105 | ||||
-rw-r--r-- | src/jake2/sound/WaveLoader.java | 302 | ||||
-rw-r--r-- | src/jake2/sound/joal/Channel.java | 84 | ||||
-rw-r--r-- | src/jake2/sound/joal/JOALSoundImpl.java | 793 | ||||
-rw-r--r-- | src/jake2/sound/sfx_t.java | 49 | ||||
-rw-r--r-- | src/jake2/sound/sfxcache_t.java | 37 | ||||
-rw-r--r-- | src/jake2/sound/soundinfo_t.java | 19 | ||||
-rw-r--r-- | src/jake2/sound/wavinfo_t.java | 19 |
10 files changed, 0 insertions, 1706 deletions
diff --git a/src/jake2/sound/DummyDriver.java b/src/jake2/sound/DummyDriver.java deleted file mode 100644 index e663d09..0000000 --- a/src/jake2/sound/DummyDriver.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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 deleted file mode 100644 index c696501..0000000 --- a/src/jake2/sound/S.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * 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 deleted file mode 100644 index 30bd8c6..0000000 --- a/src/jake2/sound/Sound.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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/sound/WaveLoader.java b/src/jake2/sound/WaveLoader.java deleted file mode 100644 index 020ab52..0000000 --- a/src/jake2/sound/WaveLoader.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * SND_MEM.java - * Copyright (C) 2004 - * - * $Id: WaveLoader.java,v 1.1 2004-07-09 06:50:48 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.qcommon.Com; -import jake2.qcommon.FS; -import jake2.sys.Sys; - -import java.io.ByteArrayInputStream; -import java.io.IOException; - -import javax.sound.sampled.*; - -/** - * SND_MEM - */ -public class WaveLoader { - - private static final AudioFormat sampleFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 22050, 16, 1, 2, 22050, false); - - /* - ============== - S_LoadSound - ============== - */ - public 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); - - else - namebuffer = "sound/" + 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); - - AudioInputStream in = null; - AudioInputStream out = null; - try { - in = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data)); - if (in.getFormat().getSampleSizeInBits() == 8) { - in = convertTo16bit(in); - } - out = AudioSystem.getAudioInputStream(sampleFormat, in); - int l = (int)out.getFrameLength(); - sc = s.cache = new sfxcache_t(l*2); - sc.length = l; - int c = out.read(sc.data, 0, l * 2); - out.close(); - in.close(); - } catch (Exception e) { - Com.Printf("Couldn't load " + namebuffer + "\n"); - return null; - } - - sc.loopstart = info.loopstart * ((int)sampleFormat.getSampleRate() / info.rate); - sc.speed = (int)sampleFormat.getSampleRate(); - sc.width = sampleFormat.getSampleSizeInBits() / 8; - sc.stereo = 0; - - data = null; - - return sc; - } - - static AudioInputStream convertTo16bit(AudioInputStream in) throws IOException { - AudioFormat format = in.getFormat(); - int length = (int)in.getFrameLength(); - byte[] samples = new byte[2*length]; - - for (int i = 0; i < length; i++) { - in.read(samples, 2*i+1, 1); - samples[2*i+1] -= 128; - } - in.close(); - - AudioFormat newformat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(), 2, format.getFrameRate(), false); - return new AudioInputStream(new ByteArrayInputStream(samples), newformat, length); - } - - /* - =============================================================================== - - 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() { - int val = 0; - val = data_b[data_p] & 0xFF; - data_p++; - val |= ((data_b[data_p] & 0xFF) << 8); - data_p++; - return (short)val; - } - - static int GetLittleLong() { - int val = 0; - val = data_b[data_p] & 0xFF; - data_p++; - val |= ((data_b[data_p] & 0xFF) << 8); - data_p++; - val |= ((data_b[data_p] & 0xFF) << 16); - data_p++; - val |= ((data_b[data_p] & 0xFF) << 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: length is past the 1 meg sanity limit"); - - 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); - } - - /* - ============ - 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 (!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(Defines.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/sound/joal/Channel.java b/src/jake2/sound/joal/Channel.java deleted file mode 100644 index ced496f..0000000 --- a/src/jake2/sound/joal/Channel.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Created on Jun 19, 2004 - * - * Copyright (C) 2003 - * - * $Id: Channel.java,v 1.1 2004-07-09 06:50:52 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.joal; - -/** - * Channel - * - * @author cwei - */ -public class Channel { - - final static int LISTENER = 0; - final static int FIXED = 1; - final static int DYNAMIC = 2; - - int entnum; - int entchannel; - int bufferId; - float rolloff; - boolean autosound = false; - int sourceId; - boolean active = false; - boolean modified = false; - boolean bufferChanged = false; - - // sound attributes - int type; - int entity; - float[] origin = {0, 0, 0}; - - Channel(int sourceId) { - this.sourceId = sourceId; - clear(); - } - - void addListener() { - type = LISTENER; - } - - void addFixed(float[] origin) { - type = FIXED; - this.origin = origin; - } - - void addDynamic(int entity) { - type = DYNAMIC; - this.entity = entity; - } - - void clear() { - entnum = -1; - entchannel = -1; - bufferId = -1; - bufferChanged = false; - rolloff = 0; - autosound = false; - active = false; - modified = false; - } -} diff --git a/src/jake2/sound/joal/JOALSoundImpl.java b/src/jake2/sound/joal/JOALSoundImpl.java deleted file mode 100644 index 8a005ce..0000000 --- a/src/jake2/sound/joal/JOALSoundImpl.java +++ /dev/null @@ -1,793 +0,0 @@ -/* - * JOALSoundImpl.java - * Copyright (C) 2004 - * - * $Id: JOALSoundImpl.java,v 1.1 2004-07-09 06:50:52 hzi Exp $ - */ -package jake2.sound.joal; - - -import jake2.Defines; -import jake2.Globals; -import jake2.client.CL; -import jake2.game.*; -import jake2.qcommon.*; -import jake2.sound.*; -import jake2.util.Math3D; -import jake2.util.Vargs; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.*; - -import net.java.games.joal.*; - -/** - * JOALSoundImpl - */ -public final class JOALSoundImpl implements Sound { - - static { - S.register(new JOALSoundImpl()); - }; - - static AL al; - static ALC alc; - - cvar_t s_volume; - - private static final int MAX_SFX = Defines.MAX_SOUNDS * 2; - private static final int MAX_CHANNELS = 32; - - private int[] buffers = new int[MAX_SFX]; - private int[] sources = new int[MAX_CHANNELS]; - private Channel[] channels = null; - - private JOALSoundImpl() { - } - - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#Init() - */ - public boolean Init() { - - try { - initOpenAL(); - al = ALFactory.getAL(); - checkError(); - } catch (OpenALException e) { - Com.Printf(e.getMessage() + '\n'); - return false; - } - - checkError(); - al.alGenBuffers(MAX_SFX, buffers); - al.alGenSources(MAX_CHANNELS, sources); - checkError(); - s_volume = Cvar.Get("s_volume", "0.7", Defines.CVAR_ARCHIVE); - initChannels(); - al.alDistanceModel(AL.AL_INVERSE_DISTANCE_CLAMPED); -// al.alDistanceModel(AL.AL_INVERSE_DISTANCE); - Cmd.AddCommand("play", new xcommand_t() { - public void execute() { - Play(); - } - }); - Cmd.AddCommand("stopsound", new xcommand_t() { - public void execute() { - StopAllSounds(); - } - }); - Cmd.AddCommand("soundlist", new xcommand_t() { - public void execute() { - SoundList(); - } - }); - Cmd.AddCommand("soundinfo", new xcommand_t() { - public void execute() { - SoundInfo_f(); - } - }); - - num_sfx = 0; - - - Com.Printf("sound sampling rate: 44100Hz\n"); - - StopAllSounds(); - Com.Printf("------------------------------------\n"); - return true; - } - - - private void initOpenAL() throws OpenALException { - ALFactory.initialize(); - alc = ALFactory.getALC(); - String deviceName = null; - - String os = System.getProperty("os.name"); - if (os.startsWith("Windows")) { - deviceName = "DirectSound3D"; - } - ALC.Device device = alc.alcOpenDevice(deviceName); - String deviceSpecifier = alc.alcGetString(device, ALC.ALC_DEVICE_SPECIFIER); - String defaultSpecifier = alc.alcGetString(device, ALC.ALC_DEFAULT_DEVICE_SPECIFIER); - - Com.Printf(os + " using " + ((deviceName == null) ? defaultSpecifier : deviceName) + '\n'); - - ALC.Context context = alc.alcCreateContext(device, new int[] {0}); - alc.alcMakeContextCurrent(context); - // Check for an error. - if (alc.alcGetError(device) != ALC.ALC_NO_ERROR) { - Com.DPrintf("Error with SoundDevice"); - } - } - - void exitOpenAL() { - // Get the current context. - ALC.Context curContext = alc.alcGetCurrentContext(); - // Get the device used by that context. - ALC.Device curDevice = alc.alcGetContextsDevice(curContext); - // Reset the current context to NULL. - alc.alcMakeContextCurrent(null); - // Release the context and the device. - alc.alcDestroyContext(curContext); - alc.alcCloseDevice(curDevice); - } - - private void initChannels() { - - // create channels - channels = new Channel[MAX_CHANNELS]; - - int sourceId; - for (int i = 0; i < MAX_CHANNELS; i++) { - sourceId = sources[i]; - channels[i] = new Channel(sourceId); - - // set default values for AL sources - al.alSourcef (sourceId, AL.AL_GAIN, s_volume.value); - al.alSourcef (sourceId, AL.AL_PITCH, 1.0f); - al.alSourcei (sourceId, AL.AL_SOURCE_ABSOLUTE, AL.AL_TRUE); - al.alSourcefv(sourceId, AL.AL_VELOCITY, NULLVECTOR); - al.alSourcei (sourceId, AL.AL_LOOPING, AL.AL_FALSE); - al.alSourcef (sourceId, AL.AL_REFERENCE_DISTANCE, 300.0f); - al.alSourcef (sourceId, AL.AL_MIN_GAIN, 0.0005f); - al.alSourcef (sourceId, AL.AL_MAX_GAIN, 1.0f); - } - } - - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#RegisterSound(jake2.sound.sfx_t) - */ - private void initBuffer(sfx_t sfx) - { - if (sfx.cache == null ) { - //System.out.println(sfx.name + " " + sfx.cache.length+ " " + sfx.cache.loopstart + " " + sfx.cache.speed + " " + sfx.cache.stereo + " " + sfx.cache.width); - return; - } - - int format = AL.AL_FORMAT_MONO16; - byte[] data = sfx.cache.data; - int freq = sfx.cache.speed; - int size = data.length; - -// if (buffers[sfx.id] != 0) -// al.alDeleteBuffers(1, new int[] {buffers[sfx.id] }); -// -// int[] bid = new int[1]; -// al.alBufferData( bid[0], format, data, size, freq); -// buffers[sfx.id] = bid[0]; -// al.alBufferData( bid[0], format, data, size, freq); - - al.alBufferData( buffers[sfx.id], format, data, size, freq); -// int error; -// if ((error = al.alGetError()) != AL.AL_NO_ERROR) { -// String message; -// switch(error) { -// case AL.AL_INVALID_OPERATION: message = "invalid operation"; break; -// case AL.AL_INVALID_VALUE: message = "invalid value"; break; -// case AL.AL_INVALID_ENUM: message = "invalid enum"; break; -// case AL.AL_INVALID_NAME: message = "invalid name"; break; -// default: message = "" + error; -// } -// Com.DPrintf("Error Buffer " + sfx.id + ": " + sfx.name + " (" + size + ") --> " + message + '\n'); -// } - } - - private void checkError() { - int error; - if ((error = al.alGetError()) != AL.AL_NO_ERROR) { - String message; - switch(error) { - case AL.AL_INVALID_OPERATION: message = "invalid operation"; break; - case AL.AL_INVALID_VALUE: message = "invalid value"; break; - case AL.AL_INVALID_ENUM: message = "invalid enum"; break; - case AL.AL_INVALID_NAME: message = "invalid name"; break; - default: message = "" + error; - } - Com.DPrintf("AL Error: " + message +'\n'); - } - } - - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#Shutdown() - */ - public void Shutdown() { - StopAllSounds(); - al.alDeleteSources(sources.length, sources); - al.alDeleteBuffers(buffers.length, buffers); - exitOpenAL(); - //ALut.alutExit(); - Cmd.RemoveCommand("play"); - Cmd.RemoveCommand("stopsound"); - Cmd.RemoveCommand("soundlist"); - Cmd.RemoveCommand("soundinfo"); - - // free all sounds - for (int i = 0; i < num_sfx; i++) { - if (known_sfx[i].name == null) - continue; - known_sfx[i].clear(); - } - num_sfx = 0; - } - - private final static float[] NULLVECTOR = {0, 0, 0}; - private float[] entityOrigin = {0, 0, 0}; - private float[] sourceOrigin = {0, 0, 0}; - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#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) { - - if (sfx == null) - return; - - if (sfx.name.charAt(0) == '*') - sfx = RegisterSexedSound(Globals.cl_entities[entnum].current, sfx.name); - - if (LoadSound(sfx) == null) - return; // can't load sound - - if (attenuation != Defines.ATTN_STATIC) - attenuation *= 0.5f; - - Channel ch = pickChannel(entnum, entchannel, buffers[sfx.id], attenuation); - - if (ch == null) return; - - if (entnum == Globals.cl.playernum + 1) { - ch.addListener(); - } else if (origin != null) { - ch.addFixed(origin); - } else { - ch.addDynamic(entnum); - } - } - - Channel pickChannel(int entnum, int entchannel, int bufferId, float rolloff) { - - Channel ch = null; - int state; - int i; - - for (i = 0; i < MAX_CHANNELS; i++) { - ch = channels[i]; - - if (entchannel != 0 && ch.entnum == entnum && ch.entchannel == entchannel) { - // always override sound from same entity - break; - } - - // don't let monster sounds override player sounds - if ((ch.entnum == Globals.cl.playernum+1) && (entnum != Globals.cl.playernum+1) && ch.bufferId != -1) - continue; - - // looking for a free AL source - if (!ch.active) { - break; - } - } - - if (i == MAX_CHANNELS) - return null; - - ch.entnum = entnum; - ch.entchannel = entchannel; - if (ch.bufferId != bufferId) { - ch.bufferId = bufferId; - ch.bufferChanged = true; - } - ch.rolloff = rolloff * 2; - ch.active = true; - ch.modified = true; - - return ch; - } - - private float[] listenerOrigin = {0, 0, 0}; - private float[] listenerOrientation = {0, 0, 0, 0, 0, 0}; - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#Update(float[], float[], float[], float[]) - */ - public void Update(float[] origin, float[] forward, float[] right, float[] up) { - - convertVector(origin, listenerOrigin); - al.alListenerfv(AL.AL_POSITION, listenerOrigin); - - convertOrientation(forward, up, listenerOrientation); - al.alListenerfv(AL.AL_ORIENTATION, listenerOrientation); - - AddLoopSounds(origin); - playChannels(listenerOrigin); - } - - Map looptable = new Hashtable(2 * MAX_CHANNELS); - - /* - ================== - 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 - ================== - */ - void AddLoopSounds(float[] listener) { - - if (Globals.cl_paused.value != 0.0f) { - removeUnusedLoopSounds(); - return; - } - - if (Globals.cls.state != Globals.ca_active) { - removeUnusedLoopSounds(); - return; - } - - if (!Globals.cl.sound_prepped) { - removeUnusedLoopSounds(); - return; - } - - Channel ch; - sfx_t sfx; - sfxcache_t sc; - int num; - entity_state_t ent; - Object key; - int sound = 0; - - for (int i=0 ; i<Globals.cl.frame.num_entities ; i++) { - num = (Globals.cl.frame.parse_entities + i)&(Defines.MAX_PARSE_ENTITIES-1); - ent = Globals.cl_parse_entities[num]; - sound = ent.sound; - - if (sound == 0) continue; - - key = new Integer(ent.number); - ch = (Channel)looptable.get(key); - - if (ch != null) { - // keep on looping - ch.autosound = true; - ch.origin = ent.origin; - continue; - } - - sfx = Globals.cl.sound_precache[sound]; - if (sfx == null) - continue; // bad sound effect - - sc = sfx.cache; - if (sc == null) - continue; - - // allocate a channel - ch = pickChannel(0, 0, buffers[sfx.id], 6); - if (ch == null) - break; - - ch.addFixed(ent.origin); - ch.autosound = true; - - looptable.put(key, ch); - al.alSourcei(ch.sourceId, AL.AL_LOOPING, AL.AL_TRUE); - } - - removeUnusedLoopSounds(); - - } - - void removeUnusedLoopSounds() { - Channel ch; - // stop unused loopsounds - for (Iterator iter = looptable.values().iterator(); iter.hasNext();) { - ch = (Channel)iter.next(); - if (!ch.autosound) { - al.alSourceStop(ch.sourceId); - al.alSourcei(ch.sourceId, AL.AL_LOOPING, AL.AL_FALSE); - iter.remove(); - ch.clear(); - } - } - } - - void playChannels(float[] listenerOrigin) { - - float[] sourceOrigin = {0, 0, 0}; - float[] entityOrigin = {0, 0, 0}; - Channel ch; - int sourceId; - int state; - - for (int i = 0; i < MAX_CHANNELS; i++) { - ch = channels[i]; - if (ch.active) { - sourceId = ch.sourceId; - - switch (ch.type) { - case Channel.LISTENER: - Math3D.VectorCopy(listenerOrigin, sourceOrigin); - break; - case Channel.DYNAMIC: - CL.GetEntitySoundOrigin(ch.entity, entityOrigin); - convertVector(entityOrigin, sourceOrigin); - break; - case Channel.FIXED: - convertVector(ch.origin, sourceOrigin); - break; - } - - if (ch.modified) { - if (ch.bufferChanged) - al.alSourcei (sourceId, AL.AL_BUFFER, ch.bufferId); - - al.alSourcef (sourceId, AL.AL_GAIN, s_volume.value); - al.alSourcef (sourceId, AL.AL_ROLLOFF_FACTOR, ch.rolloff); - al.alSourcefv(sourceId, AL.AL_POSITION, sourceOrigin); - al.alSourcePlay(sourceId); - ch.modified = false; - } else { - state = al.alGetSourcei(ch.sourceId, AL.AL_SOURCE_STATE); - if (state == AL.AL_PLAYING) { - al.alSourcefv(sourceId, AL.AL_POSITION, sourceOrigin); - } else { - ch.clear(); - } - } - ch.autosound = false; - } - } - } - - - /* (non-Javadoc) - * @see jake2.sound.SoundImpl#StopAllSounds() - */ - public void StopAllSounds() { - for (int i = 0; i < MAX_CHANNELS; i++) { - al.alSourceStop(sources[i]); - al.alSourcei(sources[i], AL.AL_BUFFER, 0); - channels[i].clear(); - } - } - - static void convertVector(float[] from, float[] to) { - to[0] = from[0]; - to[1] = from[2]; - to[2] = -from[1]; - } - - static void convertOrientation(float[] forward, float[] up, float[] orientation) { - orientation[0] = forward[0]; - orientation[1] = forward[2]; - orientation[2] = -forward[1]; - orientation[3] = up[0]; - orientation[4] = up[2]; - orientation[5] = -up[1]; - } - - /* (non-Javadoc) - * @see jake2.sound.Sound#getName() - */ - public String getName() { - return "joal"; - } - - - int s_registration_sequence; - boolean s_registering; - - /* (non-Javadoc) - * @see jake2.sound.Sound#BeginRegistration() - */ - public void BeginRegistration() { - s_registration_sequence++; - s_registering = true; - } - - /* (non-Javadoc) - * @see jake2.sound.Sound#RegisterSound(java.lang.String) - */ - public sfx_t RegisterSound(String name) { - sfx_t sfx = FindName(name, true); - sfx.registration_sequence = s_registration_sequence; - - if (!s_registering) - LoadSound(sfx); - - return sfx; - } - - /* (non-Javadoc) - * @see jake2.sound.Sound#EndRegistration() - */ - public 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 - sfx.clear(); - } - } - - // load everything in - for (i = 0; i < num_sfx; i++) { - sfx = known_sfx[i]; - if (sfx.name == null) - continue; - LoadSound(sfx); - } - - s_registering = false; - } - - 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 = Globals.CS_PLAYERSKINS + ent.number - 1; - if (Globals.cl.configstrings[n] != null) { - int p = Globals.cl.configstrings[n].indexOf('\\'); - if (p >= 0) { - p++; - model = Globals.cl.configstrings[n].substring(p); - //strcpy(model, p); - p = model.indexOf('/'); - if (p > 0) - model = model.substring(0, p); - } - } - // 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 = 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 = 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 = AliasName(sexedFilename, maleFilename); - } - } - - //System.out.println(sfx.name); - return sfx; - } - - - 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; - - sfx_t FindName(String name, boolean create) { - int i; - sfx_t sfx = null; - - if (name == null) - Com.Error(Defines.ERR_FATAL, "S_FindName: NULL\n"); - if (name.length() == 0) - Com.Error(Defines.ERR_FATAL, "S_FindName: empty name\n"); - - if (name.length() >= Defines.MAX_QPATH) - Com.Error(Defines.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(Defines.ERR_FATAL, "S_FindName: out of sfx_t"); - num_sfx++; - } - - sfx = known_sfx[i]; - sfx.clear(); - sfx.name = name; - sfx.registration_sequence = s_registration_sequence; - // cwei - sfx.id = i; - - return sfx; - } - - /* - ================== - S_AliasName - - ================== - */ - sfx_t AliasName(String aliasname, String truename) - { - sfx_t sfx = null; - String s; - int i; - - s = new String(truename); - - // find a free sfx - for (i=0 ; i < num_sfx ; i++) - if (known_sfx[i].name == null) - break; - - if (i == num_sfx) - { - if (num_sfx == MAX_SFX) - Com.Error(Defines.ERR_FATAL, "S_FindName: out of sfx_t"); - num_sfx++; - } - - sfx = known_sfx[i]; - sfx.clear(); - sfx.name = new String(aliasname); - sfx.registration_sequence = s_registration_sequence; - sfx.truename = s; - // cwei - sfx.id = i; - - return sfx; - } - - /* - ============== - S_LoadSound - ============== - */ - public sfxcache_t LoadSound(sfx_t s) { - sfxcache_t sc = WaveLoader.LoadSound(s); - initBuffer(s); - return sc; - } - - /* (non-Javadoc) - * @see jake2.sound.Sound#StartLocalSound(java.lang.String) - */ - public void StartLocalSound(String sound) { - sfx_t sfx; - - sfx = RegisterSound(sound); - if (sfx == null) { - Com.Printf("S_StartLocalSound: can't cache " + sound + "\n"); - return; - } - StartSound(null, Globals.cl.playernum + 1, 0, sfx, 1, 1, 0); - } - - /* (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) { - // TODO implement RawSamples - } - - /* - =============================================================================== - - console functions - - =============================================================================== - */ - - 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 = RegisterSound(name); - StartSound(null, Globals.cl.playernum + 1, 0, sfx, 1.0f, 1.0f, 0.0f); - i++; - } - } - - 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"); - } - - void SoundInfo_f() { - - Com.Printf("%5d stereo\n", new Vargs(1).add(1)); - Com.Printf("%5d samples\n", new Vargs(1).add(22050)); - Com.Printf("%5d samplebits\n", new Vargs(1).add(16)); - Com.Printf("%5d speed\n", new Vargs(1).add(44100)); - } - -} diff --git a/src/jake2/sound/sfx_t.java b/src/jake2/sound/sfx_t.java deleted file mode 100644 index 992c0e7..0000000 --- a/src/jake2/sound/sfx_t.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * sfx_t.java - * Copyright (C) 2004 - * - * $Id: sfx_t.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. - -*/ - -// Created on 28.11.2003 by RST. - -package jake2.sound; - - -public class sfx_t { - 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/sound/sfxcache_t.java b/src/jake2/sound/sfxcache_t.java deleted file mode 100644 index 7f4428a..0000000 --- a/src/jake2/sound/sfxcache_t.java +++ /dev/null @@ -1,37 +0,0 @@ -/* -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 28.11.2003 by RST. -// $Id: sfxcache_t.java,v 1.1 2004-07-08 20:56:49 hzi Exp $ - -package jake2.sound; - -public class sfxcache_t { - 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 deleted file mode 100644 index 2c9e6c6..0000000 --- a/src/jake2/sound/soundinfo_t.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 deleted file mode 100644 index 76a28fc..0000000 --- a/src/jake2/sound/wavinfo_t.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 -} |