From 9bfcd5552ef6f5ff65121b5128cca2a06b5018fd Mon Sep 17 00:00:00 2001 From: herbglitch Date: Wed, 13 Sep 2023 21:32:30 -0600 Subject: [PATCH] added reaaly basic audio --- CMakeLists.txt | 6 ++++- include/arc/audio/audio.h | 16 +++++++++++++ include/arc/audio/config.h | 22 ++++++++++++++++++ include/arc/audio/sdl/audio.h | 12 ++++++++++ src/audio/sdl/audio.c | 7 ++++++ src/audio/sdl/config.c | 43 +++++++++++++++++++++++++++++++++++ src/engine/engine.c | 6 ++++- src/graphics/sdl/window.c | 2 +- 8 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 include/arc/audio/audio.h create mode 100644 include/arc/audio/config.h create mode 100644 include/arc/audio/sdl/audio.h create mode 100644 src/audio/sdl/audio.c create mode 100644 src/audio/sdl/config.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c9b71b..4e13d2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ if(ARCHEUS_STD_SDL) find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_ttf REQUIRED) + find_package(SDL2_mixer REQUIRED) string(APPEND ARCHEUS_STD_FLAGS "-DARC_SDL ") endif() @@ -75,6 +76,9 @@ set(ARCHEUS_STD_SOURCES ) set(ARCHEUS_STD_SDL_SOURCES + src/audio/sdl/audio.c + src/audio/sdl/config.c + src/input/sdl/keyboard.c src/input/sdl/mouse.c @@ -130,7 +134,7 @@ if(ARCHEUS_STD_SDL) PRIVATE ${SDL2IMAGE_INCLUDE_DIRS} ) - target_link_libraries(archeus_std PUBLIC ${SDL2_LIBRARIES} SDL2_image::SDL2_image SDL2_ttf::SDL2_ttf) + target_link_libraries(archeus_std PUBLIC ${SDL2_LIBRARIES} SDL2_image::SDL2_image SDL2_ttf::SDL2_ttf SDL2_mixer::SDL2_mixer) endif() if(ARCHEUS_STD_OPENGL) diff --git a/include/arc/audio/audio.h b/include/arc/audio/audio.h new file mode 100644 index 0000000..e342783 --- /dev/null +++ b/include/arc/audio/audio.h @@ -0,0 +1,16 @@ +#ifndef ARC_AUDIO_H_ +#define ARC_AUDIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ARC_Audio ARC_Audio; + +void ARC_Audio_Play(ARC_Audio *audio); + +#ifdef __cplusplus +} +#endif + +#endif // !ARC_AUDIO_H_ diff --git a/include/arc/audio/config.h b/include/arc/audio/config.h new file mode 100644 index 0000000..2eb9750 --- /dev/null +++ b/include/arc/audio/config.h @@ -0,0 +1,22 @@ +#ifndef ARC_AUDIO_CONFIG_H_ +#define ARC_AUDIO_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "arc/std/string.h" + +typedef struct ARC_Config ARC_Config; +void ARC_AudioConfig_Init(ARC_Config *config); + +uint8_t ARC_Audio_Read(ARC_Config *config, ARC_String *string, void **value); + +void ARC_Audio_Delete(ARC_Config *config, ARC_String *string, void *value); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_AUDIO_CONFIG_H_ \ No newline at end of file diff --git a/include/arc/audio/sdl/audio.h b/include/arc/audio/sdl/audio.h new file mode 100644 index 0000000..92afa3e --- /dev/null +++ b/include/arc/audio/sdl/audio.h @@ -0,0 +1,12 @@ +#ifndef ARC_SDL_AUDIO_H_ +#define ARC_SDL_AUDIO_H_ + +#ifdef ARC_SDL +#include + +typedef struct ARC_Audio { + Mix_Chunk *chunk; +} ARC_Audio; + +#endif // !ARC_SDL +#endif // !ARC_SDL_AUDIO_H_ diff --git a/src/audio/sdl/audio.c b/src/audio/sdl/audio.c new file mode 100644 index 0000000..8709787 --- /dev/null +++ b/src/audio/sdl/audio.c @@ -0,0 +1,7 @@ +#include "arc/audio/audio.h" +#include "arc/audio/sdl/audio.h" +#include + +void ARC_Audio_Play(ARC_Audio *audio){ + Mix_PlayChannel(-1, audio->chunk, 0); +} \ No newline at end of file diff --git a/src/audio/sdl/config.c b/src/audio/sdl/config.c new file mode 100644 index 0000000..141b23d --- /dev/null +++ b/src/audio/sdl/config.c @@ -0,0 +1,43 @@ +#include "arc/audio/config.h" +#include "arc/audio/sdl/audio.h" +#include +#include +#include "arc/std/config.h" +#include "arc/std/errno.h" +#include "arc/audio/audio.h" + +// #define ARC_DEFAULT_CONFIG +#include "arc/std/defaults/config.h" + +void ARC_AudioConfig_Init(ARC_Config *config){ + ARC_Config_AddKeyCString(config, (char *)"ARC_Audio", 9, ARC_Audio_Read, ARC_Audio_Delete); +} + +uint8_t ARC_Audio_Read(ARC_Config *config, ARC_String *string, void **value){ + ARC_Config_Get(config, string, value); + if(*value){ + return 1; + } + + if(string->data[0] != '"' || string->data[string->length - 1] != '"'){ + ARC_DEBUG_LOG(arc_errno, "in ARC_Point_Read(config, string, value); no matching quotes: %s", string->data); + arc_errno = ARC_ERRNO_DATA; + return 0; + } + + ARC_Audio *audio = (ARC_Audio *)malloc(sizeof(ARC_Audio)); + + ARC_String *path; + ARC_String_CopySubstring(&path, string, 1, string->length - 2); + audio->chunk = Mix_LoadWAV(path->data); + + //TODO: get error message if not loaded + + *value = (void *)audio; + return 0; +} + +void ARC_Audio_Delete(ARC_Config* config, ARC_String *string, void *value){ + Mix_FreeChunk(((ARC_Audio *)value)->chunk); + free((ARC_Audio *)value); +} \ No newline at end of file diff --git a/src/engine/engine.c b/src/engine/engine.c index 3b0fa67..5f3ddf3 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -15,8 +15,8 @@ #include "arc/input/sdl/mouse.h" #include "arc/input/sdl/keyboard.h" #include -#include #include +#include #elif ARC_OPENGL #include "arc/graphics/opengl/window.h" #include "arc/graphics/opengl/renderer.h" @@ -43,6 +43,8 @@ void ARC_EngineData_Create(ARC_EngineData **data, ARC_Handler_CleanDataFn cleanf //TEMP #ifdef ARC_SDL TTF_Init(); + Mix_Init(0); + Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024); #endif #ifdef ARC_SDL @@ -85,6 +87,8 @@ void ARC_EngineData_Create(ARC_EngineData **data, ARC_Handler_CleanDataFn cleanf void ARC_EngineData_Destroy(ARC_EngineData *data){ #ifdef ARC_SDL free(data->mouse->event); + TTF_Quit(); + Mix_Quit(); #endif // ARC_SDL ARC_Mouse_Destroy(data->mouse); diff --git a/src/graphics/sdl/window.c b/src/graphics/sdl/window.c index 73b4785..7921a96 100644 --- a/src/graphics/sdl/window.c +++ b/src/graphics/sdl/window.c @@ -12,7 +12,7 @@ void ARC_Window_Create(ARC_Window **window, ARC_WindowInfo *info){ return; } - if(SDL_Init(SDL_INIT_VIDEO) < 0){ + if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0){ arc_errno = ARC_ERRNO_INIT; printf("Error: initializing SDL\nSDL Error: %s\n", SDL_GetError()); return;