GRIM: When fading out music, move to a fade out track instead of cloning the track. Fixes the sound skipping a bit when a fade out starts because the clone track doesn't copy the queued buffers.

This commit is contained in:
Joni Vähämäki
2011-06-06 20:32:12 +08:00
committed by Pawel Kolodziejski
parent 698831c7a6
commit 6bb4658ea6
3 changed files with 42 additions and 5 deletions
+1 -1
View File
@@ -216,7 +216,7 @@ void Imuse::callback() {
// Ignore tracks which are about to finish. Also, if it did finish in the meantime,
// mark it as unused.
if (!track->stream) {
if (!g_system->getMixer()->isSoundHandleActive(track->handle))
if (!track->soundDesc || !g_system->getMixer()->isSoundHandleActive(track->handle))
memset(track, 0, sizeof(Track));
continue;
}
+1
View File
@@ -64,6 +64,7 @@ private:
void fadeOutMusic(int fadeDelay);
void fadeOutMusicAndStartNew(int fadeDelay, const char *filename, int hookId, int vol, int pan);
Track *cloneToFadeOutTrack(Track *track, int fadeDelay);
Track *moveToFadeOutTrack(Track *track, int fadeDelay);
void playMusic(const ImuseTable *table, int atribPos, bool sequence);
+40 -4
View File
@@ -323,8 +323,7 @@ void Imuse::fadeOutMusic(int duration) {
for (int l = 0; l < MAX_IMUSE_TRACKS; l++) {
Track *track = _track[l];
if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
cloneToFadeOutTrack(track, duration);
flushTrack(track);
moveToFadeOutTrack(track, duration);
return;
}
}
@@ -337,8 +336,7 @@ void Imuse::fadeOutMusicAndStartNew(int fadeDelay, const char *filename, int hoo
Track *track = _track[l];
if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
startMusicWithOtherPos(filename, 0, vol, pan, track);
cloneToFadeOutTrack(track, fadeDelay);
flushTrack(track);
moveToFadeOutTrack(track, fadeDelay);
break;
}
}
@@ -387,4 +385,42 @@ Track *Imuse::cloneToFadeOutTrack(Track *track, int fadeDelay) {
return fadeTrack;
}
Track *Imuse::moveToFadeOutTrack(Track *track, int fadeDelay) {
assert(track);
Track *fadeTrack;
if (track->toBeRemoved) {
error("cloneToFadeOutTrack: Tried to move a track to be removed, please bug report");
return NULL;
}
assert(track->trackId < MAX_IMUSE_TRACKS);
fadeTrack = _track[track->trackId + MAX_IMUSE_TRACKS];
if (fadeTrack->used) {
flushTrack(fadeTrack);
g_system->getMixer()->stopHandle(fadeTrack->handle);
}
// Clone the settings of the given track
memcpy(fadeTrack, track, sizeof(Track));
fadeTrack->trackId = track->trackId + MAX_IMUSE_TRACKS;
// Reset the track
memset(track, 0, sizeof(Track));
// Mark as used for now so the track won't be reused again this frame
track->used = true;
// Set the volume fading parameters to indicate a fade out
fadeTrack->volFadeDelay = fadeDelay;
fadeTrack->volFadeDest = 0;
fadeTrack->volFadeStep = (fadeTrack->volFadeDest - fadeTrack->vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);
fadeTrack->volFadeUsed = true;
fadeTrack->used = true;
return fadeTrack;
}
} // end of namespace Grim