z_mirror/sdl-osu

git clone https://git.raiguard.me/z_mirror/sdl-osu

Caleb HeuerSwitch to four-space indents and inline braces836a89c

trunk
2.5 KiB82 linesraw
1#include "beatmapstore.h"
2#include "beatmap.h"
3#include "defines.h"
4#include "util.h"
5#include <SDL3/SDL.h>
6#include <stdio.h>
7#include <stdlib.h>
8
9struct Osu_BeatmapStore* Osu_CreateBeatmapStore(const char* dataPath) {
10    struct Osu_BeatmapStore* beatmaps = calloc(1, sizeof(struct Osu_BeatmapStore));
11    beatmaps->mutex = SDL_CreateMutex();
12    beatmaps->beatmapsLen = 0;
13    SDL_asprintf(&beatmaps->basePath, "%s" OSU_PATHSEP "beatmaps", dataPath);
14    if (SDL_GetPathInfo(beatmaps->basePath, NULL)) {
15        SDL_SAFEASSN(beatmaps->loadWorker, SDL_CreateThread, &Osu_LoadBeatmapsWorker, "BeatmapLoader", beatmaps);
16    }
17    return beatmaps;
18}
19
20void Osu_DestroyBeatmapStore(struct Osu_BeatmapStore* beatmaps) {
21    SDL_LockMutex(beatmaps->mutex);
22    for (Uint32 i = 0; i < beatmaps->beatmapsLen; i++) {
23        Osu_DestroyBeatmap(beatmaps->beatmaps[i]);
24    }
25    free(beatmaps->beatmaps);
26    beatmaps->beatmaps = NULL;
27    SDL_UnlockMutex(beatmaps->mutex);
28
29    SDL_WaitThread(beatmaps->loadWorker, NULL);
30    beatmaps->loadWorker = NULL;
31
32    SDL_DestroyMutex(beatmaps->mutex);
33
34    free(beatmaps->basePath);
35    free(beatmaps);
36}
37
38int Osu_LoadBeatmapsWorker(void* userdata) {
39    struct Osu_BeatmapStore* beatmaps = userdata;
40    int filesCount;
41    char** files = SDL_GlobDirectory(beatmaps->basePath, "*" OSU_PATHSEP "*.osu", SDL_GLOB_CASEINSENSITIVE, &filesCount);
42    if (!files) {
43        return 0;
44    }
45
46    size_t filesLen = filesCount; // Why does SDL return this as an int!?
47
48    beatmaps->beatmaps = calloc(filesCount, sizeof(struct Osu_Beatmap*));
49
50    char filepath[512];
51    for (size_t i = 0; i < filesLen; i++) {
52        sprintf(filepath, "%s" OSU_PATHSEP "%s", beatmaps->basePath, files[i]);
53
54        struct Osu_Beatmap* beatmap = Osu_LoadBeatmap(filepath);
55        if (!beatmap) {
56            continue;
57        }
58
59        SDL_LockMutex(beatmaps->mutex);
60        // If beatmaps no longer exists then loading was canceled.
61        if (!beatmaps->beatmaps) {
62            Osu_DestroyBeatmap(beatmap);
63            break;
64        }
65        beatmaps->beatmaps[beatmaps->beatmapsLen] = beatmap;
66        beatmaps->beatmapsLen++;
67        SDL_UnlockMutex(beatmaps->mutex);
68    }
69
70    SDL_LockMutex(beatmaps->mutex);
71
72    if (beatmaps->beatmaps && beatmaps->beatmapsLen < filesLen) {
73        beatmaps->beatmaps = realloc(beatmaps->beatmaps, sizeof(struct Osu_Beatmap*) * beatmaps->beatmapsLen);
74    }
75
76    beatmaps->finishedLoading = true;
77
78    SDL_UnlockMutex(beatmaps->mutex);
79
80    SDL_free(files);
81    return 0;
82}