Nimbin[12]?SDL & Graphics / mapcreator / src/audio/audio.cpp

mapcreator git · master

SDL3 2.5D game and engine using assets, with map editor

sdl3 c++ game engine map-editor cmake · first commit 2025-10-31 · last commit 2026-09-07 (1 month ago) · synced 3 days ago · upstream: git.ide3.de/hsnr/sdl-spieleentwicklung/map_creator

C++ 99.3%
git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gz
src/audio/audio.cpp 1.9 KB · 93 lines 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;
}