From 519e350739f55cfd3ef8b9a97e241b61ca9ed1f9 Mon Sep 17 00:00:00 2001 From: zlago Date: Sun, 1 Sep 2024 12:57:57 +0200 Subject: libopenmpt --- GNUmakefile | 12 ++++++--- src/modules/openmpt.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/modules/openmpt.h | 2 ++ src/sdl.c | 14 +++++++--- 4 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 src/modules/openmpt.c create mode 100644 src/modules/openmpt.h diff --git a/GNUmakefile b/GNUmakefile index 09bd738..6f110de 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -3,11 +3,11 @@ GLAD ?= glad MKDIR ?= mkdir -p -libs ::= SDL2 +libs ::= SDL2 openmpt cflags ::= -I . -g -Og ${CFLAGS} ldflags ::= -Wl,--rpath,'$$ORIGIN' $(addprefix -l,${libs}) ${LDFLAGS} -srcs ::= $(wildcard src/*.c) +srcs ::= $(wildcard src/modules/*.c) objs ::= $(addprefix out/,$(notdir ${srcs:.c=.o})) deps ::= $(addprefix out/,$(notdir ${srcs:.c=.d})) @@ -24,13 +24,19 @@ clean: out/: ${MKDIR} $@ +out/%.o: src/modules/%.c out/%.d | out/ + ${CC} -c -o $@ $< ${cflags} + +out/%.d: src/modules/%.c | out/ + ${CC} ${cflags} ${CPPFLAGS} -MM -MG -MF $@ -MT "${@:.d=.o} $@" $< + out/%.o: src/%.c out/%.d | out/ ${CC} -c -o $@ $< ${cflags} out/%.d: src/%.c | out/ ${CC} ${cflags} ${CPPFLAGS} -MM -MG -MF $@ -MT "${@:.d=.o} $@" $< -out/mu-sdl: ${objs} | out/ +out/mu-%: out/%.o ${objs} | out/ ${CC} -o $@ $^ ${cflags} ${ldflags} include ${deps} diff --git a/src/modules/openmpt.c b/src/modules/openmpt.c new file mode 100644 index 0000000..ee63731 --- /dev/null +++ b/src/modules/openmpt.c @@ -0,0 +1,72 @@ +#include +#include "../include.h" + +#include + +void openmpt_callback(void *mod, unsigned char *stream, int const length) { + openmpt_module_read_interleaved_float_stereo(mod, 48000, length / sizeof (float) / 2, (float *) stream); +} + +static void libopenmpt_example_logfunc( const char * message, void * userdata ); +static int libopenmpt_example_errfunc( int error, void * userdata ); +static void libopenmpt_example_print_error( const char * func_name, int mod_err, const char * mod_err_str ); + +int module_openmpt(struct blob *file, SDL_AudioDeviceID audio, struct userdata *userdata) { + int mod_err = OPENMPT_ERROR_OK; + const char *mod_err_str = NULL; + openmpt_module *mod = openmpt_module_create_from_memory2(file->data, file->size, &libopenmpt_example_logfunc, NULL, &libopenmpt_example_errfunc, NULL, &mod_err, &mod_err_str, NULL); + if (mod == NULL) { + libopenmpt_example_print_error("openmpt_module_create_from_memory2()", mod_err, mod_err_str); + openmpt_free_string(mod_err_str); + return 1; + } + openmpt_module_set_repeat_count(mod, -1); + SDL_LockAudioDevice(audio); + userdata->callback = openmpt_callback; + userdata->user = mod; + userdata->freefunc = (void (*)(void *)) openmpt_module_destroy; + SDL_UnlockAudioDevice(audio); + return 0; +} + +// copy pasted +static void libopenmpt_example_logfunc( const char * message, void * userdata ) { + (void)userdata; + if ( message ) { + fprintf( stderr, "openmpt: %s\n", message ); + } +} + +static int libopenmpt_example_errfunc( int error, void * userdata ) { + (void)userdata; + (void)error; + return OPENMPT_ERROR_FUNC_RESULT_DEFAULT & ~OPENMPT_ERROR_FUNC_RESULT_LOG; +} + +static void libopenmpt_example_print_error( const char * func_name, int mod_err, const char * mod_err_str ) { + if ( !func_name ) { + func_name = "unknown function"; + } + if ( mod_err == OPENMPT_ERROR_OUT_OF_MEMORY ) { + mod_err_str = openmpt_error_string( mod_err ); + if ( !mod_err_str ) { + fprintf( stderr, "Error: %s\n", "OPENMPT_ERROR_OUT_OF_MEMORY" ); + } else { + fprintf( stderr, "Error: %s\n", mod_err_str ); + openmpt_free_string( mod_err_str ); + mod_err_str = NULL; + } + } else { + if ( !mod_err_str ) { + mod_err_str = openmpt_error_string( mod_err ); + if ( !mod_err_str ) { + fprintf( stderr, "Error: %s failed.\n", func_name ); + } else { + fprintf( stderr, "Error: %s failed: %s\n", func_name, mod_err_str ); + } + openmpt_free_string( mod_err_str ); + mod_err_str = NULL; + } + fprintf( stderr, "Error: %s failed: %s\n", func_name, mod_err_str ); + } +} diff --git a/src/modules/openmpt.h b/src/modules/openmpt.h new file mode 100644 index 0000000..3daa7cd --- /dev/null +++ b/src/modules/openmpt.h @@ -0,0 +1,2 @@ +#include "../include.h" +int module_openmpt(struct blob *file, SDL_AudioDeviceID audio, struct userdata *userdata); diff --git a/src/sdl.c b/src/sdl.c index d99fc34..e780906 100644 --- a/src/sdl.c +++ b/src/sdl.c @@ -5,7 +5,7 @@ #include #include -#include +#include "modules/openmpt.h" #define eprintf(...) fprintf(stderr, __VA_ARGS__) @@ -103,9 +103,15 @@ int main(void) { break; } SDL_free(evt.drop.file); - //SDL_LockAudioDevice(audio); - //openmpt_module *mod = openmpt_module_create_from_memory2(file.data, file.size, &libopenmpt_example_logfunc, NULL, &libopenmpt_example_errfunc, NULL, &mod_err, &mod_err_str, NULL); - //SDL_UnlockAudioDevice(audio); + struct userdata newuser = {.callback = NULL, .freefunc = NULL}; + if (module_openmpt(&file, audio, &newuser)) { + // error + } else { + if (userdata.freefunc != NULL) { + userdata.freefunc(userdata.user); + } + userdata = newuser; + } free(file.data); break; -- cgit 1.4.1-2-gfad0