From 8abd7a81c988b26c19406c1ea669e050d56d2db5 Mon Sep 17 00:00:00 2001 From: sanine Date: Tue, 13 Sep 2022 12:29:37 -0500 Subject: add initial audio bindings --- src/audio/CMakeLists.txt | 5 ++++ src/audio/audio.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ src/audio/audio.h | 8 ++++++ src/main.c | 10 ++++--- 4 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 src/audio/CMakeLists.txt create mode 100644 src/audio/audio.c create mode 100644 src/audio/audio.h (limited to 'src') 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 +#include + +#define STB_VORBIS_HEADER_ONLY +#include +#define MINIAUDIO_IMPLEMENTATION +#include +#undef STB_VORBIS_HEADER_ONLY +#include + +/* 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 + +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 #include #include +#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 */ -- cgit v1.2.1