From f25b07910ea2261697787690708d4d76bd0f2ab0 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Sun, 18 Mar 2007 15:17:39 +0000 Subject: [PATCH] Made so that only the owner of the source can change the status of it --- src/ei/engine/sound/Sound.java | 46 +++++- src/ei/engine/sound/SoundLoader.java | 163 +------------------ src/ei/engine/sound/SoundManager.java | 216 ++++++++++++++++++++++++++ 3 files changed, 260 insertions(+), 165 deletions(-) create mode 100644 src/ei/engine/sound/SoundManager.java diff --git a/src/ei/engine/sound/Sound.java b/src/ei/engine/sound/Sound.java index 14716f1..9784b05 100644 --- a/src/ei/engine/sound/Sound.java +++ b/src/ei/engine/sound/Sound.java @@ -8,9 +8,11 @@ import ei.engine.scene.Entity; * @author Kevin Glass */ public class Sound extends Entity{ + private static int soundId = 1; /** The buffer containing the sound */ private int buffer; - private int source; + private int sourceId; + private int id; /** * Create a new sound @@ -20,34 +22,66 @@ public class Sound extends Entity{ */ public Sound(String name, String ref) { super(name); - this.buffer = SoundLoader.getInstnace().loadSound(ref); + id = soundId; + soundId++; + this.buffer = SoundLoader.getInstnace().loadSound(ref); + } + + /** + * Returns the unique id of the object + * + * @return The id of the object + */ + public int getSoundId(){ + return id; + } + + /** + * Returns the source this object uses + * + * @return The id of the source + */ + public int getSourceId(){ + return sourceId; + } + + /** + * Returns the buffer of this object + * + * @return The buffer + */ + public int getBuffer(){ + return buffer; } /** * Play this sound as a sound effect + * */ public void play() { - source = SoundLoader.getInstnace().playSound(buffer, true); + sourceId = SoundManager.getInstnace().playSound(this, false); update(); } /** * Loop this sound + * */ public void loop() { - SoundLoader.getInstnace().playSound(buffer, true); + SoundManager.getInstnace().playSound(this, true); update(); } public void update() { //AL10.alSource(source.get(0), AL10.AL_POSITION, sourcePos); - SoundLoader.getInstnace().setSoundLocation( - source, getLocation().getX(),getLocation().getY(),0); + SoundManager.getInstnace().setSoundLocation( + this, getLocation().getX(),getLocation().getY(),0); } /** * unimplamented method + * */ public void render() {} } diff --git a/src/ei/engine/sound/SoundLoader.java b/src/ei/engine/sound/SoundLoader.java index f31a6ba..d83193e 100644 --- a/src/ei/engine/sound/SoundLoader.java +++ b/src/ei/engine/sound/SoundLoader.java @@ -3,14 +3,11 @@ package ei.engine.sound; import java.io.IOException; import java.io.InputStream; import java.nio.IntBuffer; -import java.util.ArrayList; import java.util.HashMap; import org.lwjgl.BufferUtils; import org.lwjgl.Sys; -import org.lwjgl.openal.AL; import org.lwjgl.openal.AL10; -import org.lwjgl.openal.OpenALException; import org.lwjgl.util.WaveData; import ei.engine.sound.decoders.OggData; @@ -24,149 +21,20 @@ import ei.engine.util.MultiPrintStream; * @author Ziver Koc */ public class SoundLoader { - /** The number of sound sources enabled - default 8 */ - public static final int MAX_SOURCES = 128; /** The single instance of this class */ private static SoundLoader instance = new SoundLoader(); - /** True if sound effects are turned on */ - private boolean soundsEnabled; /** The map of references to IDs of previously loaded sounds */ private HashMap loaded = new HashMap(); - /** The OpenGL AL sound sources */ - private ArrayList sources = new ArrayList(); /** * Create a new sound store */ private SoundLoader() { - init(); - } - - /** - * Indicate whether sound effects should be played - * - * @param sounds True if sound effects should be played - */ - public void setEnabled(boolean enabled) { - this.soundsEnabled = enabled; - } - - /** - * Check if sound effects are currently enabled - * - * @return True if sound effects are currently enabled - */ - public boolean isEnabled() { - return soundsEnabled; - } - - /** - * Initialise the sound effects stored. This must be called - * before anything else will work - */ - private void init() { - try { - AL.create(); - soundsEnabled = true; - } catch (Exception e) { - e.printStackTrace(); - MultiPrintStream.out.println(e); - soundsEnabled = false; - } + } - /** - * Play the specified buffer as a sound effect with the specified - * pitch and gain. - * - * @param buffer The ID of the buffer to play - * @param pitch The pitch to play at - * @param gain The gain to play at - * @return The id of the assigned source - */ - public int playSound(int buffer, boolean loop) { - if (soundsEnabled && buffer >= 0) { - int sourceId = getAvailableSource(); - if(sourceId >= 0){ - stopSound(sourceId); - MultiPrintStream.out.println("Playing sound: source="+sourceId+" buffer="+buffer); - - AL10.alSourcei(sources.get(sourceId), AL10.AL_BUFFER, buffer); - AL10.alSourcef(sources.get(sourceId), AL10.AL_PITCH, 1.0f); - AL10.alSourcef(sources.get(sourceId), AL10.AL_GAIN, 1.0f); - AL10.alSourcei(sources.get(sourceId), AL10.AL_LOOPING, (loop ? AL10.AL_TRUE : AL10.AL_FALSE) ); - - AL10.alSourcePlay(sources.get(sourceId)); - return sourceId; - } - } - return -1; - } - - /** - * Looks for a availablee source. Creates a source if - * necessary - * @return The source id - */ - private int getAvailableSource(){ - int source = -1; - MultiPrintStream.out.println("Sound sources: quantity="+sources.size()); - - //looking for a source that is not playing - for(int i=0; i= 0){ - MultiPrintStream.out.println("Stoping sound: source="+sourceId); - AL10.alSourceStop(sources.get(sourceId)); - } - } - - /** - * Specify the location of the sound - * @param sourceId The id of the source - * @param x The x axes - * @param y The y axes - * @param z The z axes - */ - public void setSoundLocation(int sourceId, float x, float y, float z){ - //specify where the sound is comming from by tree axes x,y and z - if(sourceId >= 0){ - AL10.alSource3f(sources.get(sourceId), AL10.AL_POSITION, x, y, z); - } - } - /** * Get the Sound based on a specified file path in the classpath * @@ -175,9 +43,9 @@ public class SoundLoader { * @throws IOException Indicates a failure to load the sound file */ public int loadSound(String ref){ - if (!soundsEnabled) { + if (!SoundManager.getInstnace().isEnabled()) { return -1; - } + } int buffer = -1; if (loaded.get(ref) != null) { @@ -215,7 +83,7 @@ public class SoundLoader { e.printStackTrace(); Sys.alert("ERROR", "Failed to load: "+ref+" - "+e.getMessage()); MultiPrintStream.out.println("Failed to load: "+ref+" - "+e.getMessage()); - soundsEnabled = false; + SoundManager.getInstnace().setEnabled(false); return -1; } } @@ -239,29 +107,6 @@ public class SoundLoader { } } - /** - * 1) Identify the error code. - * 2) Return the error as a string. - */ - public static String getALErrorString(int err) { - switch (err) { - case AL10.AL_NO_ERROR: - return "AL_NO_ERROR"; - case AL10.AL_INVALID_NAME: - return "AL_INVALID_NAME"; - case AL10.AL_INVALID_ENUM: - return "AL_INVALID_ENUM"; - case AL10.AL_INVALID_VALUE: - return "AL_INVALID_VALUE"; - case AL10.AL_INVALID_OPERATION: - return "AL_INVALID_OPERATION"; - case AL10.AL_OUT_OF_MEMORY: - return "AL_OUT_OF_MEMORY"; - default: - return "No such error code"; - } - } - /** * Get the single instance of this class * diff --git a/src/ei/engine/sound/SoundManager.java b/src/ei/engine/sound/SoundManager.java new file mode 100644 index 0000000..4de9bfc --- /dev/null +++ b/src/ei/engine/sound/SoundManager.java @@ -0,0 +1,216 @@ +package ei.engine.sound; + +import java.nio.IntBuffer; +import java.util.ArrayList; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.OpenALException; + +import ei.engine.util.MultiPrintStream; + +/** + * Responsible for holding and playing the sounds used in the game. + * + * @author Kevin Glass + * @author Ziver Koc + */ +public class SoundManager { + /** The number of sound sources enabled - default 8 */ + public static final int MAX_SOURCES = 128; + /** The single instance of this class */ + private static SoundManager instance = new SoundManager(); + + /** True if sound effects are turned on */ + private boolean enabled; + /** The OpenGL AL sound sources */ + private ArrayList sources = new ArrayList(); + + class SourceNode{ + int source; + int soundId; + + public SourceNode(int source, int sound){ + this.source = source; + this.soundId = sound; + } + } + + /** + * Create a new sound store + */ + private SoundManager() { + init(); + } + + /** + * Indicate whether sound effects should be played + * + * @param sounds True if sound effects should be played + */ + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + /** + * Check if sound effects are currently enabled + * + * @return True if sound effects are currently enabled + */ + public boolean isEnabled() { + return enabled; + } + + /** + * Initialise the sound effects stored. This must be called + * before anything else will work + */ + private void init() { + try { + AL.create(); + enabled = true; + } catch (Exception e) { + e.printStackTrace(); + MultiPrintStream.out.println(e); + enabled = false; + } + } + + /** + * Play the specified buffer as a sound effect with the specified + * pitch and gain. + * + * @param buffer The ID of the buffer to play + * @param pitch The pitch to play at + * @param gain The gain to play at + * @return The id of the assigned source + */ + public int playSound(Sound sound, boolean loop) { + if (enabled && sound.getBuffer() >= 0) { + int sourceId = getAvailableSource(); + if(sourceId >= 0){ + stopSound(sourceId); + MultiPrintStream.out.println("Playing sound: source="+sourceId+" buffer="+sound.getBuffer()); + + AL10.alSourcei(sources.get(sourceId).source, AL10.AL_BUFFER, sound.getBuffer()); + AL10.alSourcef(sources.get(sourceId).source, AL10.AL_PITCH, 1.0f); + AL10.alSourcef(sources.get(sourceId).source, AL10.AL_GAIN, 1.0f); + AL10.alSourcei(sources.get(sourceId).source, AL10.AL_LOOPING, (loop ? AL10.AL_TRUE : AL10.AL_FALSE) ); + + AL10.alSourcePlay(sources.get(sourceId).source); + sources.get(sourceId).soundId = sound.getSoundId(); + return sourceId; + } + } + return -1; + } + + /** + * Looks for a availablee source. Creates a source if + * necessary + * @return The source id + */ + private int getAvailableSource(){ + int source = -1; + MultiPrintStream.out.println("Sound sources: quantity="+sources.size()); + + //looking for a source that is not playing + for(int i=0; i= 0 && sources.get(sound.getSourceId()).soundId == sound.getSoundId()){ + MultiPrintStream.out.println("Stoping sound: source="+sound.getSourceId()); + AL10.alSourceStop(sources.get(sound.getSourceId()).source); + } + } + + /** + * Stops playing a sound + * @param sourceId The id of the source + */ + private void stopSound(int sourceId){ + if(sourceId >= 0){ + MultiPrintStream.out.println("Stoping sound: source="+sourceId); + AL10.alSourceStop(sources.get(sourceId).source); + } + } + + /** + * Specify the location of the sound + * @param sourceId The id of the source + * @param x The x axes + * @param y The y axes + * @param z The z axes + */ + public void setSoundLocation(Sound sound, float x, float y, float z){ + //specify where the sound is comming from by tree axes x,y and z + if(sound.getSourceId() >= 0 && sources.get(sound.getSourceId()).soundId == sound.getSoundId()){ + AL10.alSource3f(sources.get(sound.getSourceId()).source, AL10.AL_POSITION, x, y, z); + } + } + + /** + * 1) Identify the error code. + * 2) Return the error as a string. + */ + public static String getALErrorString(int err) { + switch (err) { + case AL10.AL_NO_ERROR: + return "AL_NO_ERROR"; + case AL10.AL_INVALID_NAME: + return "AL_INVALID_NAME"; + case AL10.AL_INVALID_ENUM: + return "AL_INVALID_ENUM"; + case AL10.AL_INVALID_VALUE: + return "AL_INVALID_VALUE"; + case AL10.AL_INVALID_OPERATION: + return "AL_INVALID_OPERATION"; + case AL10.AL_OUT_OF_MEMORY: + return "AL_OUT_OF_MEMORY"; + default: + return "No such error code"; + } + } + + /** + * Get the single instance of this class + * + * @return The single instnace of this class + */ + public static SoundManager getInstnace() { + if(instance == null){ + instance = new SoundManager(); + } + return instance; + } +}