lovr/src/api/audio.c

258 lines
6.7 KiB
C
Raw Normal View History

2017-12-10 20:40:37 +00:00
#include "api.h"
2018-09-27 18:45:43 +00:00
#include "api/data.h"
2018-11-27 23:03:05 +00:00
#include "api/math.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
2018-09-27 01:27:38 +00:00
static int l_lovrAudioUpdate(lua_State* L) {
2017-01-06 01:00:53 +00:00
lovrAudioUpdate();
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetDopplerEffect(lua_State* L) {
float factor, speedOfSound;
lovrAudioGetDopplerEffect(&factor, &speedOfSound);
lua_pushnumber(L, factor);
lua_pushnumber(L, speedOfSound);
return 2;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetMicrophoneNames(lua_State* L) {
const char* names[MAX_MICROPHONES];
uint8_t count;
lovrAudioGetMicrophoneNames(names, &count);
if (lua_istable(L, 1)) {
lua_settop(L, 1);
} else {
lua_settop(L, 0);
lua_createtable(L, count, 0);
}
for (int i = 0; i < count; i++) {
lua_pushstring(L, names[i]);
lua_rawseti(L, -2, i + 1);
}
return 1;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetOrientation(lua_State* L) {
float orientation[4], angle, ax, ay, az;
2018-11-27 23:03:05 +00:00
lovrAudioGetOrientation(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_lovrAudioGetPose(lua_State* L) {
float position[3], orientation[4], angle, ax, ay, az;
lovrAudioGetPosition(position);
lovrAudioGetOrientation(orientation);
quat_getAngleAxis(orientation, &angle, &ax, &ay, &az);
lua_pushnumber(L, position[0]);
lua_pushnumber(L, position[1]);
lua_pushnumber(L, position[2]);
lua_pushnumber(L, angle);
lua_pushnumber(L, ax);
lua_pushnumber(L, ay);
lua_pushnumber(L, az);
return 7;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetPosition(lua_State* L) {
2018-11-27 23:03:05 +00:00
float position[3];
lovrAudioGetPosition(position);
lua_pushnumber(L, position[0]);
lua_pushnumber(L, position[1]);
lua_pushnumber(L, position[2]);
return 3;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetVelocity(lua_State* L) {
2018-11-27 23:03:05 +00:00
float velocity[3];
lovrAudioGetVelocity(velocity);
lua_pushnumber(L, velocity[0]);
lua_pushnumber(L, velocity[1]);
lua_pushnumber(L, velocity[2]);
return 3;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioGetVolume(lua_State* L) {
lua_pushnumber(L, lovrAudioGetVolume());
return 1;
}
2018-09-27 01:27:38 +00:00
static 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;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioNewMicrophone(lua_State* L) {
const char* name = luaL_optstring(L, 1, NULL);
int samples = luaL_optinteger(L, 2, 1024);
int sampleRate = luaL_optinteger(L, 3, 8000);
int bitDepth = luaL_optinteger(L, 4, 16);
int channelCount = luaL_optinteger(L, 5, 1);
Microphone* microphone = lovrMicrophoneCreate(name, samples, sampleRate, bitDepth, channelCount);
2018-07-25 03:10:30 +00:00
luax_pushobject(L, microphone);
lovrRelease(Microphone, microphone);
return 1;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioNewSource(lua_State* L) {
2018-07-06 05:08:14 +00:00
Source* source = NULL;
SoundData* soundData = luax_totype(L, 1, SoundData);
AudioStream* stream = luax_totype(L, 1, AudioStream);
bool isStatic = soundData || luaL_checkoption(L, 2, NULL, SourceTypes) == SOURCE_STATIC;
2018-07-06 05:08:14 +00:00
if (isStatic) {
if (soundData) {
source = lovrSourceCreateStatic(soundData);
2018-07-06 06:30:37 +00:00
} else {
if (stream) {
soundData = lovrSoundDataCreateFromAudioStream(stream);
2018-07-06 05:08:14 +00:00
} else {
Blob* blob = luax_readblob(L, 1, "Source");
soundData = lovrSoundDataCreateFromBlob(blob);
lovrRelease(Blob, blob);
2018-07-06 05:08:14 +00:00
}
2018-07-06 06:30:37 +00:00
lovrAssert(soundData, "Could not create static Source");
source = lovrSourceCreateStatic(soundData);
lovrRelease(SoundData, soundData);
2018-07-06 06:30:37 +00:00
}
2018-01-22 16:14:24 +00:00
} else {
if (stream) {
source = lovrSourceCreateStream(stream);
2018-07-06 06:30:37 +00:00
} else {
2018-07-06 05:08:14 +00:00
Blob* blob = luax_readblob(L, 1, "Source");
stream = lovrAudioStreamCreate(blob, 4096);
2018-07-06 06:30:37 +00:00
lovrAssert(stream, "Could not create stream Source");
source = lovrSourceCreateStream(stream);
lovrRelease(Blob, blob);
lovrRelease(AudioStream, stream);
}
2018-01-22 16:14:24 +00:00
}
2018-07-25 03:10:30 +00:00
luax_pushobject(L, source);
lovrRelease(Source, source);
2017-01-06 01:00:53 +00:00
return 1;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioPause(lua_State* L) {
lovrAudioPause();
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioResume(lua_State* L) {
lovrAudioResume();
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioRewind(lua_State* L) {
lovrAudioRewind();
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioSetDopplerEffect(lua_State* L) {
float factor = luax_optfloat(L, 1, 1.f);
float speedOfSound = luax_optfloat(L, 2, 343.29f);
lovrAudioSetDopplerEffect(factor, speedOfSound);
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioSetOrientation(lua_State* L) {
2018-11-27 23:03:05 +00:00
float orientation[4];
luax_readquat(L, 1, orientation, NULL);
lovrAudioSetOrientation(orientation);
return 0;
}
static int l_lovrAudioSetPose(lua_State* L) {
float position[3], orientation[4];
int index = 1;
index = luax_readvec3(L, index, position, NULL);
index = luax_readquat(L, index, orientation, NULL);
lovrAudioSetPosition(position);
lovrAudioSetOrientation(orientation);
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioSetPosition(lua_State* L) {
2018-11-27 23:03:05 +00:00
float position[3];
luax_readvec3(L, 1, position, NULL);
lovrAudioSetPosition(position);
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioSetVelocity(lua_State* L) {
2018-11-27 23:03:05 +00:00
float velocity[3];
luax_readvec3(L, 1, velocity, NULL);
lovrAudioSetVelocity(velocity);
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioSetVolume(lua_State* L) {
float volume = luax_checkfloat(L, 1);
lovrAudioSetVolume(volume);
return 0;
}
2018-09-27 01:27:38 +00:00
static int l_lovrAudioStop(lua_State* L) {
lovrAudioStop();
return 0;
}
2017-03-11 11:08:07 +00:00
2018-09-27 01:27:38 +00:00
static const luaL_Reg lovrAudio[] = {
2017-03-11 11:08:07 +00:00
{ "update", l_lovrAudioUpdate },
{ "getDopplerEffect", l_lovrAudioGetDopplerEffect },
{ "getMicrophoneNames", l_lovrAudioGetMicrophoneNames },
2017-03-11 11:08:07 +00:00
{ "getOrientation", l_lovrAudioGetOrientation },
{ "getPose", l_lovrAudioGetPose },
2017-03-11 11:08:07 +00:00
{ "getPosition", l_lovrAudioGetPosition },
{ "getVelocity", l_lovrAudioGetVelocity },
{ "getVolume", l_lovrAudioGetVolume },
{ "isSpatialized", l_lovrAudioIsSpatialized },
{ "newMicrophone", l_lovrAudioNewMicrophone },
2017-03-11 11:08:07 +00:00
{ "newSource", l_lovrAudioNewSource },
{ "pause", l_lovrAudioPause },
{ "resume", l_lovrAudioResume },
{ "rewind", l_lovrAudioRewind },
{ "setDopplerEffect", l_lovrAudioSetDopplerEffect },
2017-03-11 11:08:07 +00:00
{ "setOrientation", l_lovrAudioSetOrientation },
{ "setPose", l_lovrAudioSetPose },
2017-03-11 11:08:07 +00:00
{ "setPosition", l_lovrAudioSetPosition },
{ "setVelocity", l_lovrAudioSetVelocity },
{ "setVolume", l_lovrAudioSetVolume },
{ "stop", l_lovrAudioStop },
{ NULL, NULL }
};
2018-09-27 01:27:38 +00:00
int luaopen_lovr_audio(lua_State* L) {
lua_newtable(L);
luaL_register(L, NULL, lovrAudio);
luax_registertype(L, "Microphone", lovrMicrophone);
luax_registertype(L, "Source", lovrSource);
if (lovrAudioInit()) {
luax_atexit(L, lovrAudioDestroy);
}
2018-09-27 01:27:38 +00:00
return 1;
}