From 4f2f439d830f5988c57c43b1dfe12474846b9414 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Mon, 20 Jul 2026 16:58:59 +0800 Subject: [PATCH] feat(audio): add spatial voice source with underwater effects Update voice source to support spatial positioning, low-pass filter, and reverb effect for underwater immersion. Adjust source pool size and low-pass filter parameter. Correct receive_voice parameter type. --- assets/sound/ambient/water/bubble001.ogg | Bin 30671 -> 8860 bytes assets/sound/ambient/water/bubble002.ogg | Bin 16017 -> 5788 bytes include/Cubed/audio/audio_engine.hpp | 2 +- include/Cubed/audio/audio_stream_source.hpp | 13 ++++ src/audio/audio_engine.cpp | 18 +++-- src/audio/audio_stream_source.cpp | 71 ++++++++++++++++++++ 6 files changed, 96 insertions(+), 8 deletions(-) diff --git a/assets/sound/ambient/water/bubble001.ogg b/assets/sound/ambient/water/bubble001.ogg index af5354fc12e38b4e262e9dab0dddb84521dc2ec0..f3c32f5085e737821b5c2155f28141c37e3be23e 100644 GIT binary patch literal 8860 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 Q%NIwAM}KI6C!Wdw3+eC3H~;_u diff --git a/include/Cubed/audio/audio_engine.hpp b/include/Cubed/audio/audio_engine.hpp index 5adb6dd..1010ef2 100644 --- a/include/Cubed/audio/audio_engine.hpp +++ b/include/Cubed/audio/audio_engine.hpp @@ -48,7 +48,7 @@ public: void set_client(std::weak_ptr client); void send_voice(const std::array&); - void receive_voice(std::span opus, const glm::vec3& pos); + void receive_voice(std::span opus, const glm::vec3& pos); AudioRecording& audio_recording(); diff --git a/include/Cubed/audio/audio_stream_source.hpp b/include/Cubed/audio/audio_stream_source.hpp index 83dd401..72656fe 100644 --- a/include/Cubed/audio/audio_stream_source.hpp +++ b/include/Cubed/audio/audio_stream_source.hpp @@ -1,5 +1,9 @@ #pragma once +#include "Cubed/audio/audio_effect_slot.hpp" +#include "Cubed/audio/audio_filter.hpp" +#include "glm/ext/vector_float3.hpp" + #include #include #include @@ -19,6 +23,15 @@ public: void stop(); bool is_playing() const; + void reset(); + + void set_volume(float volume); + void set_pitch(float pitch); + void set_pos(glm::vec3 pos); + void set_filter(const AudioFilter& filter); + void clear_filter(); + void set_effect_slot(const AudioEffectSlot& slot); + void clear_effect_slot(); private: ALuint m_source = 0; diff --git a/src/audio/audio_engine.cpp b/src/audio/audio_engine.cpp index e3705c1..08b8744 100644 --- a/src/audio/audio_engine.cpp +++ b/src/audio/audio_engine.cpp @@ -80,7 +80,7 @@ void AudioEngine::init() { m_low_pass_filter = std::make_unique(); - m_low_pass_filter->set_lowpass(1.0f, 0.15f); + m_low_pass_filter->set_lowpass(1.0f, 0.1f); m_underwater_effect = std::make_unique(); m_underwater_effect->set_reverb(0.8f, 0.3162f, 0.01f); @@ -102,7 +102,7 @@ void AudioEngine::init() { m_bgm->set_buffer_2d(m_sounds.get_buffer("bgm/bgm001.mp3")); m_fade_map.try_emplace("bgm", m_bgm.get(), 5.0f, 2.0f); - + m_voice_source = std::make_unique(); ALCint max_mono = 0; alcGetIntegerv(device, ALC_MONO_SOURCES, 1, &max_mono); @@ -113,14 +113,12 @@ void AudioEngine::init() { } Logger::info("Set Source Pool Size {}", static_cast(max_mono)); - // Reserve a source for BGM - m_pool = std::make_shared(max_mono - 1); + // Reserve two sources for BGM and voice + m_pool = std::make_shared(max_mono - 2); Logger::info("Audio Engine Init Success"); m_init = true; - - m_voice_source = std::make_unique(); } void AudioEngine::play_bgm() { m_bgm->play(); } @@ -242,9 +240,13 @@ void AudioEngine::underwater_change(bool underwater) { } if (underwater) { m_bgm->set_filter(*m_low_pass_filter); + m_voice_source->set_filter(*m_low_pass_filter); + m_voice_source->set_effect_slot(*m_underwater_slot); } else { m_bgm->clear_filter(); + m_voice_source->clear_filter(); + m_voice_source->clear_effect_slot(); } Logger::info("Under Water Change {}", m_underwater); } @@ -279,7 +281,8 @@ void AudioEngine::send_voice( c->send(make_packet(*msg)); } } -void AudioEngine::receive_voice(std::span opus, const glm::vec3& pos) { +void AudioEngine::receive_voice(std::span opus, + const glm::vec3& pos) { std::array pcm; int len = opus_decode(m_decoder, reinterpret_cast(opus.data()), @@ -288,6 +291,7 @@ void AudioEngine::receive_voice(std::span opus, const glm::vec3& pos) { Logger::error("Opus decode failed: {}", opus_strerror(len)); return; } + m_voice_source->set_pos(pos); m_voice_source->push_pcm(std::span(pcm.data(), len), AudioRecording::SAMPLE_RATE); } diff --git a/src/audio/audio_stream_source.cpp b/src/audio/audio_stream_source.cpp index c568de9..9a1ea01 100644 --- a/src/audio/audio_stream_source.cpp +++ b/src/audio/audio_stream_source.cpp @@ -1,6 +1,10 @@ #include "Cubed/audio/audio_stream_source.hpp" +#include "Cubed/audio/audio_error.hpp" #include "Cubed/tools/log.hpp" + +#include +#include namespace Cubed { AudioStreamSource::AudioStreamSource() { alGenBuffers(NUM_BUFFERS, m_buffers.data()); @@ -68,4 +72,71 @@ void AudioStreamSource::unqueue_processed() { } } +void AudioStreamSource::set_volume(float volume) { + volume = std::clamp(volume, 0.0f, 1.0f); + alSourcef(m_source, AL_GAIN, volume); +} + +void AudioStreamSource::set_pitch(float pitch) { + pitch = std::clamp(pitch, 0.0f, 1.0f); + alSourcef(m_source, AL_PITCH, pitch); +} + +void AudioStreamSource::set_pos(glm::vec3 pos) { + alSourcei(m_source, AL_SOURCE_RELATIVE, AL_FALSE); + alSource3f(m_source, AL_POSITION, pos.x, pos.y, pos.z); + check_al_error(); + + alSourcef(m_source, AL_REFERENCE_DISTANCE, 4.0f); + alSourcef(m_source, AL_ROLLOFF_FACTOR, 1.0f); + alSourcef(m_source, AL_MAX_DISTANCE, 48.0f); +} + +void AudioStreamSource::reset() { + alSourceStop(m_source); + + alSourcei(m_source, AL_BUFFER, 0); + + alSourcef(m_source, AL_GAIN, 1.0f); + alSourcef(m_source, AL_PITCH, 1.0f); + + alSource3f(m_source, AL_POSITION, 0.0f, 0.0f, 0.0f); + alSource3f(m_source, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + alSource3f(m_source, AL_DIRECTION, 0.0f, 0.0f, 0.0f); + + alSourcef(m_source, AL_REFERENCE_DISTANCE, 1.0f); + alSourcef(m_source, AL_ROLLOFF_FACTOR, 1.0f); + alSourcef(m_source, AL_MAX_DISTANCE, FLT_MAX); + + alSourcef(m_source, AL_CONE_INNER_ANGLE, 360.0f); + alSourcef(m_source, AL_CONE_OUTER_ANGLE, 360.0f); + alSourcef(m_source, AL_CONE_OUTER_GAIN, 0.0f); + + alSourcei(m_source, AL_LOOPING, AL_FALSE); + + alSourcei(m_source, AL_SOURCE_RELATIVE, AL_FALSE); + + alSourcef(m_source, AL_SEC_OFFSET, 0.0f); + + clear_filter(); + clear_effect_slot(); +} + +void AudioStreamSource::set_filter(const AudioFilter& filter) { + alSourcei(m_source, AL_DIRECT_FILTER, filter.filter()); +} +void AudioStreamSource::clear_filter() { + alSourcei(m_source, AL_DIRECT_FILTER, AL_FILTER_NULL); +} + +void AudioStreamSource::set_effect_slot(const AudioEffectSlot& slot) { + alSource3i(m_source, AL_AUXILIARY_SEND_FILTER, slot.slot(), 0, + AL_FILTER_NULL); +} + +void AudioStreamSource::clear_effect_slot() { + alSource3i(m_source, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, + AL_FILTER_NULL); +} + } // namespace Cubed \ No newline at end of file