summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-09-13 12:29:37 -0500
committersanine <sanine.not@pm.me>2022-09-13 12:29:37 -0500
commit8abd7a81c988b26c19406c1ea669e050d56d2db5 (patch)
treee4c9eaa76370380bec3c507bd6f42b6200540022 /src
parent4826589445515d99e620da19e0d809728c071283 (diff)
add initial audio bindings
Diffstat (limited to 'src')
-rw-r--r--src/audio/CMakeLists.txt5
-rw-r--r--src/audio/audio.c74
-rw-r--r--src/audio/audio.h8
-rw-r--r--src/main.c10
4 files changed, 93 insertions, 4 deletions
diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt
new file mode 100644
index 0000000..41644fb
--- /dev/null
+++ b/src/audio/CMakeLists.txt
@@ -0,0 +1,5 @@
+project(honey_engine)
+
+target_sources(honey PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/audio.c
+)
diff --git a/src/audio/audio.c b/src/audio/audio.c
new file mode 100644
index 0000000..45d11c2
--- /dev/null
+++ b/src/audio/audio.c
@@ -0,0 +1,74 @@
+#include <lua.h>
+#include <honeysuckle.h>
+
+#define STB_VORBIS_HEADER_ONLY
+#include <stb_vorbis.c>
+#define MINIAUDIO_IMPLEMENTATION
+#include <miniaudio.h>
+#undef STB_VORBIS_HEADER_ONLY
+#include <stb_vorbis.c>
+
+/* stb_vorbis defines this for some reason? */
+#undef L
+
+#include "audio.h"
+
+
+int audio_engine_init(lua_State *L);
+int audio_engine_uninit(lua_State *L);
+int audio_engine_play_sound(lua_State *L);
+
+
+void setup_audio(lua_State *L, int honey_tbl)
+{
+ hs_create_table(L,
+ hs_str_cfunc("engine_init", audio_engine_init),
+ hs_str_cfunc("engine_uninit", audio_engine_uninit),
+ hs_str_cfunc("engine_play_sound", audio_engine_play_sound),
+
+ /* ma_result values */
+ hs_str_int("MA_SUCCESS", MA_SUCCESS),
+ );
+ lua_setfield(L, honey_tbl, "audio");
+}
+
+
+int audio_engine_init(lua_State *L)
+{
+ ma_engine *engine = malloc(sizeof(ma_engine));
+ if (engine == NULL)
+ hs_throw_error(L, "failed to allocate memory for engine");
+
+ ma_result result = ma_engine_init(NULL, engine);
+ if (result != MA_SUCCESS)
+ hs_throw_error(L, "failed to initialize audio engine: %d", result);
+
+ lua_pushlightuserdata(L, engine);
+ return 1;
+}
+
+
+int audio_engine_uninit(lua_State *L)
+{
+ ma_engine *engine;
+ void *engine_ptr;
+ hs_parse_args(L, hs_light(engine_ptr));
+ engine = engine_ptr;
+
+ ma_engine_uninit(engine);
+ free(engine);
+ return 0;
+}
+
+
+int audio_engine_play_sound(lua_State *L)
+{
+ ma_engine *engine;
+ void *engine_ptr;
+ char *filename;
+ hs_parse_args(L, hs_light(engine_ptr), hs_str(filename));
+ engine = engine_ptr;
+
+ ma_engine_play_sound(engine, filename, NULL);
+ return 0;
+}
diff --git a/src/audio/audio.h b/src/audio/audio.h
new file mode 100644
index 0000000..1aa7f43
--- /dev/null
+++ b/src/audio/audio.h
@@ -0,0 +1,8 @@
+#ifndef HONEY_AUDIO_H
+#define HONEY_AUDIO_H
+
+#include <lua.h>
+
+void setup_audio(lua_State *L, int honey_tbl);
+
+#endif
diff --git a/src/main.c b/src/main.c
index f73da4c..e11a0c6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,11 +2,12 @@
#include <lauxlib.h>
#include <lualib.h>
#include <honeysuckle.h>
+#include "audio/audio.h"
#include "gl/gl.h"
-#include "image/image.h"
#include "glm/glm.h"
-#include "options/options.h"
+#include "image/image.h"
#include "logging/logging.h"
+#include "options/options.h"
int main(int argc, char **argv)
@@ -24,11 +25,12 @@ int main(int argc, char **argv)
/* load honey bindings */
lua_createtable(L, 0, 2);
int honey_index = lua_gettop(L);
+ setup_audio(L, honey_index);
setup_gl(L, honey_index);
- setup_window(L, honey_index);
- setup_image(L, honey_index);
setup_glm(L, honey_index);
+ setup_image(L, honey_index);
setup_logging(L, honey_index);
+ setup_window(L, honey_index);
lua_setglobal(L, "honey");
/* load main script */