ADD: Basic Sounds

This commit is contained in:
sebastian 2026-08-04 17:01:36 +02:00
parent 01e74fe40e
commit a5a97d141e
13 changed files with 264 additions and 11 deletions

View File

@ -83,6 +83,29 @@ target_link_libraries(imgui PUBLIC glfw glad)
add_library(glad STATIC third_party/glad/src/glad.c) add_library(glad STATIC third_party/glad/src/glad.c)
target_include_directories(glad PUBLIC third_party/glad/include) target_include_directories(glad PUBLIC third_party/glad/include)
# --- OpenAL-Soft ---
CPMAddPackage(
NAME openal-soft
GITHUB_REPOSITORY kcat/openal-soft
GIT_TAG 1.24.3
OPTIONS
"LIBTYPE STATIC"
"ALSOFT_UTILS OFF"
"ALSOFT_EXAMPLES OFF"
"ALSOFT_TESTS OFF"
"ALSOFT_INSTALL OFF"
)
# --- dr_libs (dr_wav.h, dr_mp3.h header-only) ---
CPMAddPackage(
NAME dr_libs
GITHUB_REPOSITORY mackron/dr_libs
GIT_TAG master
DOWNLOAD_ONLY YES
)
message(STATUS "dr_libs_SOURCE_DIR = ${dr_libs_SOURCE_DIR}")
# Engine als statische Lib # Engine als statische Lib
add_library(Engine STATIC add_library(Engine STATIC
engine/src/core/Window.h engine/src/core/Window.h
@ -102,8 +125,6 @@ add_library(Engine STATIC
engine/src/utils/openglWrapper/openglObjects/Vao.h engine/src/utils/openglWrapper/openglObjects/Vao.h
engine/src/utils/openglWrapper/shader/ShaderProgram.cpp engine/src/utils/openglWrapper/shader/ShaderProgram.cpp
engine/src/utils/openglWrapper/shader/ShaderProgram.h engine/src/utils/openglWrapper/shader/ShaderProgram.h
engine/src/renderer/primitives/CubeFactory.cpp
engine/src/renderer/primitives/CubeFactory.h
engine/src/renderer/primitives/SphereFactory.cpp engine/src/renderer/primitives/SphereFactory.cpp
engine/src/renderer/primitives/SphereFactory.h engine/src/renderer/primitives/SphereFactory.h
engine/src/utils/openglWrapper/shader/Uniform.cpp engine/src/utils/openglWrapper/shader/Uniform.cpp
@ -170,19 +191,22 @@ add_library(Engine STATIC
engine/src/loader/models/AABB.h engine/src/loader/models/AABB.h
engine/src/loader/models/Ray.h engine/src/loader/models/Ray.h
engine/src/ecs/standardComponents/HighlightComponent.h engine/src/ecs/standardComponents/HighlightComponent.h
third_party/audio_impl.cpp
engine/src/core/audio/AudioDevice.cpp
engine/src/core/audio/AudioDevice.h
engine/src/core/audio/SoundBuffer.cpp
engine/src/core/audio/SoundBuffer.h
engine/src/core/audio/SoundSource.cpp
engine/src/core/audio/SoundSource.h
) )
target_include_directories(Engine PUBLIC engine/src) target_include_directories(Engine PUBLIC engine/src ${dr_libs_SOURCE_DIR})
target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui spdlog::spdlog tinyobjloader stb_image) target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui spdlog::spdlog tinyobjloader stb_image OpenAL::OpenAL)
# --- Executable --- # --- Executable ---
add_executable(ColorRace add_executable(ColorRace
game/src/main.cpp game/src/main.cpp
game/src/ColorRaceApp.cpp game/src/ColorRaceApp.cpp
game/src/ColorRaceApp.h game/src/ColorRaceApp.h
engine/src/renderer/model/RawModel.cpp
engine/src/renderer/model/RawModel.h
engine/src/renderer/entities/Entity.cpp
engine/src/renderer/entities/Entity.h
engine/src/renderer/shader/StaticShader.cpp engine/src/renderer/shader/StaticShader.cpp
engine/src/renderer/shader/StaticShader.h engine/src/renderer/shader/StaticShader.h
engine/src/renderer/entities/Camera.cpp engine/src/renderer/entities/Camera.cpp

Binary file not shown.

View File

@ -0,0 +1,24 @@
//
// Created by sebastian on 04.08.26.
//
#include "AudioDevice.h"
engine::audio::AudioDevice::AudioDevice() {
m_device = alcOpenDevice(nullptr);
if (!m_device) {
throw std::runtime_error("Kein Audio-Device gefunden");
}
m_context = alcCreateContext(m_device, nullptr);
if (!m_context) {
throw std::runtime_error("Kein Audio-Context gefunden");
}
alcMakeContextCurrent(m_context);
}
engine::audio::AudioDevice::~AudioDevice() {
alcMakeContextCurrent(nullptr);
if (m_context) alcDestroyContext(m_context);
if (m_device) alcCloseDevice(m_device);
}

View File

@ -0,0 +1,37 @@
//
// Created by sebastian on 04.08.26.
//
#ifndef COLORRACE_AUDIODEVICE_H
#define COLORRACE_AUDIODEVICE_H
#include <iostream>
#include <ostream>
#include "al.h"
#include "alc.h"
namespace engine::audio {
class AudioDevice {
public:
AudioDevice();
~AudioDevice();
// Kein Kopieren/Verschieben nötig für den Anfang
AudioDevice(const AudioDevice&) = delete;
AudioDevice& operator=(const AudioDevice&) = delete;
private:
ALCdevice* m_device = nullptr;
ALCcontext* m_context = nullptr;
};
inline void checkAlError(const char* location) {
ALenum err = alGetError();
if (err != AL_NO_ERROR) {
std::cerr << "OpenAL Error: " << alGetString(err) << " at " << location << std::endl;
}
}
}
#endif //COLORRACE_AUDIODEVICE_H

View File

@ -0,0 +1,37 @@
//
// Created by sebastian on 04.08.26.
//
#include "SoundBuffer.h"
#include <dr_wav.h>
#include <stdexcept>
#include "AudioDevice.h"
namespace engine::audio {
SoundBuffer::SoundBuffer(const std::string &path) {
unsigned int channels, sampleRate;
drwav_uint64 frameCount;
drwav_int16* pcmData = drwav_open_file_and_read_pcm_frames_s16(
path.c_str(), &channels, &sampleRate, &frameCount, nullptr
);
if (!pcmData) {
throw std::runtime_error("Failed to load sound file: " + path);
}
ALenum format = (channels == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
drwav_uint64 dataSize = frameCount * channels * sizeof(drwav_int16);
alGenBuffers(1, &m_bufferID);
alBufferData(m_bufferID, format, pcmData, dataSize, sampleRate);
checkAlError("alBufferData");
drwav_free(pcmData, nullptr);
}
SoundBuffer::~SoundBuffer() {
if (m_bufferID) alDeleteBuffers(1, &m_bufferID);
}
} // engine

View File

@ -0,0 +1,28 @@
//
// Created by sebastian on 04.08.26.
//
#ifndef COLORRACE_SOUNDBUFFER_H
#define COLORRACE_SOUNDBUFFER_H
#include <string>
#include "al.h"
namespace engine::audio {
class SoundBuffer {
public:
explicit SoundBuffer(const std::string& path);
~SoundBuffer();
SoundBuffer(const SoundBuffer&) = delete;
SoundBuffer& operator=(const SoundBuffer&) = delete;
ALuint id() const {
return m_bufferID;
}
private:
ALuint m_bufferID = 0;
};
} // engine
#endif //COLORRACE_SOUNDBUFFER_H

View File

@ -0,0 +1,8 @@
//
// Created by sebastian on 04.08.26.
//
#include "SoundSource.h"
namespace engine {
} // engine

View File

@ -0,0 +1,64 @@
//
// Created by sebastian on 04.08.26.
//
#ifndef COLORRACE_SOUNDSOURCE_H
#define COLORRACE_SOUNDSOURCE_H
#include "al.h"
#include "AudioDevice.h"
#include "SoundBuffer.h"
namespace engine::audio {
class SoundSource {
public:
SoundSource() {
alGenSources(1, &m_source);
}
~SoundSource() {
if (m_source) alDeleteSources(1, &m_source);
}
SoundSource(const SoundSource&) = delete;
SoundSource& operator=(const SoundSource&) = delete;
void setBuffer(const SoundBuffer& buffer) {
alSourcei(m_source, AL_BUFFER, static_cast<ALint>(buffer.id()));
checkAlError("alSourcei(AL_BUFFER)");
}
void setPosition(float x, float y, float z) {
alSource3f(m_source, AL_POSITION, x, y, z);
}
void setGain(float gain) {
alSourcef(m_source, AL_GAIN, gain);
}
void setLooping(bool loop) {
alSourcei(m_source, AL_LOOPING, loop ? AL_TRUE : AL_FALSE);
}
void play() { alSourcePlay(m_source); }
void stop() { alSourceStop(m_source); }
bool isPlaying() const {
ALint state;
alGetSourcei(m_source, AL_SOURCE_STATE, &state);
return state == AL_PLAYING;
}
private:
ALuint m_source = 0;
};
inline void updateListener(float px, float py, float pz,
float fx, float fy, float fz,
float ux, float uy, float uz) {
alListener3f(AL_POSITION, px, py, pz);
ALfloat orientation[] = { fx, fy, fz, ux, uy, uz };
alListenerfv(AL_ORIENTATION, orientation);
}
} // engine
#endif //COLORRACE_SOUNDSOURCE_H

View File

@ -10,7 +10,6 @@
#include "glm/glm.hpp" #include "glm/glm.hpp"
#include "loader/models/Model.h" #include "loader/models/Model.h"
#include "model/RawModel.h"
namespace engine { namespace engine {
struct RenderCommand { struct RenderCommand {

View File

@ -13,7 +13,6 @@
#include "layer/SceneManager.h" #include "layer/SceneManager.h"
#include "renderer/MeshRenderer.h" #include "renderer/MeshRenderer.h"
#include "renderer/entities/Camera.h" #include "renderer/entities/Camera.h"
#include "renderer/primitives/CubeFactory.h"
#include "renderer/shader/StaticShader.h" #include "renderer/shader/StaticShader.h"
#include "utils/openglWrapper/GLRenderState.h" #include "utils/openglWrapper/GLRenderState.h"
#include "utils/openglWrapper/openglObjects/Vao.h" #include "utils/openglWrapper/openglObjects/Vao.h"

View File

@ -12,9 +12,11 @@
#include "ecs/standardComponents/TransformComponent.h" #include "ecs/standardComponents/TransformComponent.h"
#include "renderer/MeshRenderer.h" #include "renderer/MeshRenderer.h"
#include "renderer/MeshRenderSystem.h" #include "renderer/MeshRenderSystem.h"
#include "renderer/primitives/CubeFactory.h"
#define GLM_ENABLE_EXPERIMENTAL #define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/string_cast.hpp> #include <glm/gtx/string_cast.hpp>
#include "core/audio/SoundSource.h"
#include "GLFW/glfw3.h"
using namespace engine; using namespace engine;
void GameLayer::onAttachImpl() { void GameLayer::onAttachImpl() {
m_renderState.depthTesting = false; m_renderState.depthTesting = false;
@ -24,6 +26,12 @@ void GameLayer::onAttachImpl() {
m_cameraController = std::make_unique<engine::CameraController>(getInputStack(), getInputContext()); m_cameraController = std::make_unique<engine::CameraController>(getInputStack(), getInputContext());
m_piecePresenter.spawnPieces(m_gameMode->getState()); m_piecePresenter.spawnPieces(m_gameMode->getState());
try {
m_soundBuffer = std::make_unique<audio::SoundBuffer>("assets/sounds/rolling_dice.wav");
} catch (const std::exception& e) {
std::cerr <<"Audiofehler: " << e.what() << std::endl;
}
} }
void GameLayer::onDetachImpl() { void GameLayer::onDetachImpl() {
@ -80,7 +88,17 @@ void GameLayer::onUpdate(float deltaTime) {
} }
} }
if (getKeyboard().keyPressEvent(GLFW_KEY_P)) {
audio::SoundSource source;
source.setBuffer(*m_soundBuffer);
source.setPosition(0.0f, 0.0f, 0.0f);
source.setGain(1.0f);
source.play();
while (source.isPlaying()) {
}
}
} }
void GameLayer::onRender() { void GameLayer::onRender() {

View File

@ -6,6 +6,8 @@
#define COLORRACE_GAMELAYER_H #define COLORRACE_GAMELAYER_H
#include <utility> #include <utility>
#include "core/audio/AudioDevice.h"
#include "core/audio/SoundBuffer.h"
#include "core/inputsOutputs/controller/CameraController.h" #include "core/inputsOutputs/controller/CameraController.h"
#include "ecs/EntityRegistry.h" #include "ecs/EntityRegistry.h"
#include "ecs/systems/PickingSystem.h" #include "ecs/systems/PickingSystem.h"
@ -57,6 +59,10 @@ private:
std::vector<ludo::LudoAiController> aiControllers; std::vector<ludo::LudoAiController> aiControllers;
engine::audio::AudioDevice m_audioDevice;
std::unique_ptr<engine::audio::SoundBuffer> m_soundBuffer;
void renderHud(); void renderHud();
}; };

9
third_party/audio_impl.cpp vendored Normal file
View File

@ -0,0 +1,9 @@
//
// Created by sebastian on 04.08.26.
//
// audio_impl.cpp
#define DR_WAV_IMPLEMENTATION
#include "dr_wav.h"
#define STB_VORBIS_IMPLEMENTATION // falls du Vorbis nutzt
#include "stb_vorbis.c"