mapcreator git · master
SDL3 2.5D game and engine using assets, with map editor
C++ 99.3%git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gzsrc/audio/audio.cpp raw
#include "audio.hpp"
#include <SDL3/SDL.h>
#include <stdio.h>
#include <string.h>
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;
}