diff --git a/assets/Audio/MenuStartup.ogg b/assets/Audio/MenuStartup.ogg new file mode 100644 index 00000000..f4f83ca8 Binary files /dev/null and b/assets/Audio/MenuStartup.ogg differ diff --git a/src/main/java/electrosphere/audio/AudioBuffer.java b/src/main/java/electrosphere/audio/AudioBuffer.java index 6272ef15..693aea8e 100644 --- a/src/main/java/electrosphere/audio/AudioBuffer.java +++ b/src/main/java/electrosphere/audio/AudioBuffer.java @@ -1,5 +1,7 @@ package electrosphere.audio; +import electrosphere.logger.LoggerInterface; +import electrosphere.util.FileUtils; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; @@ -28,12 +30,15 @@ public class AudioBuffer { private ShortBuffer pcm = null; - public AudioBuffer(String fileName) throws Exception { + public AudioBuffer(String fileName) { bufferId = alGenBuffers(); try (STBVorbisInfo info = STBVorbisInfo.malloc()) { ShortBuffer pcm = readVorbis(fileName, 32 * 1024, info); // Copy to buffer alBufferData(bufferId, info.channels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, pcm, info.sample_rate()); + } catch (Exception e){ + LoggerInterface.loggerEngine.ERROR("Failed to load audio", e); +// e.printStackTrace(); } } @@ -73,8 +78,9 @@ public class AudioBuffer { } } else { try ( - InputStream source = AudioBuffer.class.getResourceAsStream(resource); - ReadableByteChannel rbc = Channels.newChannel(source)) { + InputStream source = FileUtils.getAssetFileAsStream(resource); + ReadableByteChannel rbc = Channels.newChannel(source) + ) { buffer = createByteBuffer(bufferSize); while (true) { diff --git a/src/main/java/electrosphere/audio/AudioEngine.java b/src/main/java/electrosphere/audio/AudioEngine.java index 2d872fea..b57cdbb5 100644 --- a/src/main/java/electrosphere/audio/AudioEngine.java +++ b/src/main/java/electrosphere/audio/AudioEngine.java @@ -1,11 +1,14 @@ package electrosphere.audio; +import electrosphere.logger.LoggerInterface; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import org.joml.Matrix4f; import org.lwjgl.openal.*; import static org.lwjgl.openal.ALC10.*; @@ -21,16 +24,26 @@ public class AudioEngine { private final List soundBufferList; private final Map soundSourceMap; - - private final Matrix4f cameraMatrix; + + + private float engineGain = 1.0f; + public AudioEngine() { - soundBufferList = new ArrayList<>(); - soundSourceMap = new HashMap<>(); - cameraMatrix = new Matrix4f(); + soundBufferList = new ArrayList(); + soundSourceMap = new HashMap(); } - public void init() throws Exception { + public void init() { + try { + initDevice(); + } catch (Exception ex) { + LoggerInterface.loggerEngine.ERROR("Error initializing audio device", ex); + } + listener = new AudioListener(); + } + + void initDevice() throws Exception{ this.device = alcOpenDevice((ByteBuffer) null); if (device == NULL) { throw new IllegalStateException("Failed to open the default OpenAL device."); @@ -43,4 +56,15 @@ public class AudioEngine { alcMakeContextCurrent(context); AL.createCapabilities(deviceCaps); } + + + public void setGain(float gain){ + engineGain = gain; + } + + public float getGain(){ + return engineGain; + } + + } diff --git a/src/main/java/electrosphere/audio/AudioListener.java b/src/main/java/electrosphere/audio/AudioListener.java index 2de5b51b..7dd34215 100644 --- a/src/main/java/electrosphere/audio/AudioListener.java +++ b/src/main/java/electrosphere/audio/AudioListener.java @@ -9,12 +9,15 @@ import static org.lwjgl.openal.AL10.*; */ public class AudioListener { + Vector3f position; + public AudioListener() { this(new Vector3f(0, 0, 0)); } public AudioListener(Vector3f position) { - alListener3f(AL_POSITION, position.x, position.y, position.z); + this.position = position; + alListener3f(AL_POSITION, this.position.x, this.position.y, this.position.z); alListener3f(AL_VELOCITY, 0, 0, 0); } diff --git a/src/main/java/electrosphere/audio/AudioUtils.java b/src/main/java/electrosphere/audio/AudioUtils.java new file mode 100644 index 00000000..f6fb9843 --- /dev/null +++ b/src/main/java/electrosphere/audio/AudioUtils.java @@ -0,0 +1,29 @@ +package electrosphere.audio; + +import electrosphere.logger.LoggerInterface; +import electrosphere.main.Globals; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class AudioUtils { + + + public static AudioSource playAudioAtLocation(String audioFile, Vector3f position){ + AudioSource rVal = null; + AudioBuffer buffer = Globals.assetManager.fetchAudio(audioFile); + if(buffer != null){ + rVal = new AudioSource(false,false); + rVal.setBuffer(buffer.getBufferId()); + rVal.setGain(Globals.audioEngine.getGain()); + rVal.setPosition(position); + rVal.play(); + } else { + LoggerInterface.loggerEngine.WARNING("Failed to start audio in playAudioAtLocation"); + } + return rVal; + } + +} diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index 45073233..9bd77dce 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -41,7 +41,7 @@ import electrosphere.net.server.Server; import electrosphere.renderer.ActorUtils; import electrosphere.renderer.Model; import electrosphere.renderer.RenderUtils; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/electrosphere/renderer/assetmanager/AssetDataStrings.java b/src/main/java/electrosphere/engine/assetmanager/AssetDataStrings.java similarity index 86% rename from src/main/java/electrosphere/renderer/assetmanager/AssetDataStrings.java rename to src/main/java/electrosphere/engine/assetmanager/AssetDataStrings.java index 0924de4a..970052d1 100644 --- a/src/main/java/electrosphere/renderer/assetmanager/AssetDataStrings.java +++ b/src/main/java/electrosphere/engine/assetmanager/AssetDataStrings.java @@ -1,4 +1,4 @@ -package electrosphere.renderer.assetmanager; +package electrosphere.engine.assetmanager; /** * diff --git a/src/main/java/electrosphere/renderer/assetmanager/AssetManager.java b/src/main/java/electrosphere/engine/assetmanager/AssetManager.java similarity index 68% rename from src/main/java/electrosphere/renderer/assetmanager/AssetManager.java rename to src/main/java/electrosphere/engine/assetmanager/AssetManager.java index a6e8c444..1e183fdc 100644 --- a/src/main/java/electrosphere/renderer/assetmanager/AssetManager.java +++ b/src/main/java/electrosphere/engine/assetmanager/AssetManager.java @@ -1,5 +1,6 @@ -package electrosphere.renderer.assetmanager; +package electrosphere.engine.assetmanager; +import electrosphere.audio.AudioBuffer; import electrosphere.renderer.Model; import electrosphere.renderer.texture.Texture; import electrosphere.util.ModelLoader; @@ -22,6 +23,18 @@ public class AssetManager { ConcurrentHashMap texturesLoadedIntoMemory = new ConcurrentHashMap(); CopyOnWriteArrayList texturesInQueue = new CopyOnWriteArrayList(); + ConcurrentHashMap audioLoadedIntoMemory = new ConcurrentHashMap(); + CopyOnWriteArrayList audioInQueue = new CopyOnWriteArrayList(); + + + + + + + // + //General asset manager stuff + // + public void loadAssetsInQueue(){ for(String currentPath : modelsInQueue){ modelsInQueue.remove(currentPath); @@ -31,8 +44,25 @@ public class AssetManager { texturesInQueue.remove(currentPath); texturesLoadedIntoMemory.put(currentPath, new Texture(currentPath)); } + for(String currentPath : audioInQueue){ + audioInQueue.remove(currentPath); + audioLoadedIntoMemory.put(currentPath, new AudioBuffer(currentPath)); + } } + + + + + + + + + + // + //Models + // + public void addModelPathToQueue(String path){ if(!modelsInQueue.contains(path) && !modelsLoadedIntoMemory.containsKey(path)){ modelsInQueue.add(path); @@ -63,6 +93,23 @@ public class AssetManager { modelsLoadedIntoMemory.put(s,m); } + + + + + + + + + + + + + // + // Textures + // + + public void addTexturePathtoQueue(String path){ if(!texturesInQueue.contains(path) && !texturesLoadedIntoMemory.containsKey(path)){ texturesInQueue.add(path); @@ -84,4 +131,41 @@ public class AssetManager { texturesLoadedIntoMemory.put(rVal,t); return rVal; } + + + + + + + + + + // + //AUDIO + // + + public void addAudioPathToQueue(String path){ + if(!audioInQueue.contains(path) && !audioLoadedIntoMemory.containsKey(path)){ + audioInQueue.add(path); + } + } + + public AudioBuffer fetchAudio(String path){ + AudioBuffer rVal = null; + if(audioLoadedIntoMemory.containsKey(path)){ + rVal = audioLoadedIntoMemory.get(path); + } + return rVal; + } + + + + + + + + + + + } diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 3cb71c33..778d99a9 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -7,6 +7,7 @@ import electrosphere.renderer.Model; import electrosphere.renderer.texture.Texture; import electrosphere.renderer.texture.TextureMap; import com.google.gson.Gson; +import electrosphere.audio.AudioEngine; import electrosphere.controls.ControlHandler; import electrosphere.entity.Entity; import electrosphere.entity.EntityManager; @@ -43,8 +44,8 @@ import electrosphere.renderer.ModelUtils; import electrosphere.renderer.RenderUtils; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.ShaderProgram; -import electrosphere.renderer.assetmanager.AssetDataStrings; -import electrosphere.renderer.assetmanager.AssetManager; +import electrosphere.engine.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetManager; import electrosphere.renderer.ui.WidgetManager; import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.font.FontUtils; @@ -82,6 +83,11 @@ public class Globals { // public static RenderingEngine renderingEngine; + // + //Audio Engine + // + public static AudioEngine audioEngine; + // //Client connection to server diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 414ab07e..25545b80 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -1,6 +1,9 @@ package electrosphere.main; import com.google.gson.Gson; +import electrosphere.audio.AudioEngine; +import electrosphere.audio.AudioSource; +import electrosphere.audio.AudioUtils; import electrosphere.controls.ControlHandler; import electrosphere.entity.CameraEntityUtils; import electrosphere.entity.types.creature.CreatureUtils; @@ -138,6 +141,25 @@ public class Main { // } // } +// if(1==1){ +// Globals.audioEngine = new AudioEngine(); +// Globals.audioEngine.init(); +// Globals.assetManager.addAudioPathToQueue("/Audio/MenuStartup.ogg"); +// Globals.assetManager.loadAssetsInQueue(); +// Globals.audioEngine.setGain(0.1f); +// AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuStartup.ogg", new Vector3f(3,0,0)); +// if(startupSound != null){ +// while(startupSound.isPlaying()){ +// try { +// TimeUnit.MILLISECONDS.sleep(10); +// } catch (InterruptedException ex) { +// ex.printStackTrace(); +// } +// } +// } +// System.exit(0); +// } + //debug: create terrain/world viewer @@ -147,6 +169,11 @@ public class Main { Globals.renderingEngine = new RenderingEngine(); Globals.renderingEngine.createOpenglContext(); + //create the audio context + Globals.audioEngine = new AudioEngine(); + Globals.audioEngine.init(); + Globals.audioEngine.setGain(0.1f); + //init default resources Globals.initDefaultGraphicalResources(); diff --git a/src/main/java/electrosphere/renderer/ModelUtils.java b/src/main/java/electrosphere/renderer/ModelUtils.java index cd359491..1a3205f4 100644 --- a/src/main/java/electrosphere/renderer/ModelUtils.java +++ b/src/main/java/electrosphere/renderer/ModelUtils.java @@ -1,7 +1,7 @@ package electrosphere.renderer; import electrosphere.main.Globals; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.renderer.texture.Texture; import java.nio.FloatBuffer; import java.nio.IntBuffer; diff --git a/src/main/java/electrosphere/renderer/ui/font/TextBox.java b/src/main/java/electrosphere/renderer/ui/font/TextBox.java index 8a973258..7ea0578d 100644 --- a/src/main/java/electrosphere/renderer/ui/font/TextBox.java +++ b/src/main/java/electrosphere/renderer/ui/font/TextBox.java @@ -2,7 +2,7 @@ package electrosphere.renderer.ui.font; import electrosphere.main.Globals; import electrosphere.renderer.Model; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.renderer.ui.Widget; import org.joml.Vector3f; diff --git a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java index 932c7c3e..0cfd883a 100644 --- a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java +++ b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java @@ -5,7 +5,7 @@ import electrosphere.renderer.Material; import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.ui.Widget; import electrosphere.renderer.Model; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.renderer.framebuffer.FramebufferUtils; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java b/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java index d5015c3c..60ec0abf 100644 --- a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java +++ b/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java @@ -2,7 +2,7 @@ package electrosphere.renderer.ui.transparenttextbox; import electrosphere.main.Globals; import electrosphere.renderer.Model; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.font.FontUtils; import org.joml.Vector3f; diff --git a/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java b/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java index 6f830dca..e669c50a 100644 --- a/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java +++ b/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java @@ -3,7 +3,7 @@ package electrosphere.renderer.ui.widgets; import electrosphere.main.Globals; import electrosphere.renderer.Material; import electrosphere.renderer.Model; -import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.texture.Texture;