From ff97a38a1e4373b14a60a5089ac4194341c1b56c Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sat, 22 Nov 2025 02:29:49 +0900 Subject: [PATCH] update --- CMakeLists.txt | 77 ++++++++++++------ include/MDE/Audio/Audio.h | 29 +++++++ include/MDE/{ => Core}/Directory.h | 0 include/MDE/{ => Core}/File.h | 0 include/MDE/{ => Core}/String.h | 0 include/MDE/{ => Core}/Users.h | 0 include/MDE/Foundation.h | 10 ++- src/audio/driver/alsa.c | 123 +++++++++++++++++++++++++++++ src/audio/mixer.c | 0 src/{ => core}/directory.c | 4 +- src/{ => core}/file.c | 4 +- src/{ => core}/string.c | 5 +- src/{ => core}/users.c | 4 +- 13 files changed, 217 insertions(+), 39 deletions(-) create mode 100644 include/MDE/Audio/Audio.h rename include/MDE/{ => Core}/Directory.h (100%) rename include/MDE/{ => Core}/File.h (100%) rename include/MDE/{ => Core}/String.h (100%) rename include/MDE/{ => Core}/Users.h (100%) create mode 100644 src/audio/driver/alsa.c create mode 100644 src/audio/mixer.c rename src/{ => core}/directory.c (91%) rename src/{ => core}/file.c (89%) rename src/{ => core}/string.c (63%) rename src/{ => core}/users.c (93%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 644f49d..4b8dc89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,30 +3,61 @@ project( mdelibs ) -file( - GLOB - MDELib_SRC - src/*.c -) - -add_library( - MDELib - SHARED - ${MDELib_SRC} -) - -target_include_directories( - MDELib - PUBLIC - include -) - include(GNUInstallDirs) -install( - TARGETS MDELib - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) +macro(setup_lib dir name) + file( + GLOB + MDE${name}_SRC + src/${dir}/*.c + ) + + add_library( + MDE${name} + SHARED + ${MDE${name}_SRC} + ) + + target_include_directories( + MDE${name} + PUBLIC + include + ) + + install( + TARGETS MDE${name} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +endmacro() + +setup_lib(core Core) +setup_lib(audio Audio) + +find_package(PkgConfig) +pkg_check_modules(ALSA alsa) +if(ALSA_FOUND) + target_include_directories( + MDEAudio + PRIVATE + ${ALSA_INCLUDE_DIRS} + ) + target_link_directories( + MDEAudio + PRIVATE + ${ALSA_LIBRARY_DIRS} + ) + target_link_libraries( + MDEAudio + PRIVATE + ${ALSA_LIBRARIES} pthread + ) + target_sources( + MDEAudio + PRIVATE + src/audio/driver/alsa.c + ) +endif() + install( DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} diff --git a/include/MDE/Audio/Audio.h b/include/MDE/Audio/Audio.h new file mode 100644 index 0000000..621de04 --- /dev/null +++ b/include/MDE/Audio/Audio.h @@ -0,0 +1,29 @@ +#ifndef __MDE_AUDIO_H__ +#define __MDE_AUDIO_H__ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* always stereo, btw */ +#define MDEAudioRate 48000 + +/* S16, stereo. frames*2*2 == bytes */ +typedef void(*MDEAudioHandler)(void* handle, void* user, void* data, int frames); + +/* driver functions */ +void* MDEAudioOpen(MDEAudioHandler handler, void* user); + +void MDEAudioClose(void* handle); + +void MDEAudioStart(void* handle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/MDE/Directory.h b/include/MDE/Core/Directory.h similarity index 100% rename from include/MDE/Directory.h rename to include/MDE/Core/Directory.h diff --git a/include/MDE/File.h b/include/MDE/Core/File.h similarity index 100% rename from include/MDE/File.h rename to include/MDE/Core/File.h diff --git a/include/MDE/String.h b/include/MDE/Core/String.h similarity index 100% rename from include/MDE/String.h rename to include/MDE/Core/String.h diff --git a/include/MDE/Users.h b/include/MDE/Core/Users.h similarity index 100% rename from include/MDE/Users.h rename to include/MDE/Core/Users.h diff --git a/include/MDE/Foundation.h b/include/MDE/Foundation.h index c581037..8029e2e 100644 --- a/include/MDE/Foundation.h +++ b/include/MDE/Foundation.h @@ -3,9 +3,11 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include + +#include #endif diff --git a/src/audio/driver/alsa.c b/src/audio/driver/alsa.c new file mode 100644 index 0000000..86a10b6 --- /dev/null +++ b/src/audio/driver/alsa.c @@ -0,0 +1,123 @@ +#include + +#include + +#include + +typedef struct driver { + MDEAudioHandler handler; + void* user; + snd_pcm_t* device; + snd_pcm_hw_params_t* params; + + int quit; + pthread_t thread; + pthread_mutex_t mutex; +} driver_t; + +static void* thread_routine(void* arg){ + driver_t* drv = arg; + snd_pcm_uframes_t frame; + void* data; + + snd_pcm_hw_params_get_period_size(drv->params, &frame, 0); + + data = malloc(frame * 2 * 2); + + while(1){ + drv->handler(drv, drv->user, data, frame); + if(snd_pcm_writei(drv->device, data, frame) == -EPIPE){ + snd_pcm_prepare(drv->device); + } + + pthread_mutex_lock(&drv->mutex); + if(drv->quit){ + pthread_mutex_unlock(&drv->mutex); + break; + } + pthread_mutex_unlock(&drv->mutex); + } + + free(data); + + return NULL; +} + +void* MDEAudioOpen(MDEAudioHandler handler, void* user){ + int rate = MDEAudioRate; + driver_t* drv = malloc(sizeof(*drv)); + memset(drv, 0, sizeof(*drv)); + + drv->quit = 0; + drv->handler = handler; + drv->user = user; + + if(snd_pcm_open(&drv->device, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0){ + MDEAudioClose(drv); + return NULL; + } + + snd_pcm_hw_params_malloc(&drv->params); + snd_pcm_hw_params_any(drv->device, drv->params); + + if(snd_pcm_hw_params_set_access(drv->device, drv->params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0){ + MDEAudioClose(drv); + return NULL; + } + + if(snd_pcm_hw_params_set_format(drv->device, drv->params, SND_PCM_FORMAT_S16) < 0){ + MDEAudioClose(drv); + return NULL; + } + + if(snd_pcm_hw_params_set_channels(drv->device, drv->params, 2) < 0){ + MDEAudioClose(drv); + return NULL; + } + + if(snd_pcm_hw_params_set_rate_near(drv->device, drv->params, &rate, 0) < 0){ + MDEAudioClose(drv); + return NULL; + } + + if(snd_pcm_hw_params_set_rate(drv->device, drv->params, rate, 0) < 0){ + MDEAudioClose(drv); + return NULL; + } + + if(snd_pcm_hw_params(drv->device, drv->params) < 0){ + MDEAudioClose(drv); + return NULL; + } + + pthread_mutex_init(&drv->mutex, NULL); + + return drv; +} + +void MDEAudioClose(void* handle){ + driver_t* drv = handle; + + if(drv->device != NULL){ + void* ret; + + pthread_mutex_lock(&drv->mutex); + drv->quit = 1; + pthread_mutex_unlock(&drv->mutex); + pthread_join(drv->thread, &ret); + + pthread_mutex_destroy(&drv->mutex); + + snd_pcm_drain(drv->device); + snd_pcm_close(drv->device); + snd_pcm_hw_params_free(drv->params); + } + + free(drv); +} + +void MDEAudioStart(void* handle){ + driver_t* drv = handle; + + pthread_create(&drv->thread, NULL, thread_routine, handle); +} diff --git a/src/audio/mixer.c b/src/audio/mixer.c new file mode 100644 index 0000000..e69de29 diff --git a/src/directory.c b/src/core/directory.c similarity index 91% rename from src/directory.c rename to src/core/directory.c index 53f0366..523839c 100644 --- a/src/directory.c +++ b/src/core/directory.c @@ -1,7 +1,5 @@ -#include +#include -#include -#include #include #include diff --git a/src/file.c b/src/core/file.c similarity index 89% rename from src/file.c rename to src/core/file.c index 1edac37..d5cced7 100644 --- a/src/file.c +++ b/src/core/file.c @@ -1,6 +1,4 @@ -#include - -#include +#include void MDEFileCopy(const char* src, const char* dst) { char buffer[4096]; diff --git a/src/string.c b/src/core/string.c similarity index 63% rename from src/string.c rename to src/core/string.c index a2753a6..3f429ea 100644 --- a/src/string.c +++ b/src/core/string.c @@ -1,7 +1,4 @@ -#include - -#include -#include +#include char* MDEStringDuplicate(const char* src) { char* s = malloc(strlen(src) + 1); diff --git a/src/users.c b/src/core/users.c similarity index 93% rename from src/users.c rename to src/core/users.c index 064f1d4..f748c57 100644 --- a/src/users.c +++ b/src/core/users.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include