From f3482fc15a42925e89805382c34b1e4f669331d1 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 26 Feb 2021 13:05:23 -0700 Subject: [PATCH] lovr.audio.get/setPosition; lovr.audio.get/setOrientation; --- src/api/l_audio.c | 40 +++++++++++++++++++++++++++++++++ src/modules/audio/audio.h | 2 -- src/modules/audio/spatializer.h | 4 ++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/api/l_audio.c b/src/api/l_audio.c index 4e30d241..2fb8793f 100644 --- a/src/api/l_audio.c +++ b/src/api/l_audio.c @@ -88,6 +88,42 @@ static int l_lovrAudioSetVolume(lua_State* L) { return 0; } +static int l_lovrAudioGetPosition(lua_State* L) { + float position[4], orientation[4]; + lovrAudioGetPose(position, orientation); + lua_pushnumber(L, position[0]); + lua_pushnumber(L, position[1]); + lua_pushnumber(L, position[2]); + return 3; +} + +static int l_lovrAudioSetPosition(lua_State* L) { + float position[4], orientation[4]; + lovrAudioGetPose(position, orientation); + luax_readvec3(L, 1, position, NULL); + lovrAudioSetPose(position, orientation); + return 0; +} + +static int l_lovrAudioGetOrientation(lua_State* L) { + float position[4], orientation[4], angle, ax, ay, az; + lovrAudioGetPose(position, orientation); + quat_getAngleAxis(orientation, &angle, &ax, &ay, &az); + lua_pushnumber(L, angle); + lua_pushnumber(L, ax); + lua_pushnumber(L, ay); + lua_pushnumber(L, az); + return 4; +} + +static int l_lovrAudioSetOrientation(lua_State* L) { + float position[4], orientation[4]; + lovrAudioGetPose(position, orientation); + luax_readquat(L, 1, orientation, NULL); + lovrAudioSetPose(position, orientation); + return 0; +} + static int l_lovrAudioGetPose(lua_State *L) { float position[4], orientation[4], angle, ax, ay, az; lovrAudioGetPose(position, orientation); @@ -175,6 +211,10 @@ static const luaL_Reg lovrAudio[] = { { "isStarted", l_lovrAudioIsStarted }, { "getVolume", l_lovrAudioGetVolume }, { "setVolume", l_lovrAudioSetVolume }, + { "getPosition", l_lovrAudioGetPosition }, + { "setPosition", l_lovrAudioSetPosition }, + { "getOrientation", l_lovrAudioGetOrientation }, + { "setOrientation", l_lovrAudioSetOrientation }, { "getPose", l_lovrAudioGetPose }, { "setPose", l_lovrAudioSetPose }, { "setGeometry", l_lovrAudioSetGeometry }, diff --git a/src/modules/audio/audio.h b/src/modules/audio/audio.h index 8857a7c4..e6b744ad 100644 --- a/src/modules/audio/audio.h +++ b/src/modules/audio/audio.h @@ -80,5 +80,3 @@ bool lovrSourceIsReverbEnabled(Source* source); void lovrSourceSetReverbEnabled(Source* source, bool enabled); bool lovrSourceIsTransmissionEnabled(Source* source); void lovrSourceSetTransmissionEnabled(Source* source, bool enabled); -intptr_t* lovrSourceGetSpatializerMemoField(Source* source); -uint32_t lovrSourceGetIndex(Source* source); diff --git a/src/modules/audio/spatializer.h b/src/modules/audio/spatializer.h index 975f74d4..5a44c390 100644 --- a/src/modules/audio/spatializer.h +++ b/src/modules/audio/spatializer.h @@ -1,5 +1,9 @@ #include "audio.h" +// Private Source functions for spatializer use +intptr_t* lovrSourceGetSpatializerMemoField(Source* source); +uint32_t lovrSourceGetIndex(Source* source); + typedef struct { uint32_t maxSourcesHint; uint32_t fixedBufferSize;