#include "audio.hpp" #include #include #include Audio::Audio() : mixer(nullptr), sound_count(0) { if (!MIX_Init()) { printf("MIX_Init failed: %s\n", SDL_GetError()); return; } mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, nullptr); if (!mixer) { printf("MIX_CreateMixerDevice failed: %s\n", SDL_GetError()); MIX_Quit(); return; } } void Audio::Quit() { MIX_Quit(); mixer=nullptr; } bool Audio::RegisterSound(const char* id, const char* filename) { if (!mixer || sound_count >= AUDIO_MAX_SOUNDS) { return false; } if (Find(id)) { return false; // duplicate ID } AudioSound& s = sounds[sound_count]; strncpy(s.id, id, AUDIO_ID_LEN - 1); s.id[AUDIO_ID_LEN - 1] = '\0'; s.audio = MIX_LoadAudio(mixer, filename, false); if (!s.audio) { printf("MIX_LoadAudio failed (%s): %s\n", filename, SDL_GetError()); return false; } s.track = MIX_CreateTrack(mixer); if (!s.track) { MIX_DestroyAudio(s.audio); return false; } MIX_SetTrackAudio(s.track, s.audio); sound_count++; return true; } bool Audio::Play(const char* id, SDL_PropertiesID options) { AudioSound* s = Find(id); if (!s) { return false; } return MIX_PlayTrack(s->track, options); } bool Audio::Stop(const char* id, SDL_PropertiesID options) { AudioSound* s = Find(id); if (!s) { return false; } return MIX_StopTrack(s->track, options); } bool Audio::is_Playing(const char* id) { AudioSound* s = Find(id); if (!s) { return false; } return MIX_TrackPlaying(s->track); } AudioSound* Audio::Find(const char* id) { for (int i = 0; i < sound_count; ++i) { if (strcmp(sounds[i].id, id) == 0) { return &sounds[i]; } } return nullptr; }