From 4663573cbc7ec677bb6a146b8a90a3e0ee76536f Mon Sep 17 00:00:00 2001 From: austin Date: Tue, 26 Oct 2021 18:21:30 -0400 Subject: [PATCH] closes #29 --- assets/Audio/MenuStartup.ogg | Bin 0 -> 13799 bytes .../java/electrosphere/audio/AudioBuffer.java | 12 ++- .../java/electrosphere/audio/AudioEngine.java | 36 ++++++-- .../electrosphere/audio/AudioListener.java | 5 +- .../java/electrosphere/audio/AudioUtils.java | 29 ++++++ .../electrosphere/engine/LoadingThread.java | 2 +- .../assetmanager/AssetDataStrings.java | 2 +- .../assetmanager/AssetManager.java | 86 +++++++++++++++++- src/main/java/electrosphere/main/Globals.java | 10 +- src/main/java/electrosphere/main/Main.java | 27 ++++++ .../electrosphere/renderer/ModelUtils.java | 2 +- .../renderer/ui/font/TextBox.java | 2 +- .../ui/layout/LayoutSchemeListScrollable.java | 2 +- .../ui/transparenttextbox/TextBox.java | 2 +- .../renderer/ui/widgets/TextInput.java | 2 +- 15 files changed, 199 insertions(+), 20 deletions(-) create mode 100644 assets/Audio/MenuStartup.ogg create mode 100644 src/main/java/electrosphere/audio/AudioUtils.java rename src/main/java/electrosphere/{renderer => engine}/assetmanager/AssetDataStrings.java (86%) rename src/main/java/electrosphere/{renderer => engine}/assetmanager/AssetManager.java (68%) diff --git a/assets/Audio/MenuStartup.ogg b/assets/Audio/MenuStartup.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f4f83ca880f067b83397740448592001d8365ff2 GIT binary patch literal 13799 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 bE@j8Z@g-FXk|$T@W1R3HC`&#ALPGxsyD+}I literal 0 HcmV?d00001 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;