2017-12-10 20:40:37 +00:00
|
|
|
#include "api.h"
|
2017-01-03 03:09:33 +00:00
|
|
|
#include "audio/audio.h"
|
2019-05-18 00:11:22 +00:00
|
|
|
#include "data/blob.h"
|
2019-04-05 11:16:34 +00:00
|
|
|
#include "data/soundData.h"
|
2019-06-02 07:20:10 +00:00
|
|
|
#include "core/ref.h"
|
2020-12-25 19:50:26 +00:00
|
|
|
#include "core/util.h"
|
2019-05-13 10:53:17 +00:00
|
|
|
#include <stdlib.h>
|
2017-01-03 03:09:33 +00:00
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
StringEntry lovrAudioType[] = {
|
|
|
|
[AUDIO_PLAYBACK] = ENTRY("playback"),
|
|
|
|
[AUDIO_CAPTURE] = ENTRY("capture"),
|
2020-02-17 02:31:02 +00:00
|
|
|
{ 0 }
|
2018-07-06 05:08:14 +00:00
|
|
|
};
|
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
static int l_lovrAudioReset(lua_State* L) {
|
|
|
|
lovrAudioReset();
|
2017-01-06 01:00:53 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
static int l_lovrAudioStart(lua_State* L) {
|
2020-11-21 03:47:59 +00:00
|
|
|
AudioType type = luax_checkenum(L, 1, AudioType, "playback");
|
2020-12-02 15:56:06 +00:00
|
|
|
bool started = lovrAudioStart(type);
|
|
|
|
lua_pushboolean(L, started);
|
2020-11-30 16:27:30 +00:00
|
|
|
return 1;
|
2017-01-06 05:36:38 +00:00
|
|
|
}
|
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
static int l_lovrAudioStop(lua_State* L) {
|
2020-11-21 03:47:59 +00:00
|
|
|
AudioType type = luax_checkenum(L, 1, AudioType, "playback");
|
2020-05-10 08:48:01 +00:00
|
|
|
lovrAudioStop(type);
|
|
|
|
return 0;
|
2017-02-26 20:57:56 +00:00
|
|
|
}
|
|
|
|
|
2018-09-27 01:27:38 +00:00
|
|
|
static int l_lovrAudioGetVolume(lua_State* L) {
|
2017-01-06 08:41:08 +00:00
|
|
|
lua_pushnumber(L, lovrAudioGetVolume());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
static int l_lovrAudioSetVolume(lua_State* L) {
|
|
|
|
float volume = luax_checkfloat(L, 1);
|
|
|
|
lovrAudioSetVolume(volume);
|
|
|
|
return 0;
|
2018-07-07 00:55:19 +00:00
|
|
|
}
|
|
|
|
|
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;
|
2018-07-25 04:15:07 +00:00
|
|
|
SoundData* soundData = luax_totype(L, 1, SoundData);
|
2021-01-13 10:38:22 +00:00
|
|
|
|
2020-12-02 15:35:38 +00:00
|
|
|
bool spatial = true;
|
|
|
|
if (lua_istable(L, 2)) {
|
|
|
|
lua_getfield(L, 2, "spatial");
|
|
|
|
if (lua_isboolean(L, -1)) {
|
|
|
|
spatial = lua_toboolean(L, -1);
|
|
|
|
}
|
|
|
|
lua_pop(L, 1);
|
|
|
|
}
|
2021-01-13 10:38:22 +00:00
|
|
|
|
2018-07-06 05:08:14 +00:00
|
|
|
|
2020-05-10 08:48:01 +00:00
|
|
|
if (soundData) {
|
2020-11-26 10:21:44 +00:00
|
|
|
source = lovrSourceCreate(soundData, spatial);
|
2018-01-22 16:14:24 +00:00
|
|
|
} else {
|
2020-05-10 08:48:01 +00:00
|
|
|
Blob* blob = luax_readblob(L, 1, "Source");
|
|
|
|
soundData = lovrSoundDataCreateFromFile(blob, false);
|
|
|
|
lovrRelease(Blob, blob);
|
|
|
|
|
2020-11-26 10:21:44 +00:00
|
|
|
source = lovrSourceCreate(soundData, spatial);
|
2020-05-10 08:48:01 +00:00
|
|
|
lovrRelease(SoundData, soundData);
|
2018-01-22 16:14:24 +00:00
|
|
|
}
|
|
|
|
|
2019-06-02 07:20:10 +00:00
|
|
|
luax_pushtype(L, Source, source);
|
2019-04-05 10:41:03 +00:00
|
|
|
lovrRelease(Source, source);
|
2017-01-06 01:00:53 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2017-01-06 05:36:38 +00:00
|
|
|
|
2020-11-25 21:28:43 +00:00
|
|
|
static int l_lovrAudioSetListenerPose(lua_State *L) {
|
|
|
|
float position[4], orientation[4];
|
|
|
|
int index = 1;
|
|
|
|
index = luax_readvec3(L, index, position, NULL);
|
|
|
|
index = luax_readquat(L, index, orientation, NULL);
|
|
|
|
lovrAudioSetListenerPose(position, orientation);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-16 15:07:29 +00:00
|
|
|
static int l_lovrAudioGetCaptureStream(lua_State* L) {
|
|
|
|
SoundData* soundData = lovrAudioGetCaptureStream();
|
2020-11-26 12:46:55 +00:00
|
|
|
luax_pushtype(L, SoundData, soundData);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2020-12-10 14:27:09 +00:00
|
|
|
static int l_lovrAudioGetDevices(lua_State *L) {
|
2021-01-13 10:38:22 +00:00
|
|
|
AudioType type = luax_checkenum(L, 1, AudioType, "playback");
|
|
|
|
|
|
|
|
AudioDeviceArr *devices = lovrAudioGetDevices(type);
|
2020-12-10 21:33:52 +00:00
|
|
|
lua_newtable(L);
|
|
|
|
int listOfDevicesIdx = lua_gettop(L);
|
2021-01-13 10:38:22 +00:00
|
|
|
for(int i = 0; i < devices->length; i++) {
|
|
|
|
AudioDevice *device = &devices->data[i];
|
2020-12-10 21:33:52 +00:00
|
|
|
lua_pushinteger(L, i+1); // key in listOfDevicesIdx, for the bottom settable
|
|
|
|
lua_newtable(L);
|
|
|
|
luax_pushenum(L, AudioType, device->type);
|
|
|
|
lua_setfield(L, -2, "type");
|
|
|
|
lua_pushstring(L, device->name);
|
|
|
|
lua_setfield(L, -2, "name");
|
|
|
|
lua_pushboolean(L, device->isDefault);
|
|
|
|
lua_setfield(L, -2, "isDefault");
|
|
|
|
|
|
|
|
lua_settable(L, listOfDevicesIdx);
|
2020-12-10 14:27:09 +00:00
|
|
|
}
|
2021-01-13 10:38:22 +00:00
|
|
|
lovrAudioFreeDevices(devices);
|
2020-12-10 21:33:52 +00:00
|
|
|
return 1;
|
2020-11-26 12:46:55 +00:00
|
|
|
}
|
|
|
|
|
2020-12-10 14:27:09 +00:00
|
|
|
static int l_lovrUseDevice(lua_State *L) {
|
2021-01-13 10:38:22 +00:00
|
|
|
AudioType type = luax_checkenum(L, 1, AudioType, "playback");
|
|
|
|
const char *name = lua_tostring(L, 2);
|
|
|
|
int sampleRate = lua_tointeger(L, 3);
|
|
|
|
SampleFormat format = luax_checkenum(L, 4, SampleFormat, "invalid");
|
|
|
|
lovrAudioUseDevice(type, name, sampleRate, format);
|
2020-11-26 12:46:55 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-09-27 01:27:38 +00:00
|
|
|
static const luaL_Reg lovrAudio[] = {
|
2020-05-10 08:48:01 +00:00
|
|
|
{ "reset", l_lovrAudioReset },
|
|
|
|
{ "start", l_lovrAudioStart },
|
|
|
|
{ "stop", l_lovrAudioStop },
|
2017-03-11 11:08:07 +00:00
|
|
|
{ "getVolume", l_lovrAudioGetVolume },
|
|
|
|
{ "setVolume", l_lovrAudioSetVolume },
|
2020-05-10 08:48:01 +00:00
|
|
|
{ "newSource", l_lovrAudioNewSource },
|
2020-11-25 21:28:43 +00:00
|
|
|
{ "setListenerPose", l_lovrAudioSetListenerPose },
|
2020-12-16 15:07:29 +00:00
|
|
|
{ "getCaptureStream", l_lovrAudioGetCaptureStream },
|
2020-12-10 14:27:09 +00:00
|
|
|
{ "getDevices", l_lovrAudioGetDevices },
|
|
|
|
{ "useDevice", l_lovrUseDevice },
|
2017-03-11 11:08:07 +00:00
|
|
|
{ NULL, NULL }
|
|
|
|
};
|
2018-09-27 01:27:38 +00:00
|
|
|
|
2019-08-26 22:53:10 +00:00
|
|
|
int luaopen_lovr_audio(lua_State* L) {
|
2018-09-27 01:27:38 +00:00
|
|
|
lua_newtable(L);
|
2020-08-19 19:12:06 +00:00
|
|
|
luax_register(L, lovrAudio);
|
2019-04-05 10:48:36 +00:00
|
|
|
luax_registertype(L, Source);
|
2021-01-13 10:38:22 +00:00
|
|
|
AudioConfig config[2] = {
|
|
|
|
{ .enable = true, .start = true, .format = SAMPLE_F32, .sampleRate = 44100 },
|
|
|
|
{ .enable = false, .start = false, .format = SAMPLE_F32, .sampleRate = 44100 }
|
2020-12-11 23:05:35 +00:00
|
|
|
};
|
2020-05-10 08:48:01 +00:00
|
|
|
if (lovrAudioInit(config)) {
|
2018-11-19 16:08:56 +00:00
|
|
|
luax_atexit(L, lovrAudioDestroy);
|
|
|
|
}
|
2018-09-27 01:27:38 +00:00
|
|
|
return 1;
|
|
|
|
}
|