This commit is contained in:
austin 2021-10-26 18:21:30 -04:00
parent 7bb796933c
commit 4663573cbc
15 changed files with 199 additions and 20 deletions

Binary file not shown.

View File

@ -1,5 +1,7 @@
package electrosphere.audio; package electrosphere.audio;
import electrosphere.logger.LoggerInterface;
import electrosphere.util.FileUtils;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@ -28,12 +30,15 @@ public class AudioBuffer {
private ShortBuffer pcm = null; private ShortBuffer pcm = null;
public AudioBuffer(String fileName) throws Exception { public AudioBuffer(String fileName) {
bufferId = alGenBuffers(); bufferId = alGenBuffers();
try (STBVorbisInfo info = STBVorbisInfo.malloc()) { try (STBVorbisInfo info = STBVorbisInfo.malloc()) {
ShortBuffer pcm = readVorbis(fileName, 32 * 1024, info); ShortBuffer pcm = readVorbis(fileName, 32 * 1024, info);
// Copy to buffer // Copy to buffer
alBufferData(bufferId, info.channels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, pcm, info.sample_rate()); 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 { } else {
try ( try (
InputStream source = AudioBuffer.class.getResourceAsStream(resource); InputStream source = FileUtils.getAssetFileAsStream(resource);
ReadableByteChannel rbc = Channels.newChannel(source)) { ReadableByteChannel rbc = Channels.newChannel(source)
) {
buffer = createByteBuffer(bufferSize); buffer = createByteBuffer(bufferSize);
while (true) { while (true) {

View File

@ -1,11 +1,14 @@
package electrosphere.audio; package electrosphere.audio;
import electrosphere.logger.LoggerInterface;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.lwjgl.openal.*; import org.lwjgl.openal.*;
import static org.lwjgl.openal.ALC10.*; import static org.lwjgl.openal.ALC10.*;
@ -21,16 +24,26 @@ public class AudioEngine {
private final List<AudioBuffer> soundBufferList; private final List<AudioBuffer> soundBufferList;
private final Map<String, AudioSource> soundSourceMap; private final Map<String, AudioSource> soundSourceMap;
private final Matrix4f cameraMatrix;
private float engineGain = 1.0f;
public AudioEngine() { public AudioEngine() {
soundBufferList = new ArrayList<>(); soundBufferList = new ArrayList();
soundSourceMap = new HashMap<>(); soundSourceMap = new HashMap();
cameraMatrix = new Matrix4f();
} }
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); this.device = alcOpenDevice((ByteBuffer) null);
if (device == NULL) { if (device == NULL) {
throw new IllegalStateException("Failed to open the default OpenAL device."); throw new IllegalStateException("Failed to open the default OpenAL device.");
@ -43,4 +56,15 @@ public class AudioEngine {
alcMakeContextCurrent(context); alcMakeContextCurrent(context);
AL.createCapabilities(deviceCaps); AL.createCapabilities(deviceCaps);
} }
public void setGain(float gain){
engineGain = gain;
}
public float getGain(){
return engineGain;
}
} }

View File

@ -9,12 +9,15 @@ import static org.lwjgl.openal.AL10.*;
*/ */
public class AudioListener { public class AudioListener {
Vector3f position;
public AudioListener() { public AudioListener() {
this(new Vector3f(0, 0, 0)); this(new Vector3f(0, 0, 0));
} }
public AudioListener(Vector3f position) { 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); alListener3f(AL_VELOCITY, 0, 0, 0);
} }

View File

@ -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;
}
}

View File

@ -41,7 +41,7 @@ import electrosphere.net.server.Server;
import electrosphere.renderer.ActorUtils; import electrosphere.renderer.ActorUtils;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.RenderUtils; import electrosphere.renderer.RenderUtils;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import java.util.Random; import java.util.Random;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;

View File

@ -1,4 +1,4 @@
package electrosphere.renderer.assetmanager; package electrosphere.engine.assetmanager;
/** /**
* *

View File

@ -1,5 +1,6 @@
package electrosphere.renderer.assetmanager; package electrosphere.engine.assetmanager;
import electrosphere.audio.AudioBuffer;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.texture.Texture; import electrosphere.renderer.texture.Texture;
import electrosphere.util.ModelLoader; import electrosphere.util.ModelLoader;
@ -22,6 +23,18 @@ public class AssetManager {
ConcurrentHashMap<String,Texture> texturesLoadedIntoMemory = new ConcurrentHashMap(); ConcurrentHashMap<String,Texture> texturesLoadedIntoMemory = new ConcurrentHashMap();
CopyOnWriteArrayList<String> texturesInQueue = new CopyOnWriteArrayList(); CopyOnWriteArrayList<String> texturesInQueue = new CopyOnWriteArrayList();
ConcurrentHashMap<String,AudioBuffer> audioLoadedIntoMemory = new ConcurrentHashMap();
CopyOnWriteArrayList<String> audioInQueue = new CopyOnWriteArrayList();
//
//General asset manager stuff
//
public void loadAssetsInQueue(){ public void loadAssetsInQueue(){
for(String currentPath : modelsInQueue){ for(String currentPath : modelsInQueue){
modelsInQueue.remove(currentPath); modelsInQueue.remove(currentPath);
@ -31,8 +44,25 @@ public class AssetManager {
texturesInQueue.remove(currentPath); texturesInQueue.remove(currentPath);
texturesLoadedIntoMemory.put(currentPath, new Texture(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){ public void addModelPathToQueue(String path){
if(!modelsInQueue.contains(path) && !modelsLoadedIntoMemory.containsKey(path)){ if(!modelsInQueue.contains(path) && !modelsLoadedIntoMemory.containsKey(path)){
modelsInQueue.add(path); modelsInQueue.add(path);
@ -63,6 +93,23 @@ public class AssetManager {
modelsLoadedIntoMemory.put(s,m); modelsLoadedIntoMemory.put(s,m);
} }
//
// Textures
//
public void addTexturePathtoQueue(String path){ public void addTexturePathtoQueue(String path){
if(!texturesInQueue.contains(path) && !texturesLoadedIntoMemory.containsKey(path)){ if(!texturesInQueue.contains(path) && !texturesLoadedIntoMemory.containsKey(path)){
texturesInQueue.add(path); texturesInQueue.add(path);
@ -84,4 +131,41 @@ public class AssetManager {
texturesLoadedIntoMemory.put(rVal,t); texturesLoadedIntoMemory.put(rVal,t);
return rVal; 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;
}
} }

View File

@ -7,6 +7,7 @@ import electrosphere.renderer.Model;
import electrosphere.renderer.texture.Texture; import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.texture.TextureMap; import electrosphere.renderer.texture.TextureMap;
import com.google.gson.Gson; import com.google.gson.Gson;
import electrosphere.audio.AudioEngine;
import electrosphere.controls.ControlHandler; import electrosphere.controls.ControlHandler;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityManager; import electrosphere.entity.EntityManager;
@ -43,8 +44,8 @@ import electrosphere.renderer.ModelUtils;
import electrosphere.renderer.RenderUtils; import electrosphere.renderer.RenderUtils;
import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.ShaderProgram; import electrosphere.renderer.ShaderProgram;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.assetmanager.AssetManager; import electrosphere.engine.assetmanager.AssetManager;
import electrosphere.renderer.ui.WidgetManager; import electrosphere.renderer.ui.WidgetManager;
import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.WidgetUtils;
import electrosphere.renderer.ui.font.FontUtils; import electrosphere.renderer.ui.font.FontUtils;
@ -82,6 +83,11 @@ public class Globals {
// //
public static RenderingEngine renderingEngine; public static RenderingEngine renderingEngine;
//
//Audio Engine
//
public static AudioEngine audioEngine;
// //
//Client connection to server //Client connection to server

View File

@ -1,6 +1,9 @@
package electrosphere.main; package electrosphere.main;
import com.google.gson.Gson; import com.google.gson.Gson;
import electrosphere.audio.AudioEngine;
import electrosphere.audio.AudioSource;
import electrosphere.audio.AudioUtils;
import electrosphere.controls.ControlHandler; import electrosphere.controls.ControlHandler;
import electrosphere.entity.CameraEntityUtils; import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.types.creature.CreatureUtils; 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 //debug: create terrain/world viewer
@ -147,6 +169,11 @@ public class Main {
Globals.renderingEngine = new RenderingEngine(); Globals.renderingEngine = new RenderingEngine();
Globals.renderingEngine.createOpenglContext(); Globals.renderingEngine.createOpenglContext();
//create the audio context
Globals.audioEngine = new AudioEngine();
Globals.audioEngine.init();
Globals.audioEngine.setGain(0.1f);
//init default resources //init default resources
Globals.initDefaultGraphicalResources(); Globals.initDefaultGraphicalResources();

View File

@ -1,7 +1,7 @@
package electrosphere.renderer; package electrosphere.renderer;
import electrosphere.main.Globals; import electrosphere.main.Globals;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.texture.Texture; import electrosphere.renderer.texture.Texture;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;

View File

@ -2,7 +2,7 @@ package electrosphere.renderer.ui.font;
import electrosphere.main.Globals; import electrosphere.main.Globals;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.Widget;
import org.joml.Vector3f; import org.joml.Vector3f;

View File

@ -5,7 +5,7 @@ import electrosphere.renderer.Material;
import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.Widget;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.framebuffer.FramebufferUtils;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;

View File

@ -2,7 +2,7 @@ package electrosphere.renderer.ui.transparenttextbox;
import electrosphere.main.Globals; import electrosphere.main.Globals;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.Widget;
import electrosphere.renderer.ui.font.FontUtils; import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f; import org.joml.Vector3f;

View File

@ -3,7 +3,7 @@ package electrosphere.renderer.ui.widgets;
import electrosphere.main.Globals; import electrosphere.main.Globals;
import electrosphere.renderer.Material; import electrosphere.renderer.Material;
import electrosphere.renderer.Model; import electrosphere.renderer.Model;
import electrosphere.renderer.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.texture.Texture; import electrosphere.renderer.texture.Texture;