From c2c1e8aac5e937cb55ebe33e1d937471002b0e76 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 5 Jan 2017 21:36:38 -0800 Subject: [PATCH] Audio listener position and orientation; --- src/audio/audio.c | 24 ++++++++++++++++++++++++ src/audio/audio.h | 4 ++++ src/lovr/audio.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/lovr/audio.h | 4 ++++ 4 files changed, 76 insertions(+) diff --git a/src/audio/audio.c b/src/audio/audio.c index 3d51e370..972ae4c0 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -47,7 +47,31 @@ void lovrAudioUpdate() { } } +void lovrAudioGetOrientation(float* fx, float* fy, float* fz, float* ux, float* uy, float* uz) { + float v[6]; + alGetListenerfv(AL_ORIENTATION, v); + *fx = v[0]; + *fy = v[1]; + *fz = v[2]; + *ux = v[3]; + *uy = v[4]; + *uz = v[5]; +} + +void lovrAudioGetPosition(float* x, float* y, float* z) { + alGetListener3f(AL_POSITION, x, y, z); +} + void lovrAudioPlay(Source* source) { lovrRetain(&source->ref); vec_push(&state.sources, source); } + +void lovrAudioSetOrientation(float fx, float fy, float fz, float ux, float uy, float uz) { + ALfloat orientation[6] = { fx, fy, fz, ux, uy, uz }; + alListenerfv(AL_ORIENTATION, orientation); +} + +void lovrAudioSetPosition(float x, float y, float z) { + alListener3f(AL_POSITION, x, y, z); +} diff --git a/src/audio/audio.h b/src/audio/audio.h index 22660eb3..a2fe62d8 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -17,4 +17,8 @@ typedef struct { void lovrAudioInit(); void lovrAudioDestroy(); void lovrAudioUpdate(); +void lovrAudioGetOrientation(float* fx, float* fy, float* fz, float* ux, float* uy, float* uz); +void lovrAudioGetPosition(float* x, float* y, float* z); void lovrAudioPlay(Source* source); +void lovrAudioSetOrientation(float fx, float fy, float fz, float ux, float uy, float uz); +void lovrAudioSetPosition(float x, float y, float z); diff --git a/src/lovr/audio.c b/src/lovr/audio.c index 64395c34..6ec7332a 100644 --- a/src/lovr/audio.c +++ b/src/lovr/audio.c @@ -7,7 +7,11 @@ const luaL_Reg lovrAudio[] = { { "update", l_lovrAudioUpdate }, + { "getOrientation", l_lovrAudioGetOrientation }, + { "getPosition", l_lovrAudioGetPosition }, { "newSource", l_lovrAudioNewSource }, + { "setOrientation", l_lovrAudioSetOrientation }, + { "setPosition", l_lovrAudioSetPosition }, { NULL, NULL } }; @@ -29,6 +33,27 @@ int l_lovrAudioUpdate(lua_State* L) { return 0; } +int l_lovrAudioGetOrientation(lua_State* L) { + float fx, fy, fz, ux, uy, uz; + lovrAudioGetOrientation(&fx, &fy, &fz, &ux, &uy, &uz); + lua_pushnumber(L, fx); + lua_pushnumber(L, fy); + lua_pushnumber(L, fz); + lua_pushnumber(L, ux); + lua_pushnumber(L, uy); + lua_pushnumber(L, uz); + return 6; +} + +int l_lovrAudioGetPosition(lua_State* L) { + float x, y, z; + lovrAudioGetPosition(&x, &y, &z); + lua_pushnumber(L, x); + lua_pushnumber(L, y); + lua_pushnumber(L, z); + return 3; +} + int l_lovrAudioNewSource(lua_State* L) { const char* filename = luaL_checkstring(L, 1); if (!strstr(filename, ".ogg")) { @@ -45,3 +70,22 @@ int l_lovrAudioNewSource(lua_State* L) { luax_pushtype(L, Source, lovrSourceCreate(sourceData)); return 1; } + +int l_lovrAudioSetOrientation(lua_State* L) { + float fx = luaL_checknumber(L, 1); + float fy = luaL_checknumber(L, 2); + float fz = luaL_checknumber(L, 3); + float ux = luaL_checknumber(L, 4); + float uy = luaL_checknumber(L, 5); + float uz = luaL_checknumber(L, 6); + lovrAudioSetOrientation(fx, fy, fz, ux, uy, uz); + return 0; +} + +int l_lovrAudioSetPosition(lua_State* L) { + float x = luaL_checknumber(L, 1); + float y = luaL_checknumber(L, 2); + float z = luaL_checknumber(L, 3); + lovrAudioSetPosition(x, y, z); + return 0; +} diff --git a/src/lovr/audio.h b/src/lovr/audio.h index 3d7844f9..b69fc537 100644 --- a/src/lovr/audio.h +++ b/src/lovr/audio.h @@ -8,4 +8,8 @@ map_int_t TimeUnits; extern const luaL_Reg lovrAudio[]; int l_lovrAudioInit(lua_State* L); int l_lovrAudioUpdate(lua_State* L); +int l_lovrAudioGetOrientation(lua_State* L); +int l_lovrAudioGetPosition(lua_State* L); int l_lovrAudioNewSource(lua_State* L); +int l_lovrAudioSetOrientation(lua_State* L); +int l_lovrAudioSetPosition(lua_State* L);