From d62c6117fee11e4865393a36c1083ea65a13277d Mon Sep 17 00:00:00 2001 From: terminx Date: Mon, 5 Jul 2010 04:37:28 +0000 Subject: [PATCH] Sound fixes... again. Also fixes SPINNINGNUKEICON visible in the upper left corner in widescreen. git-svn-id: https://svn.eduke32.com/eduke32@1667 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/menus.c | 17 ++++---- polymer/eduke32/source/sounds.c | 69 ++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index cf8b91f1c..c882cc3af 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -144,16 +144,19 @@ static int32_t probe_(int32_t type,int32_t x,int32_t y,int32_t i,int32_t n) if (probey >= n) probey = 0; - if (centre) + if (x || y) { - // rotatesprite(((320>>1)+(centre)+54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); - // rotatesprite(((320>>1)-(centre)-54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1); + if (centre) + { + // rotatesprite(((320>>1)+(centre)+54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); + // rotatesprite(((320>>1)-(centre)-54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1); - rotatesprite(((320>>1)+(centre>>1)+70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); - rotatesprite(((320>>1)-(centre>>1)-70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1); + rotatesprite(((320>>1)+(centre>>1)+70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); + rotatesprite(((320>>1)-(centre>>1)-70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1); + } + else + rotatesprite((x<<16)-((tilesizx[BIGFNTCURSOR]-4)<<(16-type)),(y+(probey*i)-(4>>type))<<16,65536L>>type,0,SPINNINGNUKEICON+(((totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); } - else - rotatesprite((x<<16)-((tilesizx[BIGFNTCURSOR]-4)<<(16-type)),(y+(probey*i)-(4>>type))<<16,65536L>>type,0,SPINNINGNUKEICON+(((totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1); if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Enter) || (LMB && !onbar)) { diff --git a/polymer/eduke32/source/sounds.c b/polymer/eduke32/source/sounds.c index 0053ac567..fb98706fe 100644 --- a/polymer/eduke32/source/sounds.c +++ b/polymer/eduke32/source/sounds.c @@ -322,11 +322,12 @@ void S_Cleanup(void) { uint32_t num = ldq[--ldnum]; - if (num >= 65536) - { - g_soundlocks[num-65536]--; - continue; - } + // num + 65536 is a sound played globally for which there was no open slot to keep track of the voice + if (num >= 65536) + { + g_soundlocks[num-65536]--; + continue; + } // negative index is RTS playback if ((int32_t)num < 0) @@ -413,7 +414,10 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) if (g_sounds[num].m&128) { - while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) + if ((voice = S_PlaySound(num)) <= FX_Ok) + return -1; + + while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice != voice) j++; if (j >= MAXSOUNDINSTANCES) @@ -422,18 +426,8 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) return -1; } - if ((voice = S_PlaySound(num)) <= FX_Ok) - return -1; - - if (FX_SetVoiceCallback(voice, (num * MAXSOUNDINSTANCES) + j)) - { - OSD_Printf(OSD_ERROR "S_PlaySound3D(): error setting callback!\n"); - return -1; - } - g_sounds[num].SoundOwner[j].i = i; - g_sounds[num].num++; - g_sounds[num].SoundOwner[j].voice = voice; + return voice; } @@ -564,6 +558,7 @@ int32_t S_PlaySound(int32_t num) { int32_t pitch, cx; int32_t voice, j; + int32_t doretry = 0; if (ud.config.FXDevice < 0) return -1; if (ud.config.SoundToggle==0) return -1; @@ -597,16 +592,13 @@ int32_t S_PlaySound(int32_t num) while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) j++; - if (j >= MAXSOUNDINSTANCES) - { - g_soundlocks[num]--; - return -1; - } - + if (j >= MAXSOUNDINSTANCES) // no slots available, so let's see if one opens up after multivoc kills a voice + doretry = 1; + voice = (g_sounds[num].m&1) ? FX_PlayLoopedAuto(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, - pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz, 65536 + num) : - FX_PlayAuto3D(g_sounds[ num ].ptr, g_sounds[num].soundsiz, pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, 65536 + num); + pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz, (num * MAXSOUNDINSTANCES) + j) : + FX_PlayAuto3D(g_sounds[ num ].ptr, g_sounds[num].soundsiz, pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, (num * MAXSOUNDINSTANCES) + j); if (voice <= FX_Ok) { @@ -614,6 +606,24 @@ int32_t S_PlaySound(int32_t num) return -1; } + if (doretry) + { + S_Cleanup(); + + j = 0; + + while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) + j++; + + if (j >= MAXSOUNDINSTANCES) // still no slots available + { + FX_SetVoiceCallback(voice, num + 65536); + return voice; + } + + FX_SetVoiceCallback(voice, (num * MAXSOUNDINSTANCES) + j); + } + g_sounds[num].num++; g_sounds[num].SoundOwner[j].i = -1; g_sounds[num].SoundOwner[j].voice = voice; @@ -646,11 +656,11 @@ void S_StopEnvSound(int32_t num, int32_t i) for (j=MAXSOUNDINSTANCES-1; j>=0; j--) { - if (i == -1 || g_sounds[num].SoundOwner[j].i == i) + if ((i == -1 && g_sounds[num].SoundOwner[j].voice > FX_Ok) || (i != -1 && g_sounds[num].SoundOwner[j].i == i)) { - if (g_sounds[num].SoundOwner[j].voice <= FX_Ok || g_sounds[num].SoundOwner[j].voice > ud.config.NumVoices) + if (i >= 0 && g_sounds[num].SoundOwner[j].voice <= FX_Ok) initprintf(OSD_ERROR "S_StopEnvSound(): bad voice %d for sound ID %d index %d!\n", g_sounds[num].SoundOwner[j].voice, num, j); - else if (FX_SoundActive(g_sounds[num].SoundOwner[j].voice)) + else if (g_sounds[num].SoundOwner[j].voice > FX_Ok && FX_SoundActive(g_sounds[num].SoundOwner[j].voice)) FX_StopSound(g_sounds[num].SoundOwner[j].voice); // FX_SoundActive returning false could mean one of two things: we asked to stop the sound @@ -675,6 +685,9 @@ void S_Update(void) S_Cleanup(); + if ((g_player[myconnectindex].ps->gm & (MODE_GAME|MODE_DEMO)) == 0) + return; + g_numEnvSoundsPlaying = 0; if (ud.camerasprite == -1)