Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ void SteamAudioConfig::set_max_ambisonics_order(int p_max_ambisonics_order) { ma
IPLSceneType SteamAudioConfig::get_scene_type() { return scene_type; }
void SteamAudioConfig::set_scene_type(IPLSceneType p_scene_type) { scene_type = p_scene_type; }

float SteamAudioConfig::get_num_refl_threads() { return num_refl_threads; }
void SteamAudioConfig::set_num_refl_threads(float p_num_refl_threads) { num_refl_threads = p_num_refl_threads; }
int SteamAudioConfig::get_num_refl_threads() { return num_refl_threads; }
void SteamAudioConfig::set_num_refl_threads(int p_num_refl_threads) { num_refl_threads = p_num_refl_threads; }

float SteamAudioConfig::get_max_num_refl_srcs() { return max_num_refl_srcs; }
void SteamAudioConfig::set_max_num_refl_srcs(float p_max_num_refl_srcs) { max_num_refl_srcs = p_max_num_refl_srcs; }
int SteamAudioConfig::get_max_num_refl_srcs() { return max_num_refl_srcs; }
void SteamAudioConfig::set_max_num_refl_srcs(int p_max_num_refl_srcs) { max_num_refl_srcs = p_max_num_refl_srcs; }

float SteamAudioConfig::get_max_refl_duration() { return max_refl_duration; }
void SteamAudioConfig::set_max_refl_duration(float p_max_refl_duration) { max_refl_duration = p_max_refl_duration; }
Expand Down
8 changes: 4 additions & 4 deletions src/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ class SteamAudioConfig : public Node3D {
void set_max_ambisonics_order(int p_max_ambisonics_order);
IPLSceneType get_scene_type();
void set_scene_type(IPLSceneType p_scene_type);
float get_num_refl_threads();
void set_num_refl_threads(float p_num_refl_threads);
float get_max_num_refl_srcs();
void set_max_num_refl_srcs(float p_max_num_refl_srcs);
int get_num_refl_threads();
void set_num_refl_threads(int p_num_refl_threads);
int get_max_num_refl_srcs();
void set_max_num_refl_srcs(int p_max_num_refl_srcs);
float get_max_refl_duration();
void set_max_refl_duration(float p_max_refl_duration);
int get_num_diffuse_samples();
Expand Down
2 changes: 1 addition & 1 deletion src/geometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ void SteamAudioGeometry::destroy_geometry() {

created.store(false);

for (auto mesh : meshes) {
for (auto &mesh : meshes) {
iplStaticMeshRelease(&mesh);
}
meshes.clear();
Expand Down
10 changes: 9 additions & 1 deletion src/geometry_common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,18 @@ inline IPLStaticMesh godot_mesh_to_ipl_mesh(Ref<Mesh> mesh, IPLScene scene, IPLM
static_mesh_cfg.materials = mats;

IPLStaticMesh ipl_mesh;
iplStaticMeshCreate(scene, &static_mesh_cfg, &ipl_mesh);
handleErr(iplStaticMeshCreate(scene, &static_mesh_cfg, &ipl_mesh));

return ipl_mesh;
}

inline std::vector<IPLStaticMesh> create_meshes_from_mesh_inst_3d(MeshInstance3D *mesh_inst, IPLScene scene, Ref<SteamAudioMaterial> mat, bool ignore_trf = false) {
std::vector<IPLStaticMesh> p_meshes;
Ref<Mesh> mesh = mesh_inst->get_mesh();
if (mesh.is_null()) {
SteamAudio::log(SteamAudio::log_error, "MeshInstance3D has no mesh assigned.");
return p_meshes;
}

Transform3D trf;
if (ignore_trf) {
Expand All @@ -88,6 +92,10 @@ inline std::vector<IPLStaticMesh> create_meshes_from_mesh_inst_3d(MeshInstance3D

inline std::vector<IPLStaticMesh> create_meshes_from_coll_inst_3d(CollisionShape3D *coll_inst, IPLScene scene, Ref<SteamAudioMaterial> mat, bool ignore_trf = false) {
std::vector<IPLStaticMesh> p_meshes;
if (coll_inst->get_shape().is_null()) {
SteamAudio::log(SteamAudio::log_error, "CollisionShape3D has no shape assigned.");
return p_meshes;
}
Transform3D trf;
if (ignore_trf) {
trf = Transform3D(Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1), Vector3(0, 0, 0));
Expand Down
2 changes: 1 addition & 1 deletion src/geometry_dynamic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ void SteamAudioDynamicGeometry::create_geometry() {
}

void SteamAudioDynamicGeometry::destroy_geometry() {
for (auto m : meshes) {
for (auto &m : meshes) {
iplStaticMeshRelease(&m);
}
meshes.clear();
Expand Down
2 changes: 1 addition & 1 deletion src/geometry_dynamic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class SteamAudioDynamicGeometry : public Node3D {
GDCLASS(SteamAudioDynamicGeometry, Node3D);

private:
std::atomic_bool is_init;
std::atomic_bool is_init{false};
IPLInstancedMesh mesh = nullptr;
IPLScene sub_scene = nullptr;
std::vector<IPLStaticMesh> meshes;
Expand Down
5 changes: 5 additions & 0 deletions src/listener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ void SteamAudioListener::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE:
ready_internal();
break;
case NOTIFICATION_EXIT_TREE:
if (!Engine::get_singleton()->is_editor_hint()) {
SteamAudioServer::get_singleton()->add_listener(nullptr);
}
break;
}
}

Expand Down
43 changes: 28 additions & 15 deletions src/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,15 @@ SteamAudioPlayer::~SteamAudioPlayer() {
is_local_state_init.store(false);
can_load_local_state.store(false);
SteamAudioServer::get_singleton()->remove_local_state(&local_state);

is_local_state_init.store(false);
auto gs = SteamAudioServer::get_singleton()->get_global_state();

iplSourceRemove(local_state.src.src, gs->sim);
iplSourceRelease(&local_state.src.src);
iplDirectEffectRelease(&local_state.fx.direct);
iplReflectionEffectRelease(&local_state.fx.refl);
iplAmbisonicsDecodeEffectRelease(&local_state.fx.dec);
iplAmbisonicsDecodeEffectRelease(&local_state.fx.refl_dec);
iplAmbisonicsEncodeEffectRelease(&local_state.fx.enc);

iplAudioBufferFree(gs->ctx, &local_state.bufs.in);
iplAudioBufferFree(gs->ctx, &local_state.bufs.direct);
Expand Down Expand Up @@ -136,7 +138,7 @@ void SteamAudioPlayer::init_local_state() {

IPLSourceSettings src_cfg{};
src_cfg.flags = static_cast<IPLSimulationFlags>(IPL_SIMULATIONFLAGS_DIRECT | IPL_SIMULATIONFLAGS_REFLECTIONS);
iplSourceCreate(gs->sim, &src_cfg, &local_state.src.src);
handleErr(iplSourceCreate(gs->sim, &src_cfg, &local_state.src.src));
iplSourceAdd(local_state.src.src, gs->sim);
iplSimulatorCommit(gs->sim);

Expand All @@ -145,13 +147,13 @@ void SteamAudioPlayer::init_local_state() {
// (e.g. one source may start to play audio from all sources and positioning gets screwed)
IPLDirectEffectSettings dir_effect_cfg;
dir_effect_cfg.numChannels = 2;
iplDirectEffectCreate(gs->ctx, &gs->audio_cfg, &dir_effect_cfg, &local_state.fx.direct);
handleErr(iplDirectEffectCreate(gs->ctx, &gs->audio_cfg, &dir_effect_cfg, &local_state.fx.direct));

IPLReflectionEffectSettings refl_effect_cfg{};
refl_effect_cfg.type = IPL_REFLECTIONEFFECTTYPE_CONVOLUTION;
refl_effect_cfg.irSize = int(SteamAudioConfig::max_refl_duration * float(gs->audio_cfg.samplingRate));
refl_effect_cfg.numChannels = ambisonic_channels_from(local_state.cfg.ambisonics_order);
iplReflectionEffectCreate(gs->ctx, &gs->audio_cfg, &refl_effect_cfg, &local_state.fx.refl);
handleErr(iplReflectionEffectCreate(gs->ctx, &gs->audio_cfg, &refl_effect_cfg, &local_state.fx.refl));

local_state.fx.dec = create_ambisonics_decode_effect(
gs->ctx, gs->audio_cfg, gs->hrtf);
Expand All @@ -160,13 +162,13 @@ void SteamAudioPlayer::init_local_state() {
local_state.fx.enc = create_ambisonics_encode_effect(
gs->ctx, gs->audio_cfg);

iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.in);
iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.direct);
iplAudioBufferAllocate(gs->ctx, ambisonic_channels_from(local_state.cfg.ambisonics_order), gs->audio_cfg.frameSize, &local_state.bufs.ambi);
iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.out);
iplAudioBufferAllocate(gs->ctx, 1, gs->audio_cfg.frameSize, &local_state.bufs.mono);
iplAudioBufferAllocate(gs->ctx, ambisonic_channels_from(local_state.cfg.ambisonics_order), gs->audio_cfg.frameSize, &local_state.bufs.refl_ambi);
iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.refl_out);
handleErr(iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.in));
handleErr(iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.direct));
handleErr(iplAudioBufferAllocate(gs->ctx, ambisonic_channels_from(local_state.cfg.ambisonics_order), gs->audio_cfg.frameSize, &local_state.bufs.ambi));
handleErr(iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.out));
handleErr(iplAudioBufferAllocate(gs->ctx, 1, gs->audio_cfg.frameSize, &local_state.bufs.mono));
handleErr(iplAudioBufferAllocate(gs->ctx, ambisonic_channels_from(local_state.cfg.ambisonics_order), gs->audio_cfg.frameSize, &local_state.bufs.refl_ambi));
handleErr(iplAudioBufferAllocate(gs->ctx, 2, gs->audio_cfg.frameSize, &local_state.bufs.refl_out));
local_state.src.player = this;

SteamAudio::log(SteamAudio::log_debug, "init local state done");
Expand All @@ -180,6 +182,11 @@ void SteamAudioPlayer::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE:
ready_internal();
break;
case NOTIFICATION_EXIT_TREE:
if (!Engine::get_singleton()->is_editor_hint() && is_local_state_init.load()) {
SteamAudioServer::get_singleton()->remove_local_state(&local_state);
}
break;
case NOTIFICATION_PROCESS:
process_internal(get_process_delta_time());
break;
Expand Down Expand Up @@ -226,11 +233,17 @@ void SteamAudioPlayer::ready_internal() {

void SteamAudioPlayer::process_internal(double delta) {
if (get_panning_strength() > 0.0f) {
UtilityFunctions::push_warning("Panning strength is always zero on SteamAudioPlayer. You can control panning by enabling or disabling ambisonics.");
if (!has_warned_panning) {
UtilityFunctions::push_warning("Panning strength is always zero on SteamAudioPlayer. You can control panning by enabling or disabling ambisonics.");
has_warned_panning = true;
}
set_panning_strength(0.0f);
}
if (cfg.is_dist_attn_on && get_attenuation_model() != ATTENUATION_DISABLED) {
UtilityFunctions::push_warning("You cannot enable Godot's and SteamAudio's distance attenuation features at the same time. Disable SteamAudio's attenuation before adjusting Godot's.");
if (!has_warned_attenuation) {
UtilityFunctions::push_warning("You cannot enable Godot's and SteamAudio's distance attenuation features at the same time. Disable SteamAudio's attenuation before adjusting Godot's.");
has_warned_attenuation = true;
}
set_attenuation_model(ATTENUATION_DISABLED);
}

Expand Down Expand Up @@ -286,7 +299,7 @@ Ref<AudioStreamPlayback> SteamAudioPlayer::get_inner_stream_playback() {
if (spb == nullptr) {
SteamAudio::log(SteamAudio::log_warn,
"Tried to get an inner stream playback from a SteamAudioPlayer, but its outer stream playback is not a SteamAudioStreamPlayback (or the player may not be playing audio). Returning null.");
Ref<AudioStream> null_pb;
Ref<AudioStreamPlayback> null_pb;
return null_pb;
}

Expand Down
2 changes: 2 additions & 0 deletions src/player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class SteamAudioPlayer : public AudioStreamPlayer3D {
LocalSteamAudioState local_state;
std::atomic<bool> is_local_state_init;
std::atomic<bool> can_load_local_state;
bool has_warned_panning = false;
bool has_warned_attenuation = false;

void init_local_state();

Expand Down
14 changes: 9 additions & 5 deletions src/register_types.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
#ifndef GDEXAMPLE_REGISTER_TYPES_H
#define GDEXAMPLE_REGISTER_TYPES_H
#ifndef STEAM_AUDIO_REGISTER_TYPES_H
#define STEAM_AUDIO_REGISTER_TYPES_H

void init_ext();
void uninit_ext();
#include <godot_cpp/godot.hpp>

#endif // GDEXAMPLE_REGISTER_TYPES_H
using namespace godot;

void init_ext(ModuleInitializationLevel p_level);
void uninit_ext(ModuleInitializationLevel p_level);

#endif // STEAM_AUDIO_REGISTER_TYPES_H
11 changes: 8 additions & 3 deletions src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,6 @@ GlobalSteamAudioState *SteamAudioServer::get_global_state(bool should_init) {
IPLSceneSettings scene_cfg = create_scene_cfg(global_state.ctx);
IPLerror err = iplSceneCreate(global_state.ctx, &scene_cfg, &global_state.scene);
handleErr(err);
global_state.scene = iplSceneRetain(global_state.scene);
for (auto m : static_meshes_to_add) {
iplStaticMeshAdd(m, global_state.scene);
}
Expand Down Expand Up @@ -327,8 +326,14 @@ SteamAudioServer::SteamAudioServer() {

SteamAudioServer::~SteamAudioServer() {
is_running.store(false);
refl_thread->wait_to_finish();
refl_thread.unref();
{
std::unique_lock<std::mutex> lock(refl_mux);
cv.notify_one();
}
if (refl_thread.is_valid()) {
refl_thread->wait_to_finish();
refl_thread.unref();
}

if (!self->is_global_state_init.load()) {
return;
Expand Down
2 changes: 1 addition & 1 deletion src/server_init.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ IPLSimulator create_simulator(IPLContext ctx, IPLAudioSettings audio_cfg, IPLSce
IPLSceneSettings create_scene_cfg(IPLContext ctx);
IPLContext create_ctx();

static IPLEmbreeDevice embree_dev = nullptr;
inline IPLEmbreeDevice embree_dev = nullptr;
3 changes: 3 additions & 0 deletions src/steam_audio.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ inline void log_callback(IPLLogLevel level, const char *message) {
case IPL_LOGLEVEL_DEBUG:
godot_log_level = SteamAudio::GodotSteamAudioLogLevel::log_debug;
break;
default:
godot_log_level = SteamAudio::GodotSteamAudioLogLevel::log_info;
break;
}
SteamAudio::log(godot_log_level, String(message).strip_edges().utf8().get_data());
}
Expand Down
5 changes: 5 additions & 0 deletions src/stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ int32_t SteamAudioStreamPlayback::_mix(AudioFrame *buffer, float rate_scale, int
PackedVector2Array mixed_frames = stream_playback->mix_audio(rate_scale, frames);
frames = int(mixed_frames.size());

auto gs_local = SteamAudioServer::get_singleton()->get_global_state(false);
if (gs_local != nullptr && frames > gs_local->audio_cfg.frameSize) {
frames = gs_local->audio_cfg.frameSize;
}

for (int i = 0; i < frames; i++) {
ls->bufs.in.data[0][i] = mixed_frames[i].x;
ls->bufs.in.data[1][i] = mixed_frames[i].y;
Expand Down
4 changes: 2 additions & 2 deletions src/stream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class SteamAudioStream : public AudioStream {
void set_stream(Ref<AudioStream> p_stream);
Ref<AudioStream> get_stream();

SteamAudioPlayer *parent;
SteamAudioPlayer *parent = nullptr;
};

class SteamAudioStreamPlayback : public AudioStreamPlayback {
Expand All @@ -40,7 +40,7 @@ class SteamAudioStreamPlayback : public AudioStreamPlayback {
Ref<AudioStream> stream;
Ref<AudioStreamPlayback> stream_playback;

std::atomic<bool> is_active;
std::atomic<bool> is_active{false};

protected:
static void _bind_methods();
Expand Down