aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/sound.cpp
diff options
context:
space:
mode:
authorjohndoe1232018-05-26 05:41:53 +1000
committerEugene Sandulenko2018-07-20 06:43:33 +0000
commit617e9439cfa51cdb7221a388762e0661ccd5f5ad (patch)
treea02f43d5f38dee625e20584dbba72235d50b12b9 /engines/illusions/sound.cpp
parentaee54f4bca73b35371e9bc13f718209b38bfa731 (diff)
downloadscummvm-rg350-617e9439cfa51cdb7221a388762e0661ccd5f5ad.tar.gz
scummvm-rg350-617e9439cfa51cdb7221a388762e0661ccd5f5ad.tar.bz2
scummvm-rg350-617e9439cfa51cdb7221a388762e0661ccd5f5ad.zip
ILLUSIONS: DUCKMAN: Implement MIDI music fading
(cherry picked from commit 056b303)
Diffstat (limited to 'engines/illusions/sound.cpp')
-rw-r--r--engines/illusions/sound.cpp31
1 files changed, 30 insertions, 1 deletions
diff --git a/engines/illusions/sound.cpp b/engines/illusions/sound.cpp
index d8b03169ea..6a62ee52c6 100644
--- a/engines/illusions/sound.cpp
+++ b/engines/illusions/sound.cpp
@@ -23,6 +23,7 @@
#include "common/config-manager.h"
#include "illusions/illusions.h"
#include "illusions/sound.h"
+#include "illusions/time.h"
#include "audio/mididrv.h"
#include "audio/midiparser.h"
@@ -384,6 +385,15 @@ void SoundMan::stopMidiMusic() {
_midiPlayer->stop();
}
+void SoundMan::fadeMidiMusic(int16 finalVolume, int16 duration, uint32 notifyThreadId) {
+ _midiMusicFader._active = true;
+ _midiMusicFader._notifyThreadId = notifyThreadId;
+ _midiMusicFader._startVolume = _midiMusicFader._currVolume;
+ _midiMusicFader._finalVolume = finalVolume;
+ _midiMusicFader._startTime = getCurrentTime();
+ _midiMusicFader._duration = duration;
+}
+
void SoundMan::clearMidiMusicQueue() {
_midiMusicQueue.clear();
}
@@ -467,7 +477,26 @@ void SoundMan::updateMidi() {
_midiMusicQueue.remove_at(0);
_midiPlayer->play(musicId);
}
- // TODO Update music volume fading
+ updateMidiMusicFader();
+}
+
+void SoundMan::updateMidiMusicFader() {
+ if (_midiMusicFader._active) {
+ int16 currTime = getCurrentTime();
+ if (currTime - _midiMusicFader._startTime > _midiMusicFader._duration) {
+ _midiMusicFader._active = false;
+ currTime = _midiMusicFader._startTime + _midiMusicFader._duration;
+ if (_midiMusicFader._notifyThreadId) {
+ _vm->notifyThreadId(_midiMusicFader._notifyThreadId);
+ _midiMusicFader._notifyThreadId = 0;
+ }
+ }
+ const int16 elapsedTime = currTime - _midiMusicFader._startTime;
+ const int16 volumeDelta = _midiMusicFader._finalVolume - _midiMusicFader._startVolume;
+ const int masterMusicVolume = _vm->_mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType);
+ _midiMusicFader._currVolume = _midiMusicFader._startVolume + (elapsedTime * volumeDelta / _midiMusicFader._duration);
+ _midiPlayer->setVolume(_midiMusicFader._currVolume * masterMusicVolume / 255);
+ }
}
void SoundMan::setMusicVolume(uint16 volume) {