Skip to content

Commit

Permalink
ILLUSIONS: DUCKMAN: Implement MIDI music fading
Browse files Browse the repository at this point in the history
  • Loading branch information
johndoe123 committed May 25, 2018
1 parent 9abaa9e commit 056b303
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
5 changes: 3 additions & 2 deletions engines/illusions/duckman/scriptopcodes_duckman.cpp
Expand Up @@ -259,7 +259,7 @@ void ScriptOpcodes_Duckman::opUnloadResourcesBySceneId(ScriptThread *scriptThrea

//static uint dsceneId = 0, dthreadId = 0;
//static uint dsceneId = 0x00010008, dthreadId = 0x00020029;//Beginning in Jac
static uint dsceneId = 0x0001000A, dthreadId = 0x00020043;//Home front
// static uint dsceneId = 0x0001000A, dthreadId = 0x00020043;//Home front
//static uint dsceneId = 0x0001000E, dthreadId = 0x0002007C;
//static uint dsceneId = 0x00010012, dthreadId = 0x0002009D;//Paramount
//static uint dsceneId = 0x00010020, dthreadId = 0x00020112;//Xmas
Expand All @@ -277,6 +277,7 @@ static uint dsceneId = 0x0001000A, dthreadId = 0x00020043;//Home front
//static uint dsceneId = 0x10044, dthreadId = 0x000202B8; // Starship Enterprise
//static uint dsceneId = 0x00010039, dthreadId = 0x00020089; // Map
// static uint dsceneId = 0x00010052, dthreadId = 0x00020347; // Credits
static uint dsceneId = 0x0001004B, dthreadId = 0x0002029B;

void ScriptOpcodes_Duckman::opChangeScene(ScriptThread *scriptThread, OpCall &opCall) {
ARG_SKIP(2);
Expand Down Expand Up @@ -633,7 +634,7 @@ void ScriptOpcodes_Duckman::opStopMidiMusic(ScriptThread *scriptThread, OpCall &
void ScriptOpcodes_Duckman::opFadeMidiMusic(ScriptThread *scriptThread, OpCall &opCall) {
ARG_INT16(duration);
ARG_INT16(finalVolume);
// TODO _vm->fadeMidiMusic(2, finalVolume, duration, opCall._threadId);
_vm->_soundMan->fadeMidiMusic(finalVolume, duration, opCall._threadId);
}

void ScriptOpcodes_Duckman::opAddMenuChoice(ScriptThread *scriptThread, OpCall &opCall) {
Expand Down
31 changes: 30 additions & 1 deletion engines/illusions/sound.cpp
Expand Up @@ -22,6 +22,7 @@

#include "illusions/illusions.h"
#include "illusions/sound.h"
#include "illusions/time.h"
#include "audio/mididrv.h"
#include "audio/midiparser.h"

Expand Down Expand Up @@ -383,6 +384,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();
}
Expand Down Expand Up @@ -465,7 +475,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);
}
}

} // End of namespace Illusions
15 changes: 15 additions & 0 deletions engines/illusions/sound.h
Expand Up @@ -112,6 +112,18 @@ class Sound {
bool _looping;
};

struct MidiMusicFader {
bool _active;
uint _flags;
int16 _currVolume;
int16 _startVolume;
int16 _finalVolume;
int16 _startTime;
int16 _duration;
uint32 _notifyThreadId;
MidiMusicFader() : _active(false), _currVolume(255) {}
};

class SoundMan {
public:
SoundMan(IllusionsEngine *vm);
Expand All @@ -123,6 +135,7 @@ class SoundMan {

void playMidiMusic(uint32 musicId);
void stopMidiMusic();
void fadeMidiMusic(int16 finalVolume, int16 duration, uint32 notifyThreadId);
void clearMidiMusicQueue();

bool cueVoice(const char *voiceName);
Expand Down Expand Up @@ -150,8 +163,10 @@ class SoundMan {
VoicePlayer *_voicePlayer;
SoundList _sounds;
Common::Array<uint32> _midiMusicQueue;
MidiMusicFader _midiMusicFader;
Sound *getSound(uint32 soundEffectId);
void updateMidi();
void updateMidiMusicFader();
};

} // End of namespace Illusions
Expand Down

0 comments on commit 056b303

Please sign in to comment.