📄 joalsoundimpl.java
字号:
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; // 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 = null; 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) return sfx; // // fall back strategies // // not found , so see if it exists if (FS.FileLength(sexedFilename.substring(1)) > 0) { // yes, register it return RegisterSound(sexedFilename); } // try it with the female sound in the pak0.pak if (model.equalsIgnoreCase("female")) { String femaleFilename = "player/female/" + base.substring(1); if (FS.FileLength("sound/" + femaleFilename) > 0) return AliasName(sexedFilename, femaleFilename); } // no chance, revert to the male sound in the pak0.pak String maleFilename = "player/male/" + base.substring(1); return AliasName(sexedFilename, maleFilename); } 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; sfx.bufferId = 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; // set the AL bufferId sfx.bufferId = i; return sfx; } /* ============== S_LoadSound ============== */ public sfxcache_t LoadSound(sfx_t s) { if (s.isCached) return s.cache; sfxcache_t sc = WaveLoader.LoadSound(s); if (sc != null) { initBuffer(sc.data, s.bufferId, sc.speed); s.isCached = true; // free samples for GC s.cache.data = null; } return sc; } /* (non-Javadoc) * @see jake2.sound.Sound#StartLocalSound(java.lang.String) */ public void StartLocalSound(String sound) { sfx_t 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.0f); } private ShortBuffer streamBuffer = sfxDataBuffer.slice().order(ByteOrder.BIG_ENDIAN).asShortBuffer(); /* (non-Javadoc) * @see jake2.sound.Sound#RawSamples(int, int, int, int, byte[]) */ public void RawSamples(int samples, int rate, int width, int channels, ByteBuffer data) { int format; if (channels == 2) { format = (width == 2) ? AL.AL_FORMAT_STEREO16 : AL.AL_FORMAT_STEREO8; } else { format = (width == 2) ? AL.AL_FORMAT_MONO16 : AL.AL_FORMAT_MONO8; } // convert to signed 16 bit samples if (format == AL.AL_FORMAT_MONO8) { ShortBuffer sampleData = streamBuffer; int value; for (int i = 0; i < samples; i++) { value = (data.get(i) & 0xFF) - 128; sampleData.put(i, (short) value); } format = AL.AL_FORMAT_MONO16; width = 2; data = sfxDataBuffer.slice(); } Channel.updateStream(data, samples * channels * width, format, rate); } public void disableStreaming() { Channel.disableStreaming(); } /* =============================================================================== console functions =============================================================================== */ void Play() { int i = 1; String name; while (i < Cmd.Argc()) { name = new String(Cmd.Argv(i)); if (name.indexOf('.') == -1) name += ".wav"; RegisterSound(name); StartLocalSound(name); 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)); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -