2017-12-10 20:40:37 +00:00
|
|
|
#include "api.h"
|
2017-01-03 03:09:33 +00:00
|
|
|
#include "audio/audio.h"
|
2017-01-06 01:00:53 +00:00
|
|
|
#include "audio/source.h"
|
2018-01-21 20:54:16 +00:00
|
|
|
#include "data/audioStream.h"
|
2017-01-03 03:09:33 +00:00
|
|
|
|
2018-07-06 05:08:14 +00:00
|
|
|
const char* SourceTypes[] = {
|
|
|
|
[SOURCE_STATIC] = "static",
|
|
|
|
[SOURCE_STREAM] = "stream",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
2018-07-05 03:11:52 +00:00
|
|
|
const char* TimeUnits[] = {
|
|
|
|
[UNIT_SECONDS] = "seconds",
|
|
|
|
[UNIT_SAMPLES] = "samples",
|
|
|
|
NULL
|
|
|
|
};
|
2017-01-03 03:09:33 +00:00
|
|
|
|
|
|
|
int l_lovrAudioInit(lua_State* L) {
|
|
|
|
lua_newtable(L);
|
|
|
|
luaL_register(L, NULL, lovrAudio);
|
2017-01-06 01:00:53 +00:00
|
|
|
luax_registertype(L, "Source", lovrSource);
|
2017-01-03 03:09:33 +00:00
|
|
|
lovrAudioInit();
|
|
|
|
return 1;
|
|
|
|
}
|
2017-01-06 01:00:53 +00:00
|
|
|
|
|
|
|
int l_lovrAudioUpdate(lua_State* L) {
|
|
|
|
lovrAudioUpdate();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-02-26 05:54:39 +00:00
|
|
|
int l_lovrAudioGetDopplerEffect(lua_State* L) {
|
|
|
|
float factor, speedOfSound;
|
|
|
|
lovrAudioGetDopplerEffect(&factor, &speedOfSound);
|
|
|
|
lua_pushnumber(L, factor);
|
|
|
|
lua_pushnumber(L, speedOfSound);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
2017-01-06 05:36:38 +00:00
|
|
|
int l_lovrAudioGetOrientation(lua_State* L) {
|
2017-01-07 01:45:15 +00:00
|
|
|
float angle, ax, ay, az;
|
|
|
|
lovrAudioGetOrientation(&angle, &ax, &ay, &az);
|
|
|
|
lua_pushnumber(L, angle);
|
|
|
|
lua_pushnumber(L, ax);
|
|
|
|
lua_pushnumber(L, ay);
|
|
|
|
lua_pushnumber(L, az);
|
|
|
|
return 4;
|
2017-01-06 05:36:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2017-02-26 20:57:56 +00:00
|
|
|
int l_lovrAudioGetVelocity(lua_State* L) {
|
|
|
|
float x, y, z;
|
|
|
|
lovrAudioGetVelocity(&x, &y, &z);
|
|
|
|
lua_pushnumber(L, x);
|
|
|
|
lua_pushnumber(L, y);
|
|
|
|
lua_pushnumber(L, z);
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
2017-01-06 08:41:08 +00:00
|
|
|
int l_lovrAudioGetVolume(lua_State* L) {
|
|
|
|
lua_pushnumber(L, lovrAudioGetVolume());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2017-02-26 21:14:15 +00:00
|
|
|
int l_lovrAudioIsSpatialized(lua_State* L) {
|
2017-10-31 08:14:09 +00:00
|
|
|
lua_pushboolean(L, lovrAudioIsSpatialized());
|
2017-02-26 21:14:15 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2017-01-06 01:00:53 +00:00
|
|
|
int l_lovrAudioNewSource(lua_State* L) {
|
2018-07-06 05:08:14 +00:00
|
|
|
Source* source = NULL;
|
|
|
|
SoundData** soundDataRef = luax_totype(L, 1, SoundData);
|
|
|
|
AudioStream** streamRef = luax_totype(L, 1, AudioStream);
|
|
|
|
bool isStatic = soundDataRef || luaL_checkoption(L, 2, NULL, SourceTypes) == SOURCE_STATIC;
|
|
|
|
|
|
|
|
if (isStatic) {
|
2018-07-06 06:30:37 +00:00
|
|
|
if (soundDataRef) {
|
|
|
|
source = lovrSourceCreateStatic(*soundDataRef);
|
|
|
|
} else {
|
|
|
|
SoundData* soundData;
|
2018-07-06 05:08:14 +00:00
|
|
|
|
|
|
|
if (streamRef) {
|
|
|
|
soundData = lovrSoundDataCreateFromAudioStream(*streamRef);
|
|
|
|
} else {
|
|
|
|
Blob* blob = luax_readblob(L, 1, "Source");
|
|
|
|
soundData = lovrSoundDataCreateFromBlob(blob);
|
|
|
|
lovrRelease(blob);
|
|
|
|
}
|
|
|
|
|
2018-07-06 06:30:37 +00:00
|
|
|
lovrAssert(soundData, "Could not create static Source");
|
|
|
|
source = lovrSourceCreateStatic(soundData);
|
|
|
|
lovrRelease(soundData);
|
|
|
|
}
|
2018-01-22 16:14:24 +00:00
|
|
|
} else {
|
2018-07-06 06:30:37 +00:00
|
|
|
if (streamRef) {
|
|
|
|
source = lovrSourceCreateStream(*streamRef);
|
|
|
|
} else {
|
2018-07-06 05:08:14 +00:00
|
|
|
Blob* blob = luax_readblob(L, 1, "Source");
|
2018-07-06 06:30:37 +00:00
|
|
|
AudioStream* stream = lovrAudioStreamCreate(blob, 4096);
|
|
|
|
lovrAssert(stream, "Could not create stream Source");
|
|
|
|
source = lovrSourceCreateStream(stream);
|
2018-07-06 05:08:14 +00:00
|
|
|
lovrRelease(blob);
|
2018-07-06 06:30:37 +00:00
|
|
|
lovrRelease(stream);
|
2018-01-31 18:17:01 +00:00
|
|
|
}
|
2018-01-22 16:14:24 +00:00
|
|
|
}
|
|
|
|
|
2017-02-18 22:44:52 +00:00
|
|
|
luax_pushtype(L, Source, source);
|
2018-02-26 08:59:03 +00:00
|
|
|
lovrRelease(source);
|
2017-01-06 01:00:53 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2017-01-06 05:36:38 +00:00
|
|
|
|
2017-01-06 08:37:16 +00:00
|
|
|
int l_lovrAudioPause(lua_State* L) {
|
|
|
|
lovrAudioPause();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int l_lovrAudioResume(lua_State* L) {
|
|
|
|
lovrAudioResume();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int l_lovrAudioRewind(lua_State* L) {
|
|
|
|
lovrAudioRewind();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-02-26 05:54:39 +00:00
|
|
|
int l_lovrAudioSetDopplerEffect(lua_State* L) {
|
|
|
|
float factor = luaL_optnumber(L, 1, 1.);
|
|
|
|
float speedOfSound = luaL_optnumber(L, 2, 343.29);
|
|
|
|
lovrAudioSetDopplerEffect(factor, speedOfSound);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-01-06 05:36:38 +00:00
|
|
|
int l_lovrAudioSetOrientation(lua_State* L) {
|
2017-01-07 01:45:15 +00:00
|
|
|
float angle = luaL_checknumber(L, 1);
|
|
|
|
float ax = luaL_checknumber(L, 2);
|
|
|
|
float ay = luaL_checknumber(L, 3);
|
|
|
|
float az = luaL_checknumber(L, 4);
|
|
|
|
lovrAudioSetOrientation(angle, ax, ay, az);
|
2017-01-06 05:36:38 +00:00
|
|
|
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;
|
|
|
|
}
|
2017-01-06 08:37:16 +00:00
|
|
|
|
2017-02-26 20:57:56 +00:00
|
|
|
int l_lovrAudioSetVelocity(lua_State* L) {
|
|
|
|
float x = luaL_checknumber(L, 1);
|
|
|
|
float y = luaL_checknumber(L, 2);
|
|
|
|
float z = luaL_checknumber(L, 3);
|
|
|
|
lovrAudioSetVelocity(x, y, z);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-01-06 08:41:08 +00:00
|
|
|
int l_lovrAudioSetVolume(lua_State* L) {
|
|
|
|
float volume = luaL_checknumber(L, 1);
|
|
|
|
lovrAudioSetVolume(volume);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-01-06 08:37:16 +00:00
|
|
|
int l_lovrAudioStop(lua_State* L) {
|
|
|
|
lovrAudioStop();
|
|
|
|
return 0;
|
|
|
|
}
|
2017-03-11 11:08:07 +00:00
|
|
|
|
|
|
|
const luaL_Reg lovrAudio[] = {
|
|
|
|
{ "update", l_lovrAudioUpdate },
|
2018-02-26 05:54:39 +00:00
|
|
|
{ "getDopplerEffect", l_lovrAudioGetDopplerEffect },
|
2017-03-11 11:08:07 +00:00
|
|
|
{ "getOrientation", l_lovrAudioGetOrientation },
|
|
|
|
{ "getPosition", l_lovrAudioGetPosition },
|
|
|
|
{ "getVelocity", l_lovrAudioGetVelocity },
|
|
|
|
{ "getVolume", l_lovrAudioGetVolume },
|
|
|
|
{ "isSpatialized", l_lovrAudioIsSpatialized },
|
|
|
|
{ "newSource", l_lovrAudioNewSource },
|
|
|
|
{ "pause", l_lovrAudioPause },
|
|
|
|
{ "resume", l_lovrAudioResume },
|
|
|
|
{ "rewind", l_lovrAudioRewind },
|
2018-02-26 05:54:39 +00:00
|
|
|
{ "setDopplerEffect", l_lovrAudioSetDopplerEffect },
|
2017-03-11 11:08:07 +00:00
|
|
|
{ "setOrientation", l_lovrAudioSetOrientation },
|
|
|
|
{ "setPosition", l_lovrAudioSetPosition },
|
|
|
|
{ "setVelocity", l_lovrAudioSetVelocity },
|
|
|
|
{ "setVolume", l_lovrAudioSetVolume },
|
|
|
|
{ "stop", l_lovrAudioStop },
|
|
|
|
{ NULL, NULL }
|
|
|
|
};
|