diff --git a/polymer/eduke32/Makefile b/polymer/eduke32/Makefile index 148f3fe44..d71a116d9 100644 --- a/polymer/eduke32/Makefile +++ b/polymer/eduke32/Makefile @@ -165,25 +165,27 @@ ifeq ($(PLATFORM),WINDOWS) EDITOROBJS+= $(OBJ)/buildres.$o JAUDIOLIB=libjfaudiolib_win32.a else - GAMEOBJS+= $(OBJ)/audiolib_musicstub.$o + ifeq ($(RENDERTYPE),SDL) + ifeq (0,$(SDL_FRAMEWORK)) + OURCFLAGS+= $(subst -Dmain=SDL_main,,$(shell $(SDLCONFIG) --cflags)) + LIBS+= -lSDL_mixer + else + OURCFLAGS += -DSDL_FRAMEWORK + endif + + ifeq (1,$(HAVE_GTK2)) + OURCFLAGS+= -DHAVE_GTK2 $(shell pkg-config --cflags gtk+-2.0) + GAMEOBJS+= $(OBJ)/game_banner.$o $(OBJ)/startgtk.game.$o + EDITOROBJS+= $(OBJ)/editor_banner.$o + endif + + GAMEOBJS+= $(OBJ)/game_icon.$o $(OBJ)/sdlmusic.$o + EDITOROBJS+= $(OBJ)/build_icon.$o + else + GAMEOBJS+= $(OBJ)/audiolib_musicstub.$o + endif endif -ifeq ($(RENDERTYPE),SDL) - ifeq (0,$(SDL_FRAMEWORK)) - OURCFLAGS+= $(subst -Dmain=SDL_main,,$(shell $(SDLCONFIG) --cflags)) - else - OURCFLAGS += -DSDL_FRAMEWORK - endif - - ifeq (1,$(HAVE_GTK2)) - OURCFLAGS+= -DHAVE_GTK2 $(shell pkg-config --cflags gtk+-2.0) - GAMEOBJS+= $(OBJ)/game_banner.$o $(OBJ)/startgtk.game.$o - EDITOROBJS+= $(OBJ)/editor_banner.$o - endif - - GAMEOBJS+= $(OBJ)/game_icon.$o - EDITOROBJS+= $(OBJ)/build_icon.$o -endif EDITOROBJS+= $(OBJ)/sounds_mapster32.$o OURCFLAGS+= $(BUILDCFLAGS) @@ -261,7 +263,7 @@ $(JAUDIOLIBDIR)/$(JAUDIOLIB): ifeq ($(PRETTY_OUTPUT),1) printf "\033[K\033[0;35mChanging dir to \033[1;35m$(CURDIR)/$(JAUDIOLIBDIR)\033[0;35m \033[0m\n" endif - $(MAKE) -C $(JAUDIOLIBDIR) PRETTY_OUTPUT=$(PRETTY_OUTPUT) EROOT=$(EROOT) + $(MAKE) -C $(JAUDIOLIBDIR) PRETTY_OUTPUT=$(PRETTY_OUTPUT) EROOT=$(EROOT) RELEASE=$(RELEASE) OPTLEVEL=$(OPTLEVEL) ifeq ($(PRETTY_OUTPUT),1) printf "\033[K\033[0;35mChanging dir to \033[1;35m$(CURDIR)\033[0;35m \033[0m\n" endif diff --git a/polymer/eduke32/eduke32.vcproj b/polymer/eduke32/eduke32.vcproj index 52a4bba5d..a662a7b23 100644 --- a/polymer/eduke32/eduke32.vcproj +++ b/polymer/eduke32/eduke32.vcproj @@ -452,6 +452,10 @@ RelativePath=".\source\savegame.c" > + + diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 9fe514342..893e90191 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -3268,6 +3268,8 @@ static void G_MoveTransports(void) } break; + case 4: + if (sectlotag != 0) goto JBOLT; case 1: if ((sprite[j].picnum == SHARK) || (sprite[j].picnum == COMMANDER) || (sprite[j].picnum == OCTABRAIN) || ((sprite[j].picnum >= GREENSLIME) && (sprite[j].picnum <= GREENSLIME+7))) @@ -3275,7 +3277,6 @@ static void G_MoveTransports(void) if (sprite[j].extra > 0) goto JBOLT; } -// case 4: case 5: case 12: case 13: diff --git a/polymer/eduke32/source/jaudiolib/Makefile b/polymer/eduke32/source/jaudiolib/Makefile index 1e025e339..b61be4a66 100644 --- a/polymer/eduke32/source/jaudiolib/Makefile +++ b/polymer/eduke32/source/jaudiolib/Makefile @@ -3,11 +3,28 @@ OBJ=obj OBJNAME?=libjfaudiolib.a PRETTY_OUTPUT?=1 EROOT?=build +RELEASE?=1 +OPTLEVEL?=2 SRC=src include ../../$(EROOT)/Makefile.shared -CFLAGS=-g -O2 -Wall +ifneq (0,$(RELEASE)) + # Debugging disabled + debug=-fomit-frame-pointer -funswitch-loops -O$(OPTLEVEL) +else + # Debugging enabled + debug=-ggdb -O0 -DDEBUGGINGAIDS +endif + +ifneq (0,$(DEBUGANYWAY)) + debug+=-ggdb +endif + +CFLAGS=$(debug) -W -Wall -Wimplicit -Werror-implicit-function-declaration \ + -funsigned-char -fno-strict-aliasing -DNO_GCC_BUILTINS -D_FORTIFY_SOURCE=2 \ + -fjump-tables -fno-stack-protector + CPPFLAGS=-Iinclude -Isrc -DHAVE_VORBIS OBJECTS=$(OBJ)/drivers.o \ @@ -20,7 +37,7 @@ OBJECTS=$(OBJ)/drivers.o \ $(OBJ)/driver_nosound.o ifeq ($(PLATFORM),WINDOWS) - CPPFLAGS+= -I/z/sdks/directx/dx7/include -Ithird-party/mingw32/include + CPPFLAGS+= -Ithird-party/mingw32/include OBJECTS+= $(OBJ)/driver_directsound.o OBJNAME=libjfaudiolib_win32.a OBJ=obj_win diff --git a/polymer/eduke32/source/jaudiolib/src/driver_sdl.c b/polymer/eduke32/source/jaudiolib/src/driver_sdl.c index 3c8e8e0eb..5ad85eb38 100644 --- a/polymer/eduke32/source/jaudiolib/src/driver_sdl.c +++ b/polymer/eduke32/source/jaudiolib/src/driver_sdl.c @@ -24,8 +24,13 @@ #include +#include #include "driver_sdl.h" +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(P) (P)=(P) +#endif + enum { SDLErr_Warning = -2, SDLErr_Error = -1, @@ -47,11 +52,18 @@ static int32_t MixBufferCurrent = 0; static int32_t MixBufferUsed = 0; static void ( *MixCallBack )( void ) = 0; -static void fillData(void * userdata, Uint8 * ptr, int32_t remaining) +static Mix_Chunk *DummyChunk = NULL; +static uint8_t *DummyBuffer = NULL; +// static int32_t InterruptsDisabled = 0; + +static void fillData(int32_t chan, void *ptr, int32_t remaining, void *udata) { int32_t len; char *sptr; + UNREFERENCED_PARAMETER(chan); + UNREFERENCED_PARAMETER(udata); + while (remaining > 0) { if (MixBufferUsed == MixBufferSize) { MixCallBack(); @@ -123,8 +135,9 @@ const char *SDLDrv_ErrorString( int32_t ErrorNumber ) int32_t SDLDrv_Init(int32_t mixrate, int32_t numchannels, int32_t samplebits, void * initdata) { Uint32 inited; - Uint32 err = 0; - SDL_AudioSpec spec; + int32_t err = 0; + + UNREFERENCED_PARAMETER(initdata); if (Initialised) { SDLDrv_Shutdown(); @@ -146,19 +159,30 @@ int32_t SDLDrv_Init(int32_t mixrate, int32_t numchannels, int32_t samplebits, vo return SDLErr_Error; } - spec.freq = mixrate; - spec.format = (samplebits == 8) ? AUDIO_U8 : AUDIO_S16SYS; - spec.channels = numchannels; - spec.samples = 256; - spec.callback = fillData; - spec.userdata = 0; + // same problem occurs here as in the icculus driver... + // we need a dummy channel so we don't fuck up the music + // thus numchannels + 1 here + + err = Mix_OpenAudio(mixrate, (samplebits == 8) ? AUDIO_U8 : AUDIO_S16SYS, numchannels + 1, 512); - err = SDL_OpenAudio(&spec, NULL); if (err < 0) { ErrorCode = SDLErr_OpenAudio; return SDLErr_Error; } + //Mix_SetPostMix(fillData, NULL); + + // channel 0 and 1 are actual sounds + // dummy channel 2 runs our fillData() callback as an effect + Mix_RegisterEffect(2, fillData, NULL, NULL); + + DummyBuffer = (uint8_t *) malloc(sizeof(intptr_t)); + memset(DummyBuffer, 0, sizeof(intptr_t)); + + DummyChunk = Mix_QuickLoad_RAW(DummyBuffer, sizeof(intptr_t)); + + Mix_PlayChannel(2, DummyChunk, -1); + Initialised = 1; return SDLErr_Ok; @@ -171,11 +195,39 @@ void SDLDrv_Shutdown(void) } if (StartedSDL > 0) { + if (Initialised) + { + Mix_HaltChannel(0); + } + + if (DummyChunk != NULL) + { + Mix_FreeChunk(DummyChunk); + } + + DummyChunk = NULL; + + if (DummyBuffer != NULL) + { + free(DummyBuffer); + } + + DummyBuffer = NULL; + + if (Initialised) + { + Mix_CloseAudio(); + } + + Initialised = 0; + SDL_QuitSubSystem(SDL_INIT_AUDIO); - } else if (StartedSDL == 0) { + } + else if (StartedSDL == 0) { SDL_Quit(); } + StartedSDL = -1; } @@ -201,7 +253,7 @@ int32_t SDLDrv_BeginPlayback(char *BufferStart, int32_t BufferSize, // prime the buffer MixCallBack(); - SDL_PauseAudio(0); + Mix_Resume(-1); Playing = 1; @@ -214,18 +266,28 @@ void SDLDrv_StopPlayback(void) return; } - SDL_PauseAudio(1); + Mix_Pause(-1); Playing = 0; } void SDLDrv_Lock(void) { - SDL_LockAudio(); +/* + if (InterruptsDisabled++) + return; + + SDL_LockAudio();*/ + } void SDLDrv_Unlock(void) { - SDL_UnlockAudio(); +/* + if (--InterruptsDisabled) + return; + + SDL_UnlockAudio();*/ + } diff --git a/polymer/eduke32/source/jaudiolib/src/vorbis.c b/polymer/eduke32/source/jaudiolib/src/vorbis.c index dc32a5fd3..c75bb94d4 100644 --- a/polymer/eduke32/source/jaudiolib/src/vorbis.c +++ b/polymer/eduke32/source/jaudiolib/src/vorbis.c @@ -95,7 +95,7 @@ static int32_t seek_vorbis(void * datasource, ogg_int64_t offset, int32_t whence } vorb->pos += offset; - if (vorb->pos < 0) { + if ((int32_t)vorb->pos < 0) { vorb->pos = 0; } else if (vorb->pos > vorb->length) { vorb->pos = vorb->length; @@ -176,7 +176,7 @@ playbackstatus MV_GetNextVorbisBlock } bytesread += bytes; - } while (bytesread < sizeof(vd->block)); + } while (bytesread < (signed)sizeof(vd->block)); if (bytesread == 0) { voice->Playing = FALSE; diff --git a/polymer/eduke32/source/midi.c b/polymer/eduke32/source/midi.c index 1333f924a..376e74ea0 100644 --- a/polymer/eduke32/source/midi.c +++ b/polymer/eduke32/source/midi.c @@ -48,16 +48,7 @@ static const int32_t _MIDI_CommandLengths[ NUM_MIDI_CHANNELS ] = 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 2, 0 }; -static int32_t(*_MIDI_RerouteFunctions[ NUM_MIDI_CHANNELS ]) -( - int32_t event, - int32_t c1, - int32_t c2 -) = -{ - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -}; +static int32_t (*_MIDI_RerouteFunctions[ NUM_MIDI_CHANNELS ]) ( int32_t event, int32_t c1, int32_t c2 ); static track *_MIDI_TrackPtr = NULL; static int32_t _MIDI_TrackMemSize; diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index 3f6e4688c..9e6f31b4f 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -502,6 +502,8 @@ void G_CacheMapData(void) } else continue; + MUSIC_Update(); + if ((j&7) == 0) { handleevents(); @@ -1641,7 +1643,7 @@ int32_t G_FindLevelForFilename(const char *fn) return ((volume * MAXLEVELS) + level); } } - return MAXLEVELS; + return MAXLEVELS*MAXVOLUMES; } int32_t G_EnterLevel(int32_t g) @@ -1679,7 +1681,7 @@ int32_t G_EnterLevel(int32_t g) volume = level = G_FindLevelForFilename(boardfilename); - if (level != MAXLEVELS) + if (level != MAXLEVELS*MAXVOLUMES) { level &= MAXLEVELS-1; volume = (volume - level) / MAXLEVELS; diff --git a/polymer/eduke32/source/sdlmusic.c b/polymer/eduke32/source/sdlmusic.c new file mode 100644 index 000000000..0786099a8 --- /dev/null +++ b/polymer/eduke32/source/sdlmusic.c @@ -0,0 +1,342 @@ +/* +Copyright (C) 2003-2004 Ryan C. Gordon. and James Bentler + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Originally written by Ryan C. Gordon. (icculus@clutteredmind.org) +Adapted to work with JonoF's port by James Bentler (bentler@cs.umn.edu) + +*/ +/* + * A reimplementation of Jim Dose's FX_MAN routines, using SDL_mixer 1.2. + * Whee. FX_MAN is also known as the "Apogee Sound System", or "ASS" for + * short. How strangely appropriate that seems. + */ + +#include +#include + +#include "duke3d.h" +#include "cache1d.h" + +#define _NEED_SDLMIXER 1 +#include "sdl_inc.h" +#include "music.h" + +int32_t MUSIC_ErrorCode = MUSIC_Ok; + +static char warningMessage[80]; +static char errorMessage[80]; +static int32_t external_midi = 0; + +static int32_t music_initialized = 0; +static int32_t music_context = 0; +static int32_t music_loopflag = MUSIC_PlayOnce; +static Mix_Music *music_musicchunk = NULL; + +static void setErrorMessage(const char *msg) +{ + Bstrncpy(errorMessage, msg, sizeof(errorMessage)); + // strncpy() doesn't add the null char if there isn't room... + errorMessage[sizeof(errorMessage) - 1] = '\0'; +} // setErrorMessage + +// The music functions... + +char *MUSIC_ErrorString(int32_t ErrorNumber) +{ + switch (ErrorNumber) + { + case MUSIC_Warning: + return(warningMessage); + + case MUSIC_Error: + return(errorMessage); + + case MUSIC_Ok: + return("OK; no error."); + + case MUSIC_ASSVersion: + return("Incorrect sound library version."); + + case MUSIC_SoundCardError: + return("General sound card error."); + + case MUSIC_InvalidCard: + return("Invalid sound card."); + + case MUSIC_MidiError: + return("MIDI error."); + + case MUSIC_MPU401Error: + return("MPU401 error."); + + case MUSIC_TaskManError: + return("Task Manager error."); + + //case MUSIC_FMNotDetected: + // return("FM not detected error."); + + case MUSIC_DPMI_Error: + return("DPMI error."); + + default: + return("Unknown error."); + } // switch + + return(NULL); +} // MUSIC_ErrorString + +int32_t MUSIC_Init(int32_t SoundCard, int32_t Address) +{ + // Use an external MIDI player if the user has specified to do so + char *command = getenv("EDUKE32_MUSIC_CMD"); + const SDL_version *linked = Mix_Linked_Version(); + + UNREFERENCED_PARAMETER(Address); + if (SDL_VERSIONNUM(linked->major,linked->minor,linked->patch) < MIX_REQUIREDVERSION) + { + // reject running with SDL_Mixer versions older than what is stated in sdl_inc.h + initprintf("You need at least v%d.%d.%d of SDL_mixer for music\n",SDL_MIXER_MIN_X,SDL_MIXER_MIN_Y,SDL_MIXER_MIN_Z); + return(MUSIC_Error); + } + + external_midi = (command != NULL && command[0] != 0); + + if (external_midi) + Mix_SetMusicCMD(command); + else + { + char *s[] = { "/etc/timidity.cfg", "/etc/timidity/timidity.cfg", "/etc/timidity/freepats.cfg" }; + FILE *fp; + uint32_t i; + + for (i = 0; i < sizeof(s)/sizeof(s[0]); i++) + { + fp = fopen(s[i], "r"); + if (fp == NULL) + { + if (i == sizeof(s)/sizeof(s[0])) + { + initprintf("Error opening %s, %s or %s\n",s[0],s[1],s[2]); + return(MUSIC_Error); + } + continue; + } + else break; + } + Bfclose(fp); + } + + if (music_initialized) + { + setErrorMessage("Music system is already initialized."); + return(MUSIC_Error); + } // if + + SoundCard = 1; + + music_initialized = 1; + return(MUSIC_Ok); +} // MUSIC_Init + + +int32_t MUSIC_Shutdown(void) +{ + // TODO - make sure this is being called from the menu -- SA + if (external_midi) + Mix_SetMusicCMD(NULL); + + MUSIC_StopSong(); + music_context = 0; + music_initialized = 0; + music_loopflag = MUSIC_PlayOnce; + + return(MUSIC_Ok); +} // MUSIC_Shutdown + + +void MUSIC_SetMaxFMMidiChannel(int32_t channel) +{ + UNREFERENCED_PARAMETER(channel); +} // MUSIC_SetMaxFMMidiChannel + + +void MUSIC_SetVolume(int32_t volume) +{ + volume = max(0, volume); + volume = min(volume, 255); + + Mix_VolumeMusic(volume >> 1); // convert 0-255 to 0-128. +} // MUSIC_SetVolume + + +void MUSIC_SetMidiChannelVolume(int32_t channel, int32_t volume) +{ + UNREFERENCED_PARAMETER(channel); + UNREFERENCED_PARAMETER(volume); +} // MUSIC_SetMidiChannelVolume + + +void MUSIC_ResetMidiChannelVolumes(void) +{ +} // MUSIC_ResetMidiChannelVolumes + + +int32_t MUSIC_GetVolume(void) +{ + return(Mix_VolumeMusic(-1) << 1); // convert 0-128 to 0-255. +} // MUSIC_GetVolume + + +void MUSIC_SetLoopFlag(int32_t loopflag) +{ + music_loopflag = loopflag; +} // MUSIC_SetLoopFlag + + +int32_t MUSIC_SongPlaying(void) +{ + return((Mix_PlayingMusic()) ? TRUE : FALSE); +} // MUSIC_SongPlaying + + +void MUSIC_Continue(void) +{ + if (Mix_PausedMusic()) + Mix_ResumeMusic(); +} // MUSIC_Continue + + +void MUSIC_Pause(void) +{ + Mix_PauseMusic(); +} // MUSIC_Pause + + +int32_t MUSIC_StopSong(void) +{ + //if (!fx_initialized) + if (!Mix_QuerySpec(NULL, NULL, NULL)) + { + setErrorMessage("Need FX system initialized, too. Sorry."); + return(MUSIC_Error); + } // if + + if ((Mix_PlayingMusic()) || (Mix_PausedMusic())) + Mix_HaltMusic(); + + if (music_musicchunk) + Mix_FreeMusic(music_musicchunk); + + music_musicchunk = NULL; + + return(MUSIC_Ok); +} // MUSIC_StopSong + +// Duke3D-specific. --ryan. +// void MUSIC_PlayMusic(char *_filename) +int32_t MUSIC_PlaySong(char *song, int32_t loopflag) +{ + MUSIC_StopSong(); + music_musicchunk = Mix_LoadMUS_RW(SDL_RWFromMem((char *) song, g_musicSize)); + + if (music_musicchunk != NULL) + { + Mix_PlayMusic(music_musicchunk, (loopflag == MUSIC_LoopSong)?-1:0); + } + return MUSIC_Ok; +} + + +void MUSIC_SetContext(int32_t context) +{ + music_context = context; +} // MUSIC_SetContext + + +int32_t MUSIC_GetContext(void) +{ + return(music_context); +} // MUSIC_GetContext + + +void MUSIC_SetSongTick(uint32_t PositionInTicks) +{ + UNREFERENCED_PARAMETER(PositionInTicks); +} // MUSIC_SetSongTick + + +void MUSIC_SetSongTime(uint32_t milliseconds) +{ + UNREFERENCED_PARAMETER(milliseconds); +}// MUSIC_SetSongTime + + +void MUSIC_SetSongPosition(int32_t measure, int32_t beat, int32_t tick) +{ + UNREFERENCED_PARAMETER(measure); + UNREFERENCED_PARAMETER(beat); + UNREFERENCED_PARAMETER(tick); +} // MUSIC_SetSongPosition + + +void MUSIC_GetSongPosition(songposition *pos) +{ + UNREFERENCED_PARAMETER(pos); +} // MUSIC_GetSongPosition + + +void MUSIC_GetSongLength(songposition *pos) +{ + UNREFERENCED_PARAMETER(pos); +} // MUSIC_GetSongLength + + +int32_t MUSIC_FadeVolume(int32_t tovolume, int32_t milliseconds) +{ + UNREFERENCED_PARAMETER(tovolume); + Mix_FadeOutMusic(milliseconds); + return(MUSIC_Ok); +} // MUSIC_FadeVolume + + +int32_t MUSIC_FadeActive(void) +{ + return((Mix_FadingMusic() == MIX_FADING_OUT) ? TRUE : FALSE); +} // MUSIC_FadeActive + + +void MUSIC_StopFade(void) +{ +} // MUSIC_StopFade + + +void MUSIC_RerouteMidiChannel(int32_t channel, int32_t (*function)(int32_t event, int32_t c1, int32_t c2)) +{ + UNREFERENCED_PARAMETER(channel); + UNREFERENCED_PARAMETER(function); +} // MUSIC_RerouteMidiChannel + + +void MUSIC_RegisterTimbreBank(char *timbres) +{ + UNREFERENCED_PARAMETER(timbres); +} // MUSIC_RegisterTimbreBank + + +void MUSIC_Update(void) +{} diff --git a/polymer/eduke32/source/sounds.c b/polymer/eduke32/source/sounds.c index a7be0e0d6..d0eb6c709 100644 --- a/polymer/eduke32/source/sounds.c +++ b/polymer/eduke32/source/sounds.c @@ -324,7 +324,7 @@ int32_t S_PlayMusic(const char *fn, const int32_t sel) // let's see if there's an ogg with the same base name // lying around strcpy(extension, ".ogg"); - fp = kopen4load(testfn, 0); + fp = kopen4loadfrommod(testfn, 0); if (fp >= 0) { free(testfn); @@ -334,7 +334,7 @@ int32_t S_PlayMusic(const char *fn, const int32_t sel) free(testfn); // just use what we've been given - fp = kopen4load((char *)fn, 0); + fp = kopen4loadfrommod((char *)fn, 0); } while (0); @@ -342,7 +342,7 @@ int32_t S_PlayMusic(const char *fn, const int32_t sel) S_StopMusic(); - MusicLen = kfilelength(fp); + g_musicSize = MusicLen = kfilelength(fp); MusicPtr = (char *) Bmalloc(MusicLen); kread(fp, MusicPtr, MusicLen); kclose(fp); @@ -376,7 +376,7 @@ void S_StopMusic(void) { Bfree(MusicPtr); MusicPtr = 0; - MusicLen = 0; + g_musicSize = MusicLen = 0; } } @@ -635,7 +635,7 @@ int32_t A_PlaySound(uint32_t num, int32_t i) return S_PlaySoundXYZ(num, i, (vec3_t *)&sprite[i]); } -inline void S_StopSound(int32_t num) +void S_StopSound(int32_t num) { if (num >= 0 && num < MAXSOUNDS && g_sounds[num].num > 0) {