X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=18de01b3425b9c109224e28773cd38e506820910;hb=c4e1a476135ce36417cdd797481feeaaff4301af;hp=c9de611ecc61779b5d8a35834040acd8001d6608;hpb=ae32fd8a4316c5d7f18fe6966f999ebf5509df94;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index c9de611e..18de01b3 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -12,6 +12,7 @@ ***********************************************************/ #include "system.h" +#include "sound.h" #include "misc.h" @@ -24,14 +25,11 @@ inline void SDLInitVideoDisplay(void) { /* initialize SDL video */ - if (SDL_Init(SDL_INIT_VIDEO) < 0) - Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError()); + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError()); /* set default SDL depth */ video.default_depth = SDL_GetVideoInfo()->vfmt->BitsPerPixel; - - /* set exit function to automatically cleanup SDL stuff after exit() */ - atexit(SDL_Quit); } inline void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, @@ -708,24 +706,40 @@ Bitmap *SDLLoadImage(char *filename) /* audio functions */ /* ========================================================================= */ -inline boolean SDLOpenAudio(void) +inline void SDLOpenAudio(void) { - if (SDL_Init(SDL_INIT_AUDIO) < 0) + if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { - Error(ERR_WARN, "SDL_Init() failed: %s", SDL_GetError()); - return FALSE; + Error(ERR_WARN, "SDL_InitSubSystem() failed: %s", SDL_GetError()); + return; } - if (Mix_OpenAudio(22050, AUDIO_S16, 2, 512) < 0) + if (Mix_OpenAudio(DEFAULT_AUDIO_SAMPLE_RATE, AUDIO_S16, + AUDIO_STEREO_CHANNELS, + DEFAULT_AUDIO_FRAGMENT_SIZE) < 0) { Error(ERR_WARN, "Mix_OpenAudio() failed: %s", SDL_GetError()); - return FALSE; + return; } - Mix_Volume(-1, SDL_MIX_MAXVOLUME / 4); - Mix_VolumeMusic(SDL_MIX_MAXVOLUME / 4); + audio.sound_available = TRUE; + audio.music_available = TRUE; + audio.loops_available = TRUE; + audio.sound_enabled = TRUE; + + /* determine number of available channels */ + audio.channels = Mix_AllocateChannels(MIX_CHANNELS); + + if (!audio.mods_available) /* reserve first channel for music loops */ + { + if (Mix_ReserveChannels(1) == 1) + audio.music_channel = 0; + else + audio.music_available = FALSE; + } - return TRUE; + Mix_Volume(-1, SOUND_MAX_VOLUME); + Mix_VolumeMusic(SOUND_MAX_VOLUME); } inline void SDLCloseAudio(void)