diff --git a/tools/skap/include/skap_idx_audio.h b/tools/skap/include/skap_idx_audio.h new file mode 100644 index 0000000..3bf587f --- /dev/null +++ b/tools/skap/include/skap_idx_audio.h @@ -0,0 +1,53 @@ +/* + * GNU Sparky --- A 5v5 character-based libre tactical shooter + * Copyright (C) 2024 Wasym A. Alonso + * + * This file is part of Sparky. + * + * Sparky is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sparky is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sparky. If not, see . + */ + + +#pragma once + +#include +#include + +#define SKAP_IDX_AUDIO_MD_NAME_MAX_LEN 512 + +typedef struct { + char name[SKAP_IDX_AUDIO_MD_NAME_MAX_LEN]; + u32 frame_count; + u32 sample_rate; + u32 sample_size; + u32 channels; +} skap_idx_audio_md; + +typedef struct { + skap_idx_audio_md metadata; + usz blob_offset; + usz blob_size; +} skap_idx_audio; + +void skap_idx_audio_loadall(Wave *audios, const char **audio_paths, usz size); + +void skap_idx_audio_unloadall(Wave *audios, usz size); + +skap_idx_audio skap_idx_audio_create(const char *name, Wave *audio); + +u8 skap_idx_audio_append(FILE *fd, skap_idx_audio *i); + +void skap_idx_audio_link_blob(skap_idx_audio *i, usz blob_offset, usz blob_size); + +u8 skap_idx_audio_blob_append(FILE *fd, const char *name, Wave *audio); diff --git a/tools/skap/src/skap.c b/tools/skap/src/skap.c index 0432d7f..3c20ab5 100644 --- a/tools/skap/src/skap.c +++ b/tools/skap/src/skap.c @@ -22,8 +22,10 @@ #include #include #include +#include -#define IMG_COUNT SKAP_ARRLEN(img_paths) +#define IMG_COUNT SKAP_ARRLEN(img_paths) +#define AUDIO_COUNT SKAP_ARRLEN(audio_paths) static const char *img_paths[] = { "assets/icon.png", @@ -35,10 +37,24 @@ static Image imgs[IMG_COUNT] = {0}; static skap_idx_image img_idxs[IMG_COUNT] = {0}; static usz img_idx_locs[IMG_COUNT] = {0}; +static const char *audio_paths[] = { + "assets/music/menu.mp3", + "assets/sounds/7mm/equip.wav", + "assets/sounds/7mm/reload.wav", + "assets/sounds/7mm/shoot.wav", + "assets/sounds/akm/equip.wav", + "assets/sounds/akm/reload.wav", + "assets/sounds/akm/shoot.wav" +}; +static Wave audios[AUDIO_COUNT] = {0}; +static skap_idx_audio audio_idxs[AUDIO_COUNT] = {0}; +static usz audio_idx_locs[AUDIO_COUNT] = {0}; + int main(void) { int result = 0; SetTraceLogLevel(LOG_WARNING); skap_idx_image_loadall(imgs, img_paths, IMG_COUNT); + skap_idx_audio_loadall(audios, audio_paths, AUDIO_COUNT); FILE *fd = skap_file_create(); skap_header header = skap_header_create(IMG_COUNT); if (!skap_header_append(fd, &header)) skap_return_defer(1); @@ -47,6 +63,11 @@ int main(void) { img_idx_locs[i] = ftell(fd); if (!skap_idx_image_append(fd, &img_idxs[i])) skap_return_defer(1); } + for (usz i = 0; i < AUDIO_COUNT; ++i) { + audio_idxs[i] = skap_idx_audio_create(audio_paths[i], &audios[i]); + audio_idx_locs[i] = ftell(fd); + if (!skap_idx_audio_append(fd, &audio_idxs[i])) skap_return_defer(1); + } for (usz i = 0; i < IMG_COUNT; ++i) { usz blob_loc = ftell(fd); skap_idx_image_link_blob(&img_idxs[i], blob_loc, (usz) imgs[i].width * imgs[i].height); @@ -55,8 +76,17 @@ int main(void) { fseek(fd, blob_loc, SEEK_SET); if (!skap_idx_image_blob_append(fd, img_paths[i], &imgs[i])) skap_return_defer(1); } + for (usz i = 0; i < AUDIO_COUNT; ++i) { + usz blob_loc = ftell(fd); + skap_idx_audio_link_blob(&audio_idxs[i], blob_loc, (usz) audios[i].frameCount * audios[i].channels * (audios[i].sampleSize / 8)); + fseek(fd, audio_idx_locs[i], SEEK_SET); + if (!skap_idx_audio_append(fd, &audio_idxs[i])) skap_return_defer(1); + fseek(fd, blob_loc, SEEK_SET); + if (!skap_idx_audio_blob_append(fd, audio_paths[i], &audios[i])) skap_return_defer(1); + } defer: skap_file_destroy(fd); + skap_idx_audio_unloadall(audios, AUDIO_COUNT); skap_idx_image_unloadall(imgs, IMG_COUNT); return result; } diff --git a/tools/skap/src/skap_idx_audio.c b/tools/skap/src/skap_idx_audio.c new file mode 100644 index 0000000..2de1fe9 --- /dev/null +++ b/tools/skap/src/skap_idx_audio.c @@ -0,0 +1,93 @@ +/* + * GNU Sparky --- A 5v5 character-based libre tactical shooter + * Copyright (C) 2024 Wasym A. Alonso + * + * This file is part of Sparky. + * + * Sparky is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sparky is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sparky. If not, see . + */ + + +#include +#include +#include +#include + +void skap_idx_audio_loadall(Wave *audios, const char **audio_paths, usz size) { + InitAudioDevice(); + assert(IsAudioDeviceReady()); + for (usz i = 0; i < size; ++i) { + printf(" LOAD %s\n", audio_paths[i]); + audios[i] = LoadWave(audio_paths[i]); + assert(IsWaveReady(audios[i])); + } +} + +void skap_idx_audio_unloadall(Wave *audios, usz size) { + for (usz i = 0; i < size; ++i) UnloadWave(audios[i]); + CloseAudioDevice(); +} + +skap_idx_audio skap_idx_audio_create(const char *name, Wave *audio) { + skap_idx_audio i = { + .metadata = (skap_idx_audio_md) { + .frame_count = audio->frameCount, + .sample_rate = audio->sampleRate, + .sample_size = audio->sampleSize, + .channels = audio->channels + }, + .blob_offset = 0, + .blob_size = 0 + }; + memset(i.metadata.name, 0, sizeof(i.metadata.name)); + strncpy(i.metadata.name, name, sizeof(i.metadata.name) - 1); + return i; +} + +u8 skap_idx_audio_append(FILE *fd, skap_idx_audio *i) { + if (!fd || !i) { + fprintf(stderr, "ERROR: skap_idx_audio_append :: `fd` and `i` need to be valid pointers\n"); + return 0; + } + printf(" WRITE skap_idx_audio(%s) >> " SKAP_FILENAME "\n", i->metadata.name); + if (fwrite(i, sizeof(skap_idx_audio), 1, fd) != 1) { + fprintf(stderr, "ERROR: skap_idx_audio_append :: unable to write to file\n"); + return 0; + } + return 1; +} + +void skap_idx_audio_link_blob(skap_idx_audio *i, usz blob_offset, usz blob_size) { + if (!i || !blob_offset || !blob_size) { + printf("WARNING: skap_idx_audio_link_blob :: args need to be valid, skipping linkage\n"); + return; + } + printf(" LINK skap_idx_audio(%s) -> {%zu, %zu}\n", i->metadata.name, blob_offset, blob_size); + i->blob_offset = blob_offset; + i->blob_size = blob_size; +} + +u8 skap_idx_audio_blob_append(FILE *fd, const char *name, Wave *audio) { + if (!fd || !audio) { + fprintf(stderr, "ERROR: skap_idx_audio_blob_append :: `fd` and `audio` need to be valid pointers\n"); + return 0; + } + printf(" WRITE %s >> " SKAP_FILENAME "\n", name); + size_t audio_len = audio->frameCount * audio->channels * (audio->sampleSize / 8); + if (fwrite(audio->data, sizeof(u8), audio_len, fd) != audio_len) { + fprintf(stderr, "ERROR: skap_idx_audio_blob_append :: unable to write to file\n"); + return 0; + } + return 1; +} diff --git a/tools/skap/src/skap_idx_image.c b/tools/skap/src/skap_idx_image.c index 35b4995..e30f751 100644 --- a/tools/skap/src/skap_idx_image.c +++ b/tools/skap/src/skap_idx_image.c @@ -32,21 +32,19 @@ void skap_idx_image_loadall(Image *imgs, const char **img_paths, usz size) { } void skap_idx_image_unloadall(Image *imgs, usz size) { - for (usz i = 0; i < size; ++i) { - UnloadImage(imgs[i]); - } + for (usz i = 0; i < size; ++i) UnloadImage(imgs[i]); } skap_idx_image skap_idx_image_create(const char *name, Image *img) { skap_idx_image i = { .metadata = (skap_idx_image_md) { - .width = img->width, - .height = img->height, + .width = img->width, + .height = img->height, .mipmaps = img->mipmaps, - .format = img->format + .format = img->format }, .blob_offset = 0, - .blob_size = 0 + .blob_size = 0 }; memset(i.metadata.name, 0, sizeof(i.metadata.name)); strncpy(i.metadata.name, name, sizeof(i.metadata.name) - 1); @@ -73,7 +71,7 @@ void skap_idx_image_link_blob(skap_idx_image *i, usz blob_offset, usz blob_size) } printf(" LINK skap_idx_image(%s) -> {%zu, %zu}\n", i->metadata.name, blob_offset, blob_size); i->blob_offset = blob_offset; - i->blob_size = blob_size; + i->blob_size = blob_size; } u8 skap_idx_image_blob_append(FILE *fd, const char *name, Image *img) {