mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
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:
committed by
Pawel Kolodziejski
parent
698831c7a6
commit
6bb4658ea6
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user