From 27feddeff843d28e35e37afb41343b3bc58a06b6 Mon Sep 17 00:00:00 2001 From: flowtron Date: Tue, 13 Jul 2010 07:55:38 +0000 Subject: [PATCH] fix music-delay issues - see end of config/sounds.cfg for preload_music option git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5354 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- config/sounds.cfg | 4 ++++ source/src/audiomanager.cpp | 45 ++++++++++++++++++++++++++++++++----- source/src/main.cpp | 2 +- source/src/sound.h | 1 + 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/config/sounds.cfg b/config/sounds.cfg index 63a84b5f..f822c28e 100755 --- a/config/sounds.cfg +++ b/config/sounds.cfg @@ -103,3 +103,7 @@ registersound "voicecom/niceshot" // 87 registermusic "pingpong/03-pp-kamikadze" // M_FLAGGRAB registermusic "pingpong/08-pp-headshot" // M_LASTMINUTE1 registermusic "ac" // M_LASTMINUTE2 + +preload_music = [ loop m 3 [ musicpreload $m ] ] +// uncomment the line below if you want to preload the music (if you experience delay e.g. when picking up a flag) +//preload_music diff --git a/source/src/audiomanager.cpp b/source/src/audiomanager.cpp index b067bc33..424dfc91 100644 --- a/source/src/audiomanager.cpp +++ b/source/src/audiomanager.cpp @@ -120,11 +120,39 @@ void audiomanager::music(char *name, char *millis, char *cmd) } } +void audiomanager::musicpreload(int id) +{ + if(nosound) return; + stopsound(); + if(musicvol && (id>=M_FLAGGRAB && id<=M_LASTMINUTE2)) + { + char *name = musics[id]; + conoutf("preloading music #%d : %s", id, name); + if(gamemusic->open(name)) + { + defformatstring(whendone)("musicvol %d", musicvol); + musicdonecmd = newstring(whendone); + //conoutf("when done: %s", musicdonecmd); + const int preloadfadetime = 3; + gamemusic->fadein(lastmillis, preloadfadetime); + gamemusic->fadeout(lastmillis+2*preloadfadetime, preloadfadetime); + if(!gamemusic->playback(false)) + { + conoutf("could not play music: %s", name); + return; + } + setmusicvol(1); // not 0 ! + } + else conoutf("could not open music: %s", name); + } + else setmusicvol(musicvol); // call "musicpreload -1" to ensure musicdonecmd runs - but it should w/o that +} + void audiomanager::musicsuggest(int id, int millis, bool rndofs) // play bg music if nothing else is playing { if(nosound || !gamemusic) return; if(gamemusic->playing()) return; - + if(!musicvol) return; if(!musics.inrange(id)) { conoutf("\f3music %d not registered", id); @@ -160,7 +188,7 @@ void audiomanager::setlistenervol(int vol) void audiomanager::registermusic(char *name) { - if(nosound) return; + if(nosound||!musicvol) return; if(!name || !name[0]) return; musics.add(newstring(name)); } @@ -168,7 +196,7 @@ void audiomanager::registermusic(char *name) int audiomanager::addsound(char *name, int vol, int maxuses, bool loop, vector &sounds, bool load, int audibleradius) { if(nosound) return -1; - + if(!soundvol) return -1; sbuffer *b = bufferpool.find(name); if(!b) { @@ -350,7 +378,7 @@ void audiomanager::mutesound(int n, int off) bool mute = (off == 0); if(!gamesounds.inrange(n)) { - conoutf("\f3could not %s sound no %d", mute ? "silence" : "unmute", n); + conoutf("\f3could not %s sound #%d", mute ? "silence" : "unmute", n); return; } gamesounds[n].muted = mute; @@ -363,7 +391,7 @@ void audiomanager::unmuteallsounds() int audiomanager::soundmuted(int n) { - return gamesounds.inrange(n) && gamesounds[n].muted ? 1 : 0; + return gamesounds.inrange(n) && !gamesounds[n].muted ? 0 : 1; } void audiomanager::writesoundconfig(stream *f) @@ -453,7 +481,7 @@ VARP(maxsoundsatonce, 0, 10, 100); location *audiomanager::_playsound(int n, const worldobjreference &r, int priority, float offset, bool loop) { if(nosound || !soundvol) return NULL; - + if(soundmuted(n)) return NULL; DEBUGVAR(n); DEBUGVAR(priority); @@ -772,6 +800,11 @@ COMMANDF(registermusic, ARG_1STR, (char *name) audiomgr.registermusic(name); }); +COMMANDF(musicpreload, ARG_1INT, (int id) +{ + audiomgr.musicpreload(id); +}); + COMMANDF(music, ARG_3STR, (char *name, char *millis, char *cmd) { audiomgr.music(name, millis, cmd); diff --git a/source/src/main.cpp b/source/src/main.cpp index 168ba5c9..b0f97f6d 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -954,7 +954,7 @@ int main(int argc, char **argv) enet_uint32 c = f->getlil(); setresdata(s, c); } - delete f; + delete f; } initing = INIT_LOAD; diff --git a/source/src/sound.h b/source/src/sound.h index 2d62829e..58b28d5c 100644 --- a/source/src/sound.h +++ b/source/src/sound.h @@ -394,6 +394,7 @@ public: // music handling void music(char *name, char *millis, char *cmd); + void musicpreload(int id); void musicsuggest(int id, int millis, bool rndofs); void musicfadeout(int id); void setmusicvol(int musicvol);