MOHAWK: Myst: Rewrite the sound code

It now more closely matches the original. Effect sounds are now stopped
when resuming background sounds.

Fixes #9574, Fixes #9920.
This commit is contained in:
Bastien Bouclet 2017-07-21 12:56:20 +02:00
parent a2fc282e1c
commit 75040819c6
15 changed files with 345 additions and 375 deletions

View file

@ -81,7 +81,7 @@ bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) {
return true; return true;
} }
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->changeToCard((uint16)atoi(argv[1]), kTransitionCopy); _vm->changeToCard((uint16)atoi(argv[1]), kTransitionCopy);
return false; return false;
@ -169,7 +169,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) {
// We need to stop any playing sound when we change the stack // We need to stop any playing sound when we change the stack
// as the next card could continue playing it if it. // as the next card could continue playing it if it.
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
uint16 card = 0; uint16 card = 0;
if (argc == 3) if (argc == 3)
@ -234,7 +234,7 @@ bool MystConsole::Cmd_PlaySound(int argc, const char **argv) {
return true; return true;
} }
_vm->_sound->replaceSoundMyst((uint16)atoi(argv[1])); _vm->_sound->playEffect((uint16) atoi(argv[1]));
return false; return false;
} }
@ -242,7 +242,7 @@ bool MystConsole::Cmd_PlaySound(int argc, const char **argv) {
bool MystConsole::Cmd_StopSound(int argc, const char **argv) { bool MystConsole::Cmd_StopSound(int argc, const char **argv) {
debugPrintf("Stopping Sound\n"); debugPrintf("Stopping Sound\n");
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
return true; return true;
} }

View file

@ -24,10 +24,10 @@ namespace Mohawk {
#define GAMEOPTION_PLAY_MYST_FLYBY GUIO_GAMEOPTIONS1 #define GAMEOPTION_PLAY_MYST_FLYBY GUIO_GAMEOPTIONS1
#define GUI_OPTIONS_MYST GUIO3(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOMIDI) #define GUI_OPTIONS_MYST GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI)
#define GUI_OPTIONS_MYST_ME GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOMIDI, GAMEOPTION_PLAY_MYST_FLYBY) #define GUI_OPTIONS_MYST_ME GUIO5(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_PLAY_MYST_FLYBY)
#define GUI_OPTIONS_MYST_DEMO GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD) #define GUI_OPTIONS_MYST_DEMO GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)
#define GUI_OPTIONS_MYST_MAKING_OF GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD) #define GUI_OPTIONS_MYST_MAKING_OF GUIO5(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)
#define GUI_OPTIONS_RIVEN GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI) #define GUI_OPTIONS_RIVEN GUIO4(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI)
#define GUI_OPTIONS_RIVEN_DEMO GUIO5(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD) #define GUI_OPTIONS_RIVEN_DEMO GUIO5(GUIO_NOASPECT, GUIO_NOSUBTITLES, GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)

View file

@ -275,11 +275,11 @@ void MohawkEngine_Myst::waitUntilMovieEnds(const VideoEntryPtr &video) {
_interactive = true; _interactive = true;
} }
void MohawkEngine_Myst::playSoundBlocking(uint16 id, byte volume) { void MohawkEngine_Myst::playSoundBlocking(uint16 id) {
_interactive = false; _interactive = false;
_sound->playSound(id, volume); _sound->playEffect(id);
while (_sound->isPlaying() && !shouldQuit()) { while (_sound->isEffectPlaying() && !shouldQuit()) {
doFrame(); doFrame();
} }
_interactive = true; _interactive = true;
@ -472,8 +472,8 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
else else
_gfx->clearScreenPalette(); _gfx->clearScreenPalette();
_sound->stopSound(); _sound->stopEffect();
_sound->stopBackgroundMyst(); _sound->stopBackground();
_video->stopVideos(); _video->stopVideos();
if (linkSrcSound) if (linkSrcSound)
playSoundBlocking(linkSrcSound); playSoundBlocking(linkSrcSound);
@ -1220,7 +1220,7 @@ void MohawkEngine_Myst::dropPage() {
bool redPage = page - 7 < 6; bool redPage = page - 7 < 6;
// Play drop page sound // Play drop page sound
_sound->replaceSoundMyst(800); _sound->playEffect(800);
// Drop page // Drop page
_gameState->_globals.heldPage = 0; _gameState->_globals.heldPage = 0;
@ -1317,13 +1317,13 @@ void MohawkEngine_Myst::applySoundBlock(const MystSoundBlock &block) {
debug(2, "Continuing with current sound"); debug(2, "Continuing with current sound");
else if (soundAction == kMystSoundActionChangeVolume) { else if (soundAction == kMystSoundActionChangeVolume) {
debug(2, "Continuing with current sound, changing volume"); debug(2, "Continuing with current sound, changing volume");
_sound->changeBackgroundVolumeMyst(soundActionVolume); _sound->changeBackgroundVolume(soundActionVolume);
} else if (soundAction == kMystSoundActionStop) { } else if (soundAction == kMystSoundActionStop) {
debug(2, "Stopping sound"); debug(2, "Stopping sound");
_sound->stopBackgroundMyst(); _sound->stopBackground();
} else if (soundAction > 0) { } else if (soundAction > 0) {
debug(2, "Playing new sound %d", soundAction); debug(2, "Playing new sound %d", soundAction);
_sound->replaceBackgroundMyst(soundAction, soundActionVolume); _sound->playBackground(soundAction, soundActionVolume);
} else { } else {
error("Unknown sound action %d", soundAction); error("Unknown sound action %d", soundAction);
} }

View file

@ -232,7 +232,7 @@ public:
void playMovieBlockingCentered(const Common::String &filename); void playMovieBlockingCentered(const Common::String &filename);
void waitUntilMovieEnds(const VideoEntryPtr &video); void waitUntilMovieEnds(const VideoEntryPtr &video);
void playSoundBlocking(uint16 id, byte volume = Audio::Mixer::kMaxChannelVolume); void playSoundBlocking(uint16 id);
GUI::Debugger *getDebugger() override { return _console; } GUI::Debugger *getDebugger() override { return _console; }

View file

@ -640,7 +640,7 @@ void MystAreaSlider::updatePosition(const Common::Point &mouse) {
} }
if (positionChanged && _dragSound) if (positionChanged && _dragSound)
_vm->_sound->replaceSoundMyst(_dragSound); _vm->_sound->playEffect(_dragSound);
} }
MystAreaDrag::MystAreaDrag(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystArea *parent) : MystAreaDrag::MystAreaDrag(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystArea *parent) :

View file

@ -630,12 +630,12 @@ void MystScriptParser::o_playSound(uint16 op, uint16 var, uint16 argc, uint16 *a
debugC(kDebugScript, "Opcode %d: playSound", op); debugC(kDebugScript, "Opcode %d: playSound", op);
debugC(kDebugScript, "\tsoundId: %d", soundId); debugC(kDebugScript, "\tsoundId: %d", soundId);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
void MystScriptParser::o_stopSoundBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser::o_stopSoundBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: stopSoundBackground", op); debugC(kDebugScript, "Opcode %d: stopSoundBackground", op);
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
} }
void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -644,7 +644,7 @@ void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, u
debugC(kDebugScript, "Opcode %d: playSoundBlocking", op); debugC(kDebugScript, "Opcode %d: playSoundBlocking", op);
debugC(kDebugScript, "\tsoundId: %d", soundId); debugC(kDebugScript, "\tsoundId: %d", soundId);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->playSoundBlocking(soundId); _vm->playSoundBlocking(soundId);
} }
@ -729,13 +729,13 @@ void MystScriptParser::o_soundPlaySwitch(uint16 op, uint16 var, uint16 argc, uin
debugC(kDebugScript, "\tsoundId: %d", soundId); debugC(kDebugScript, "\tsoundId: %d", soundId);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
} }
void MystScriptParser::o_soundResumeBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser::o_soundResumeBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: soundResumeBackground", op); debugC(kDebugScript, "Opcode %d: soundResumeBackground", op);
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void MystScriptParser::o_copyImageToScreen(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser::o_copyImageToScreen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -838,7 +838,7 @@ void MystScriptParser::o_changeStack(uint16 op, uint16 var, uint16 argc, uint16
debugC(kDebugScript, "\tSource Stack Link Sound: %d", soundIdLinkSrc); debugC(kDebugScript, "\tSource Stack Link Sound: %d", soundIdLinkSrc);
debugC(kDebugScript, "\tDestination Stack Link Sound: %d", soundIdLinkDst); debugC(kDebugScript, "\tDestination Stack Link Sound: %d", soundIdLinkDst);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
if (_vm->getFeatures() & GF_DEMO) { if (_vm->getFeatures() & GF_DEMO) {
// No need to have a table for just this data... // No need to have a table for just this data...
@ -865,7 +865,7 @@ void MystScriptParser::o_changeCardPlaySoundDirectional(uint16 op, uint16 var, u
debugC(kDebugScript, "\tanimated update data size: %d", dataSize); debugC(kDebugScript, "\tanimated update data size: %d", dataSize);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->changeToCard(cardId, kNoTransition); _vm->changeToCard(cardId, kNoTransition);
@ -884,7 +884,7 @@ void MystScriptParser::o_directionalUpdatePlaySound(uint16 op, uint16 var, uint1
debugC(kDebugScript, "\tanimated update data size: %d", dataSize); debugC(kDebugScript, "\tanimated update data size: %d", dataSize);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
animatedUpdate(dataSize, &argv[3], delayBetweenSteps); animatedUpdate(dataSize, &argv[3], delayBetweenSteps);
} }
@ -907,7 +907,7 @@ void MystScriptParser::o_soundWaitStop(uint16 op, uint16 var, uint16 argc, uint1
// Used when Button is pushed... // Used when Button is pushed...
debugC(kDebugScript, "Opcode %d: Wait for foreground sound to finish", op); debugC(kDebugScript, "Opcode %d: Wait for foreground sound to finish", op);
while (_vm->_sound->isPlaying()) while (_vm->_sound->isEffectPlaying())
_vm->doFrame(); _vm->doFrame();
} }

View file

@ -24,6 +24,7 @@
#include "mohawk/myst.h" #include "mohawk/myst.h"
#include "mohawk/resource.h" #include "mohawk/resource.h"
#include "mohawk/sound.h"
#include "common/debug.h" #include "common/debug.h"
@ -33,13 +34,15 @@
namespace Mohawk { namespace Mohawk {
MystSound::MystSound(MohawkEngine_Myst *vm) : MystSound::MystSound(MohawkEngine_Myst *vm) :
_vm(vm) { _vm(vm),
_mystBackgroundSound.type = kFreeHandle; _effectId(0),
_speechSamplesPerSecond(0),
_backgroundId(0) {
} }
MystSound::~MystSound() { MystSound::~MystSound() {
stopSound(); stopEffect();
stopBackgroundMyst(); stopBackground();
} }
Audio::RewindableAudioStream *MystSound::makeAudioStream(uint16 id, CueList *cueList) { Audio::RewindableAudioStream *MystSound::makeAudioStream(uint16 id, CueList *cueList) {
@ -49,111 +52,56 @@ Audio::RewindableAudioStream *MystSound::makeAudioStream(uint16 id, CueList *cue
return makeMohawkWaveStream(_vm->getResource(ID_MSND, id), cueList); return makeMohawkWaveStream(_vm->getResource(ID_MSND, id), cueList);
} }
Audio::SoundHandle *MystSound::playSound(uint16 id, byte volume, bool loop, CueList *cueList) { void MystSound::playEffect(uint16 id, bool loop) {
debug (0, "Playing sound %d", id);
Audio::RewindableAudioStream *rewindStream = makeAudioStream(id, cueList);
if (rewindStream) {
SndHandle *handle = getHandle();
handle->type = kUsedHandle;
handle->id = id;
handle->samplesPerSecond = rewindStream->getRate();
// Set the stream to loop here if it's requested
Audio::AudioStream *audStream = rewindStream;
if (loop)
audStream = Audio::makeLoopingAudioStream(rewindStream, 0);
_vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &handle->handle, audStream, -1, volume);
return &handle->handle;
}
return nullptr;
}
Audio::SoundHandle *MystSound::replaceSoundMyst(uint16 id, byte volume, bool loop) {
debug (0, "Replacing sound %d", id); debug (0, "Replacing sound %d", id);
// The original engine also forces looping for those sounds // The original engine also forces looping for those sounds
switch (id) { switch (id) {
case 2205: case 2205:
case 2207: case 2207:
case 5378: case 5378:
case 7220: case 7220:
case 9119: // Elevator engine sound in mechanical age is looping. case 9119: // Elevator engine sound in mechanical age is looping.
case 9120: case 9120:
case 9327: case 9327:
loop = true; loop = true;
break; break;
default:
break;
} }
stopSound(); stopEffect();
return playSound(id, volume, loop);
}
SndHandle *MystSound::getHandle() { Audio::RewindableAudioStream *rewindStream = makeAudioStream(id);
for (uint32 i = 0; i < _handles.size(); i++) { if (!rewindStream) {
if (_handles[i].type == kFreeHandle) warning("Unable to open sound '%d'", id);
return &_handles[i]; return;
if (!_vm->_mixer->isSoundHandleActive(_handles[i].handle)) {
_handles[i].type = kFreeHandle;
_handles[i].id = 0;
return &_handles[i];
}
} }
// Let's add a new sound handle! _effectId = id;
SndHandle handle;
handle.handle = Audio::SoundHandle();
handle.type = kFreeHandle;
handle.id = 0;
_handles.push_back(handle);
return &_handles[_handles.size() - 1]; // Set the stream to loop here if it's requested
Audio::AudioStream *audStream = rewindStream;
if (loop)
audStream = Audio::makeLoopingAudioStream(rewindStream, 0);
_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_effectHandle, audStream);
} }
void MystSound::stopSound() { void MystSound::stopEffect() {
for (uint32 i = 0; i < _handles.size(); i++) _vm->_mixer->stopHandle(_effectHandle);
if (_handles[i].type == kUsedHandle) { _effectId = 0;
_vm->_mixer->stopHandle(_handles[i].handle); _effectHandle = Audio::SoundHandle();
_handles[i].type = kFreeHandle;
_handles[i].id = 0;
}
} }
void MystSound::stopSound(uint16 id) { bool MystSound::isEffectPlaying() {
for (uint32 i = 0; i < _handles.size(); i++) return _vm->_mixer->isSoundHandleActive(_effectHandle);
if (_handles[i].type == kUsedHandle && _handles[i].id == id) {
_vm->_mixer->stopHandle(_handles[i].handle);
_handles[i].type = kFreeHandle;
_handles[i].id = 0;
}
} }
bool MystSound::isPlaying(uint16 id) { uint MystSound::getSpeechNumSamplesPlayed() {
for (uint32 i = 0; i < _handles.size(); i++) if (isSpeechPlaying()) {
if (_handles[i].type == kUsedHandle && _handles[i].id == id) return (_vm->_mixer->getSoundElapsedTime(_speechHandle) * _speechSamplesPerSecond) / 1000;
return _vm->_mixer->isSoundHandleActive(_handles[i].handle); }
return false;
}
bool MystSound::isPlaying() {
for (uint32 i = 0; i < _handles.size(); i++)
if (_handles[i].type == kUsedHandle)
if (_vm->_mixer->isSoundHandleActive(_handles[i].handle))
return true;
return false;
}
uint MystSound::getNumSamplesPlayed(uint16 id) {
for (uint32 i = 0; i < _handles.size(); i++)
if (_handles[i].type == kUsedHandle && _handles[i].id == id) {
return (_vm->_mixer->getSoundElapsedTime(_handles[i].handle) * _handles[i].samplesPerSecond) / 1000;
}
return 0; return 0;
} }
@ -173,10 +121,10 @@ uint16 MystSound::convertMystID(uint16 id) {
return id; return id;
} }
void MystSound::replaceBackgroundMyst(uint16 id, uint16 volume) { void MystSound::playBackground(uint16 id, uint16 volume) {
debug(0, "Replacing background sound with %d", id); debug(0, "Replacing background sound with %d", id);
// TODO: The original engine does fading stopEffect();
Common::String name = _vm->getResourceName(ID_MSND, convertMystID(id)); Common::String name = _vm->getResourceName(ID_MSND, convertMystID(id));
@ -188,52 +136,69 @@ void MystSound::replaceBackgroundMyst(uint16 id, uint16 volume) {
prefix = name; prefix = name;
// Check if sound is already playing // Check if sound is already playing
if (_mystBackgroundSound.type == kUsedHandle && _vm->_mixer->isSoundHandleActive(_mystBackgroundSound.handle) if (_vm->_mixer->isSoundHandleActive(_backgroundHandle)
&& _vm->getResourceName(ID_MSND, convertMystID(_mystBackgroundSound.id)).hasPrefix(prefix)) { && _vm->getResourceName(ID_MSND, convertMystID(_backgroundId)).hasPrefix(prefix)) {
// The sound is already playing, just change the volume // The sound is already playing, just change the volume
changeBackgroundVolumeMyst(volume); changeBackgroundVolume(volume);
return; return;
} }
// Stop old background sound // Stop old background sound
stopBackgroundMyst(); stopBackground();
// Play new sound // Play new sound
Audio::RewindableAudioStream *rewindStream = makeAudioStream(id); Audio::RewindableAudioStream *rewindStream = makeAudioStream(id);
if (rewindStream) { if (rewindStream) {
_mystBackgroundSound.type = kUsedHandle; _backgroundId = id;
_mystBackgroundSound.id = id;
_mystBackgroundSound.samplesPerSecond = rewindStream->getRate();
// Set the stream to loop // Set the stream to loop
Audio::AudioStream *audStream = Audio::makeLoopingAudioStream(rewindStream, 0); Audio::AudioStream *audStream = Audio::makeLoopingAudioStream(rewindStream, 0);
_vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &_mystBackgroundSound.handle, audStream, -1, volume >> 8); _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_backgroundHandle, audStream, -1, volume >> 8);
} }
} }
void MystSound::stopBackgroundMyst() { void MystSound::stopBackground() {
if (_mystBackgroundSound.type == kUsedHandle) { _vm->_mixer->stopHandle(_backgroundHandle);
_vm->_mixer->stopHandle(_mystBackgroundSound.handle); _backgroundId = 0;
_mystBackgroundSound.type = kFreeHandle; _backgroundHandle = Audio::SoundHandle();
_mystBackgroundSound.id = 0; }
void MystSound::pauseBackground() {
_vm->_mixer->pauseHandle(_backgroundHandle, true);
}
void MystSound::resumeBackground() {
stopEffect();
_vm->_mixer->pauseHandle(_backgroundHandle, false);
}
void MystSound::changeBackgroundVolume(uint16 volume) {
_vm->_mixer->setChannelVolume(_backgroundHandle, volume >> 8);
}
void MystSound::playSpeech(uint16 id, CueList *cueList) {
debug (0, "Playing speech %d", id);
Audio::RewindableAudioStream *rewindStream = makeAudioStream(id, cueList);
if (!rewindStream) {
warning("Unable to open sound '%d'", id);
return;
} }
_speechSamplesPerSecond = rewindStream->getRate();
_vm->_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_speechHandle, rewindStream);
} }
void MystSound::pauseBackgroundMyst() { bool MystSound::isSpeechPlaying() {
if (_mystBackgroundSound.type == kUsedHandle) return _vm->_mixer->isSoundHandleActive(_speechHandle);
_vm->_mixer->pauseHandle(_mystBackgroundSound.handle, true);
} }
void MystSound::resumeBackgroundMyst() { void MystSound::stopSpeech() {
if (_mystBackgroundSound.type == kUsedHandle) _vm->_mixer->stopHandle(_speechHandle);
_vm->_mixer->pauseHandle(_mystBackgroundSound.handle, false); _speechHandle = Audio::SoundHandle();
} _speechSamplesPerSecond = 0;
void MystSound::changeBackgroundVolumeMyst(uint16 vol) {
if (_mystBackgroundSound.type == kUsedHandle)
_vm->_mixer->setChannelVolume(_mystBackgroundSound.handle, vol >> 8);
} }
} // End of namespace Mohawk } // End of namespace Mohawk

View file

@ -28,14 +28,13 @@
#include "audio/mixer.h" #include "audio/mixer.h"
#include "mohawk/sound.h"
namespace Audio { namespace Audio {
class RewindableAudioStream; class RewindableAudioStream;
} }
namespace Mohawk { namespace Mohawk {
struct CueList;
class MohawkEngine_Myst; class MohawkEngine_Myst;
class MystSound { class MystSound {
@ -43,32 +42,38 @@ public:
MystSound(MohawkEngine_Myst *vm); MystSound(MohawkEngine_Myst *vm);
~MystSound(); ~MystSound();
// Generic sound functions // Effect channel
Audio::SoundHandle *playSound(uint16 id, byte volume = Audio::Mixer::kMaxChannelVolume, bool loop = false, CueList *cueList = NULL); void playEffect(uint16 id, bool loop = false);
void stopSound(); void stopEffect();
void stopSound(uint16 id); bool isEffectPlaying();
bool isPlaying(uint16 id);
bool isPlaying();
uint getNumSamplesPlayed(uint16 id);
// Myst-specific sound functions // Background channel
Audio::SoundHandle *replaceSoundMyst(uint16 id, byte volume = Audio::Mixer::kMaxChannelVolume, bool loop = false); void playBackground(uint16 id, uint16 volume = 0xFFFF);
void replaceBackgroundMyst(uint16 id, uint16 volume = 0xFFFF); void pauseBackground();
void pauseBackgroundMyst(); void resumeBackground();
void resumeBackgroundMyst(); void stopBackground();
void stopBackgroundMyst(); void changeBackgroundVolume(uint16 volume);
void changeBackgroundVolumeMyst(uint16 vol);
// Speech channel
void playSpeech(uint16 id, CueList *cueList = nullptr);
bool isSpeechPlaying();
uint getSpeechNumSamplesPlayed();
void stopSpeech();
private: private:
MohawkEngine_Myst *_vm; MohawkEngine_Myst *_vm;
Common::Array<SndHandle> _handles; Audio::RewindableAudioStream *makeAudioStream(uint16 id, CueList *cueList = nullptr);
SndHandle *getHandle();
Audio::RewindableAudioStream *makeAudioStream(uint16 id, CueList *cueList = NULL);
uint16 convertMystID(uint16 id); uint16 convertMystID(uint16 id);
// Myst-specific Audio::SoundHandle _effectHandle;
SndHandle _mystBackgroundSound; int _speechSamplesPerSecond;
uint16 _effectId;
Audio::SoundHandle _backgroundHandle;
uint16 _backgroundId;
Audio::SoundHandle _speechHandle;
}; };
} // End of namespace Mohawk } // End of namespace Mohawk

View file

@ -323,7 +323,7 @@ void Channelwood::o_pipeExtend(uint16 op, uint16 var, uint16 argc, uint16 *argv)
uint16 soundId = argv[0]; uint16 soundId = argv[0];
debugC(kDebugScript, "\tsoundId: %d", soundId); debugC(kDebugScript, "\tsoundId: %d", soundId);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
VideoEntryPtr pipe = _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack)); VideoEntryPtr pipe = _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack));
if (!pipe) if (!pipe)
error("Failed to open 'pipebrid' movie"); error("Failed to open 'pipebrid' movie");
@ -337,7 +337,7 @@ void Channelwood::o_pipeExtend(uint16 op, uint16 var, uint16 argc, uint16 *argv)
pipe->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3040, 600)); pipe->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3040, 600));
_vm->waitUntilMovieEnds(pipe); _vm->waitUntilMovieEnds(pipe);
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -356,7 +356,7 @@ void Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 a
if (argc == 3) { if (argc == 3) {
uint16 volume = argv[2]; uint16 volume = argv[2];
_vm->_sound->changeBackgroundVolumeMyst(volume); _vm->_sound->changeBackgroundVolume(volume);
} }
} }
@ -408,7 +408,7 @@ void Channelwood::o_leverMoveFail(uint16 op, uint16 var, uint16 argc, uint16 *ar
_leverPulled = true; _leverPulled = true;
uint16 soundId = lever->getList2(0); uint16 soundId = lever->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
} else { } else {
_leverPulled = false; _leverPulled = false;
@ -426,13 +426,13 @@ void Channelwood::o_leverEndMove(uint16 op, uint16 var, uint16 argc, uint16 *arg
uint16 soundId = lever->getList3(0); uint16 soundId = lever->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->checkCursorHints(); _vm->checkCursorHints();
} }
void Channelwood::o_leverEndMoveResumeBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_leverEndMoveResumeBackground(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
o_leverEndMove(op, var, argc, argv); o_leverEndMove(op, var, argc, argv);
} }
@ -442,7 +442,7 @@ void Channelwood::o_leverEndMoveWithSound(uint16 op, uint16 var, uint16 argc, ui
MystVideoInfo *lever = getInvokingResource<MystVideoInfo>(); MystVideoInfo *lever = getInvokingResource<MystVideoInfo>();
uint16 soundId = lever->getList3(0); uint16 soundId = lever->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
void Channelwood::o_leverElev3StartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_leverElev3StartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -455,7 +455,7 @@ void Channelwood::o_leverElev3EndMove(uint16 op, uint16 var, uint16 argc, uint16
o_leverEndMove(op, var, argc, argv); o_leverEndMove(op, var, argc, argv);
_vm->_gfx->copyImageToScreen(3265, Common::Rect(544, 333)); _vm->_gfx->copyImageToScreen(3265, Common::Rect(544, 333));
_vm->doFrame(); _vm->doFrame();
_vm->_sound->replaceSoundMyst(5265); _vm->_sound->playEffect(5265);
} }
void Channelwood::o_pumpLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_pumpLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -465,10 +465,10 @@ void Channelwood::o_pumpLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *ar
if (lever->pullLeverV()) { if (lever->pullLeverV()) {
uint16 soundId = lever->getList2(0); uint16 soundId = lever->getList2(0);
_vm->_sound->replaceBackgroundMyst(soundId, 38400); _vm->_sound->playBackground(soundId, 38400);
} else { } else {
uint16 soundId = lever->getList2(1); uint16 soundId = lever->getList2(1);
_vm->_sound->replaceBackgroundMyst(soundId, 36864); _vm->_sound->playBackground(soundId, 36864);
} }
} }
@ -478,7 +478,7 @@ void Channelwood::o_pumpLeverEndMove(uint16 op, uint16 var, uint16 argc, uint16
MystVideoInfo *lever = getInvokingResource<MystVideoInfo>(); MystVideoInfo *lever = getInvokingResource<MystVideoInfo>();
uint16 soundId = lever->getList3(0); uint16 soundId = lever->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceBackgroundMyst(soundId, 36864); _vm->_sound->playBackground(soundId, 36864);
} }
void Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -519,7 +519,7 @@ void Channelwood::o_valveHandleMoveStart1(uint16 op, uint16 var, uint16 argc, ui
MystVideoInfo *handle = getInvokingResource<MystVideoInfo>(); MystVideoInfo *handle = getInvokingResource<MystVideoInfo>();
uint16 soundId = handle->getList1(0); uint16 soundId = handle->getList1(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
o_valveHandleMove1(op, var, argc, argv); o_valveHandleMove1(op, var, argc, argv);
@ -539,7 +539,7 @@ void Channelwood::o_valveHandleMoveStop(uint16 op, uint16 var, uint16 argc, uint
// Play release sound // Play release sound
uint16 soundId = handle->getList3(0); uint16 soundId = handle->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
// Redraw valve // Redraw valve
_vm->redrawArea(_valveVar); _vm->redrawArea(_valveVar);
@ -570,7 +570,7 @@ void Channelwood::o_valveHandleMoveStart2(uint16 op, uint16 var, uint16 argc, ui
MystVideoInfo *handle = getInvokingResource<MystVideoInfo>(); MystVideoInfo *handle = getInvokingResource<MystVideoInfo>();
uint16 soundId = handle->getList1(0); uint16 soundId = handle->getList1(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
o_valveHandleMove2(op, var, argc, argv); o_valveHandleMove2(op, var, argc, argv);
@ -598,7 +598,7 @@ void Channelwood::o_valveHandleMoveStart3(uint16 op, uint16 var, uint16 argc, ui
MystVideoInfo *handle = getInvokingResource<MystVideoInfo>(); MystVideoInfo *handle = getInvokingResource<MystVideoInfo>();
uint16 soundId = handle->getList1(0); uint16 soundId = handle->getList1(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
o_valveHandleMove3(op, var, argc, argv); o_valveHandleMove3(op, var, argc, argv);
@ -661,7 +661,7 @@ void Channelwood::o_drawerOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv)
void Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Temple hologram", op); debugC(kDebugScript, "Opcode %d: Temple hologram", op);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
// Used on Card 3333 (Temple Hologram) // Used on Card 3333 (Temple Hologram)
switch (_state.holoprojectorSelection) { switch (_state.holoprojectorSelection) {
@ -682,7 +682,7 @@ void Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *a
break; break;
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Channelwood::o_executeMouseUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_executeMouseUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -745,9 +745,9 @@ void Channelwood::o_elevatorMovies(uint16 op, uint16 var, uint16 argc, uint16 *a
error("Unknown elevator state %d in o_elevatorMovies", elevator); error("Unknown elevator state %d in o_elevatorMovies", elevator);
} }
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
_vm->playMovieBlocking(movie, x, y); _vm->playMovieBlocking(movie, x, y);
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Channelwood::o_soundReplace(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Channelwood::o_soundReplace(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -755,8 +755,8 @@ void Channelwood::o_soundReplace(uint16 op, uint16 var, uint16 argc, uint16 *arg
uint16 soundId = argv[0]; uint16 soundId = argv[0];
if (!_vm->_sound->isPlaying()) { if (!_vm->_sound->isEffectPlaying()) {
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
} }

View file

@ -283,7 +283,7 @@ void Mechanical::o_birdCrankStart(uint16 op, uint16 var, uint16 argc, uint16 *ar
MystAreaDrag *crank = getInvokingResource<MystAreaDrag>(); MystAreaDrag *crank = getInvokingResource<MystAreaDrag>();
uint16 crankSoundId = crank->getList2(0); uint16 crankSoundId = crank->getList2(0);
_vm->_sound->replaceSoundMyst(crankSoundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(crankSoundId, true);
_birdSingEndTime = 0; _birdSingEndTime = 0;
_birdCrankStartTime = _vm->_system->getMillis(); _birdCrankStartTime = _vm->_system->getMillis();
@ -301,7 +301,7 @@ void Mechanical::o_birdCrankStop(uint16 op, uint16 var, uint16 argc, uint16 *arg
crankMovie->pauseMovie(true); crankMovie->pauseMovie(true);
uint16 crankSoundId = crank->getList2(1); uint16 crankSoundId = crank->getList2(1);
_vm->_sound->replaceSoundMyst(crankSoundId); _vm->_sound->playEffect(crankSoundId);
_birdSingEndTime = 2 * _vm->_system->getMillis() - _birdCrankStartTime; _birdSingEndTime = 2 * _vm->_system->getMillis() - _birdCrankStartTime;
_birdSinging = true; _birdSinging = true;
@ -343,7 +343,7 @@ void Mechanical::o_elevatorRotationStart(uint16 op, uint16 var, uint16 argc, uin
_elevatorRotationLeverMoving = true; _elevatorRotationLeverMoving = true;
_elevatorRotationSpeed = 0; _elevatorRotationSpeed = 0;
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
} }
@ -407,7 +407,7 @@ void Mechanical::o_elevatorRotationStop(uint16 op, uint16 var, uint16 argc, uint
// Increment position // Increment position
_state.elevatorRotation = (_state.elevatorRotation + 1) % 10; _state.elevatorRotation = (_state.elevatorRotation + 1) % 10;
_vm->_sound->replaceSoundMyst(_elevatorRotationSoundId); _vm->_sound->playEffect(_elevatorRotationSoundId);
_vm->redrawArea(11); _vm->redrawArea(11);
} }
@ -626,17 +626,17 @@ void Mechanical::elevatorGoMiddle_run() {
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
_vm->playSoundBlocking(11120); _vm->playSoundBlocking(11120);
_vm->_gfx->copyImageToBackBuffer(6118, Common::Rect(544, 333)); _vm->_gfx->copyImageToBackBuffer(6118, Common::Rect(544, 333));
_vm->_sound->replaceSoundMyst(12120); _vm->_sound->playEffect(12120);
_vm->_gfx->runTransition(kTransitionSlideToLeft, Common::Rect(177, 0, 370, 333), 25, 0); _vm->_gfx->runTransition(kTransitionSlideToLeft, Common::Rect(177, 0, 370, 333), 25, 0);
_vm->playSoundBlocking(13120); _vm->playSoundBlocking(13120);
_vm->_sound->replaceSoundMyst(8120); _vm->_sound->playEffect(8120);
_vm->_gfx->copyImageToBackBuffer(6327, Common::Rect(544, 333)); _vm->_gfx->copyImageToBackBuffer(6327, Common::Rect(544, 333));
_vm->wait(500); _vm->wait(500);
_vm->_sound->replaceSoundMyst(9120); _vm->_sound->playEffect(9120);
static uint16 moviePos[2] = { 3540, 5380 }; static uint16 moviePos[2] = { 3540, 5380 };
o_elevatorWindowMovie(121, 0, 2, moviePos); o_elevatorWindowMovie(121, 0, 2, moviePos);
_vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333));
_vm->_sound->replaceSoundMyst(10120); _vm->_sound->playEffect(10120);
_vm->_cursor->showCursor(); _vm->_cursor->showCursor();
_elevatorPosition = 1; _elevatorPosition = 1;
@ -754,7 +754,7 @@ void Mechanical::birdSing_run() {
uint32 time = _vm->_system->getMillis(); uint32 time = _vm->_system->getMillis();
if (_birdSingEndTime < time) { if (_birdSingEndTime < time) {
_bird->pauseMovie(true); _bird->pauseMovie(true);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_birdSinging = false; _birdSinging = false;
} }
} }
@ -784,7 +784,7 @@ void Mechanical::elevatorRotation_run() {
_state.elevatorRotation = (_state.elevatorRotation + 1) % 10; _state.elevatorRotation = (_state.elevatorRotation + 1) % 10;
_vm->_sound->replaceSoundMyst(_elevatorRotationSoundId); _vm->_sound->playEffect(_elevatorRotationSoundId);
_vm->redrawArea(11); _vm->redrawArea(11);
_vm->wait(100); _vm->wait(100);
} }
@ -910,15 +910,15 @@ void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uin
void Mechanical::fortressSimulation_run() { void Mechanical::fortressSimulation_run() {
if (_fortressSimulationInit) { if (_fortressSimulationInit) {
// Init sequence // Init sequence
_vm->_sound->replaceBackgroundMyst(_fortressSimulationStartSound1, 65535); _vm->_sound->playBackground(_fortressSimulationStartSound1, 65535);
_vm->wait(5000, true); _vm->wait(5000, true);
VideoEntryPtr startup = _fortressSimulationStartup->playMovie(); VideoEntryPtr startup = _fortressSimulationStartup->playMovie();
_vm->playSoundBlocking(_fortressSimulationStartSound2); _vm->playSoundBlocking(_fortressSimulationStartSound2);
_vm->_sound->replaceBackgroundMyst(_fortressSimulationStartSound1, 65535); _vm->_sound->playBackground(_fortressSimulationStartSound1, 65535);
_vm->waitUntilMovieEnds(startup); _vm->waitUntilMovieEnds(startup);
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_vm->_sound->replaceSoundMyst(_fortressSimulationStartSound2); _vm->_sound->playEffect(_fortressSimulationStartSound2);
Common::Rect src = Common::Rect(0, 0, 176, 176); Common::Rect src = Common::Rect(0, 0, 176, 176);

View file

@ -825,9 +825,9 @@ void Myst::o_libraryBookPageTurnLeft(uint16 op, uint16 var, uint16 argc, uint16
_vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect); _vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect);
if (_vm->_rnd->getRandomBit()) if (_vm->_rnd->getRandomBit())
_vm->_sound->replaceSoundMyst(_libraryBookSound1); _vm->_sound->playEffect(_libraryBookSound1);
else else
_vm->_sound->replaceSoundMyst(_libraryBookSound2); _vm->_sound->playEffect(_libraryBookSound2);
} }
} }
@ -841,9 +841,9 @@ void Myst::o_libraryBookPageTurnRight(uint16 op, uint16 var, uint16 argc, uint16
_vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect); _vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect);
if (_vm->_rnd->getRandomBit()) if (_vm->_rnd->getRandomBit())
_vm->_sound->replaceSoundMyst(_libraryBookSound1); _vm->_sound->playEffect(_libraryBookSound1);
else else
_vm->_sound->replaceSoundMyst(_libraryBookSound2); _vm->_sound->playEffect(_libraryBookSound2);
} }
} }
@ -918,7 +918,7 @@ void Myst::o_towerRotationStart(uint16 op, uint16 var, uint16 argc, uint16 *argv
towerRotationMapComputeAngle(); towerRotationMapComputeAngle();
towerRotationMapDrawLine(center, end); towerRotationMapDrawLine(center, end);
_vm->_sound->replaceSoundMyst(5378, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(5378, true);
} }
void Myst::o_towerRotationEnd(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_towerRotationEnd(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -943,7 +943,7 @@ void Myst::o_towerRotationEnd(uint16 op, uint16 var, uint16 argc, uint16 *argv)
_state.towerRotationAngle = 152; _state.towerRotationAngle = 152;
} }
_vm->_sound->replaceSoundMyst(6378); _vm->_sound->playEffect(6378);
_towerRotationBlinkLabel = true; _towerRotationBlinkLabel = true;
_towerRotationBlinkLabelCount = 0; _towerRotationBlinkLabelCount = 0;
@ -998,7 +998,7 @@ void Myst::o_dockVaultOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
else else
_dockVaultState = 1; _dockVaultState = 1;
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->redrawArea(41, false); _vm->redrawArea(41, false);
animatedUpdate(directionalUpdateDataSize, &argv[3], delay); animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
} }
@ -1025,7 +1025,7 @@ void Myst::o_dockVaultClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
if (_dockVaultState == 1 || _dockVaultState == 2) if (_dockVaultState == 1 || _dockVaultState == 2)
_dockVaultState = 0; _dockVaultState = 0;
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->redrawArea(41, false); _vm->redrawArea(41, false);
animatedUpdate(directionalUpdateDataSize, &argv[3], delay); animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
} }
@ -1129,7 +1129,7 @@ void Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 argc, uint16 *argv
&& _state.clockTowerMinutePosition == 40; && _state.clockTowerMinutePosition == 40;
if (!_state.clockTowerBridgeOpen && correctTime) { if (!_state.clockTowerBridgeOpen && correctTime) {
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->wait(500); _vm->wait(500);
// Gears rise up // Gears rise up
@ -1144,7 +1144,7 @@ void Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 argc, uint16 *argv
_state.clockTowerBridgeOpen = 1; _state.clockTowerBridgeOpen = 1;
_vm->redrawArea(12); _vm->redrawArea(12);
} else if (_state.clockTowerBridgeOpen && !correctTime) { } else if (_state.clockTowerBridgeOpen && !correctTime) {
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->wait(500); _vm->wait(500);
// Gears sink down // Gears sink down
@ -1167,7 +1167,7 @@ void Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv)
uint16 video = getVar(51); uint16 video = getVar(51);
// Press button // Press button
_vm->_sound->replaceSoundMyst(4698); _vm->_sound->playEffect(4698);
Common::Rect src = Common::Rect(0, 0, 32, 75); Common::Rect src = Common::Rect(0, 0, 32, 75);
Common::Rect dest = Common::Rect(261, 257, 293, 332); Common::Rect dest = Common::Rect(261, 257, 293, 332);
@ -1183,7 +1183,7 @@ void Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv)
// Play selected video // Play selected video
if (!_state.imagerActive && video != 3) if (!_state.imagerActive && video != 3)
_vm->_sound->replaceSoundMyst(argv[0]); _vm->_sound->playEffect(argv[0]);
switch (video) { switch (video) {
case 0: // Nothing case 0: // Nothing
@ -1220,7 +1220,7 @@ void Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv)
_imagerMovie->setBlocking(false); _imagerMovie->setBlocking(false);
if (_state.imagerActive) { if (_state.imagerActive) {
_vm->_sound->replaceSoundMyst(argv[1]); _vm->_sound->playEffect(argv[1]);
// Water disappearing // Water disappearing
VideoEntryPtr water = _imagerMovie->playMovie(); VideoEntryPtr water = _imagerMovie->playMovie();
@ -1301,11 +1301,11 @@ void Myst::imagerValidation_run() {
_imagerRedButton->drawConditionalDataToScreen(1); _imagerRedButton->drawConditionalDataToScreen(1);
if (_imagerValidationStep < 6) if (_imagerValidationStep < 6)
_vm->_sound->replaceSoundMyst(_imagerSound[0]); _vm->_sound->playEffect(_imagerSound[0]);
else if (_imagerValidationStep < 10) else if (_imagerValidationStep < 10)
_vm->_sound->replaceSoundMyst(_imagerSound[1]); _vm->_sound->playEffect(_imagerSound[1]);
else if (_imagerValidationStep == 10) else if (_imagerValidationStep == 10)
_vm->_sound->replaceSoundMyst(_imagerSound[2]); _vm->_sound->playEffect(_imagerSound[2]);
_imagerValidationStep++; _imagerValidationStep++;
@ -1328,8 +1328,8 @@ void Myst::o_towerElevatorAnimation(uint16 op, uint16 var, uint16 argc, uint16 *
_treeStopped = true; _treeStopped = true;
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
switch (argv[0]) { switch (argv[0]) {
case 0: case 0:
@ -1342,7 +1342,7 @@ void Myst::o_towerElevatorAnimation(uint16 op, uint16 var, uint16 argc, uint16 *
break; break;
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
_vm->_cursor->showCursor(); _vm->_cursor->showCursor();
_treeStopped = false; _treeStopped = false;
} }
@ -1366,17 +1366,17 @@ void Myst::o_generatorButtonPressed(uint16 op, uint16 var, uint16 argc, uint16 *
_state.generatorVoltage -= value; _state.generatorVoltage -= value;
if (_state.generatorVoltage) if (_state.generatorVoltage)
_vm->_sound->replaceSoundMyst(8297); _vm->_sound->playEffect(8297);
else { else {
_vm->_sound->replaceSoundMyst(9297); _vm->_sound->playEffect(9297);
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
} }
} else { } else {
if (_generatorVoltage) if (_generatorVoltage)
_vm->_sound->replaceSoundMyst(6297); _vm->_sound->playEffect(6297);
else { else {
_vm->_sound->replaceSoundMyst(7297); _vm->_sound->playBackground(4297);
_vm->_sound->replaceBackgroundMyst(4297); _vm->_sound->playEffect(7297);
} }
_state.generatorButtons |= mask; _state.generatorButtons |= mask;
@ -1482,13 +1482,13 @@ void Myst::o_cabinSafeHandleMove(uint16 op, uint16 var, uint16 argc, uint16 *arg
if (_tempVar == 0) { if (_tempVar == 0) {
uint16 soundId = handle->getList2(0); uint16 soundId = handle->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
// Combination is right // Combination is right
if (_state.cabinSafeCombination == 724) { if (_state.cabinSafeCombination == 724) {
uint16 soundId = handle->getList2(1); uint16 soundId = handle->getList2(1);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->changeToCard(4103, kNoTransition); _vm->changeToCard(4103, kNoTransition);
@ -1513,7 +1513,7 @@ void Myst::o_cabinSafeHandleEndMove(uint16 op, uint16 var, uint16 argc, uint16 *
void Myst::o_observatoryMonthChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_observatoryMonthChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Observatory month change start", op); debugC(kDebugScript, "Opcode %d: Observatory month change start", op);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
if (op == 129 || op == 131) { if (op == 129 || op == 131) {
// Increase // Increase
@ -1561,7 +1561,7 @@ void Myst::observatoryIncrementMonth(int16 increment) {
_state.observatoryMonthSlider = _observatoryMonthSlider->_pos.y; _state.observatoryMonthSlider = _observatoryMonthSlider->_pos.y;
} }
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
} }
void Myst::observatoryMonthChange_run() { void Myst::observatoryMonthChange_run() {
@ -1572,7 +1572,7 @@ void Myst::observatoryMonthChange_run() {
void Myst::o_observatoryDayChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_observatoryDayChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Observatory day change start", op); debugC(kDebugScript, "Opcode %d: Observatory day change start", op);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
if (op == 129 || op == 131) { if (op == 129 || op == 131) {
// Increase // Increase
@ -1621,7 +1621,7 @@ void Myst::observatoryIncrementDay(int16 increment) {
_state.observatoryDaySlider = _observatoryDaySlider->_pos.y; _state.observatoryDaySlider = _observatoryDaySlider->_pos.y;
} }
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
} }
void Myst::observatoryDayChange_run() { void Myst::observatoryDayChange_run() {
@ -1632,7 +1632,7 @@ void Myst::observatoryDayChange_run() {
void Myst::o_observatoryYearChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_observatoryYearChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Observatory year change start", op); debugC(kDebugScript, "Opcode %d: Observatory year change start", op);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
if (op == 196) { if (op == 196) {
// Increase // Increase
@ -1675,7 +1675,7 @@ void Myst::observatoryIncrementYear(int16 increment) {
_state.observatoryYearSlider = _observatoryYearSlider->_pos.y; _state.observatoryYearSlider = _observatoryYearSlider->_pos.y;
} }
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
} }
void Myst::observatoryYearChange_run() { void Myst::observatoryYearChange_run() {
@ -1686,7 +1686,7 @@ void Myst::observatoryYearChange_run() {
void Myst::o_observatoryTimeChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_observatoryTimeChangeStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Observatory time change start", op); debugC(kDebugScript, "Opcode %d: Observatory time change start", op);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
if (op == 192) { if (op == 192) {
// Increase // Increase
@ -1734,7 +1734,7 @@ void Myst::observatoryIncrementTime(int16 increment) {
_state.observatoryTimeSlider = _observatoryTimeSlider->_pos.y; _state.observatoryTimeSlider = _observatoryTimeSlider->_pos.y;
} }
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
} }
void Myst::observatoryTimeChange_run() { void Myst::observatoryTimeChange_run() {
@ -1751,7 +1751,7 @@ void Myst::o_observatoryGoButton(uint16 op, uint16 var, uint16 argc, uint16 *arg
|| _state.observatoryYearTarget != _state.observatoryYearSetting || _state.observatoryYearTarget != _state.observatoryYearSetting
|| _state.observatoryTimeTarget != _state.observatoryTimeSetting) { || _state.observatoryTimeTarget != _state.observatoryTimeSetting) {
uint16 soundId = argv[0]; uint16 soundId = argv[0];
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
int16 distance = _state.observatoryYearTarget - _state.observatoryYearSetting; int16 distance = _state.observatoryYearTarget - _state.observatoryYearSetting;
uint32 end = _vm->_system->getMillis() + 32 * ABS(distance) / 50 + 800; uint32 end = _vm->_system->getMillis() + 32 * ABS(distance) / 50 + 800;
@ -1764,7 +1764,7 @@ void Myst::o_observatoryGoButton(uint16 op, uint16 var, uint16 argc, uint16 *arg
_vm->redrawResource(_observatoryVisualizer); _vm->redrawResource(_observatoryVisualizer);
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
// Redraw visualizer // Redraw visualizer
observatorySetTargetToSetting(); observatorySetTargetToSetting();
@ -1832,11 +1832,11 @@ void Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 argc, uint16 *argv
if (_state.generatorVoltage > 59 || _state.generatorBreakers != 1) { if (_state.generatorVoltage > 59 || _state.generatorBreakers != 1) {
uint16 soundId = breaker->getList2(1); uint16 soundId = breaker->getList2(1);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} else { } else {
uint16 soundId = breaker->getList2(0); uint16 soundId = breaker->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
// Reset breaker state // Reset breaker state
_state.generatorBreakers = 0; _state.generatorBreakers = 0;
@ -1846,11 +1846,11 @@ void Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 argc, uint16 *argv
if (_state.generatorVoltage > 59 || _state.generatorBreakers != 2) { if (_state.generatorVoltage > 59 || _state.generatorBreakers != 2) {
uint16 soundId = breaker->getList2(1); uint16 soundId = breaker->getList2(1);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} else { } else {
uint16 soundId = breaker->getList2(0); uint16 soundId = breaker->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
// Reset breaker state // Reset breaker state
_state.generatorBreakers = 0; _state.generatorBreakers = 0;
@ -1873,7 +1873,7 @@ void Myst::o_boilerIncreasePressureStart(uint16 op, uint16 var, uint16 argc, uin
_treeStopped = true; _treeStopped = true;
if (_state.cabinValvePosition < 25) if (_state.cabinValvePosition < 25)
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_boilerPressureIncreasing = true; _boilerPressureIncreasing = true;
} }
@ -1892,7 +1892,7 @@ void Myst::o_boilerLightPilot(uint16 op, uint16 var, uint16 argc, uint16 *argv)
_matchGoOutTime = _vm->_system->getMillis(); _matchGoOutTime = _vm->_system->getMillis();
if (_state.cabinValvePosition > 0) if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackgroundMyst(8098, 49152); _vm->_sound->playBackground(8098, 49152);
if (_state.cabinValvePosition > 12) { if (_state.cabinValvePosition > 12) {
// Compute the speed of the gauge to synchronize it with the next tree move // Compute the speed of the gauge to synchronize it with the next tree move
@ -1949,7 +1949,7 @@ void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint
if (_state.cabinPilotLightLit == 1) { if (_state.cabinPilotLightLit == 1) {
if (_state.cabinValvePosition > 0) if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackgroundMyst(8098, 49152); _vm->_sound->playBackground(8098, 49152);
if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) { if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) {
uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); uint16 delay = treeNextMoveDelay(_state.cabinValvePosition);
@ -1958,12 +1958,12 @@ void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint
} }
} else if (_state.cabinValvePosition > 0) } else if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackgroundMyst(4098, _state.cabinValvePosition << 10); _vm->_sound->playBackground(4098, _state.cabinValvePosition << 10);
} }
void Myst::boilerPressureIncrease_run() { void Myst::boilerPressureIncrease_run() {
// Allow increasing pressure if sound has stopped // Allow increasing pressure if sound has stopped
if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition < 25) { if (!_vm->_sound->isEffectPlaying() && _state.cabinValvePosition < 25) {
_state.cabinValvePosition++; _state.cabinValvePosition++;
if (_state.cabinValvePosition == 1) { if (_state.cabinValvePosition == 1) {
// Set fire to high // Set fire to high
@ -1973,13 +1973,13 @@ void Myst::boilerPressureIncrease_run() {
_vm->redrawArea(305); _vm->redrawArea(305);
} else if (_state.cabinValvePosition == 25) { } else if (_state.cabinValvePosition == 25) {
if (_state.cabinPilotLightLit == 1) if (_state.cabinPilotLightLit == 1)
_vm->_sound->replaceBackgroundMyst(8098, 49152); _vm->_sound->playBackground(8098, 49152);
else else
_vm->_sound->replaceBackgroundMyst(4098, 25600); _vm->_sound->playBackground(4098, 25600);
} }
// Pressure increasing sound // Pressure increasing sound
_vm->_sound->replaceSoundMyst(5098); _vm->_sound->playEffect(5098);
// Redraw wheel // Redraw wheel
_vm->redrawArea(99); _vm->redrawArea(99);
@ -1988,7 +1988,7 @@ void Myst::boilerPressureIncrease_run() {
void Myst::boilerPressureDecrease_run() { void Myst::boilerPressureDecrease_run() {
// Allow decreasing pressure if sound has stopped // Allow decreasing pressure if sound has stopped
if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition > 0) { if (!_vm->_sound->isEffectPlaying() && _state.cabinValvePosition > 0) {
_state.cabinValvePosition--; _state.cabinValvePosition--;
if (_state.cabinValvePosition == 0) { if (_state.cabinValvePosition == 0) {
// Set fire to low // Set fire to low
@ -1999,7 +1999,7 @@ void Myst::boilerPressureDecrease_run() {
} }
// Pressure increasing sound // Pressure increasing sound
_vm->_sound->replaceSoundMyst(5098); _vm->_sound->playEffect(5098);
// Redraw wheel // Redraw wheel
_vm->redrawArea(99); _vm->redrawArea(99);
@ -2010,7 +2010,7 @@ void Myst::o_boilerDecreasePressureStart(uint16 op, uint16 var, uint16 argc, uin
debugC(kDebugScript, "Opcode %d: Boiler decrease pressure start", op); debugC(kDebugScript, "Opcode %d: Boiler decrease pressure start", op);
_treeStopped = true; _treeStopped = true;
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_boilerPressureDecreasing = true; _boilerPressureDecreasing = true;
} }
@ -2024,7 +2024,7 @@ void Myst::o_boilerDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint
if (_state.cabinPilotLightLit == 1) { if (_state.cabinPilotLightLit == 1) {
if (_state.cabinValvePosition > 0) if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackgroundMyst(8098, 49152); _vm->_sound->playBackground(8098, 49152);
if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) { if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) {
uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); uint16 delay = treeNextMoveDelay(_state.cabinValvePosition);
@ -2034,7 +2034,7 @@ void Myst::o_boilerDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint
} else { } else {
if (_state.cabinValvePosition > 0) if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackgroundMyst(4098, _state.cabinValvePosition << 10); _vm->_sound->playBackground(4098, _state.cabinValvePosition << 10);
} }
} }
@ -2055,11 +2055,11 @@ void Myst::o_basementIncreasePressureStop(uint16 op, uint16 var, uint16 argc, ui
void Myst::basementPressureIncrease_run() { void Myst::basementPressureIncrease_run() {
// Allow increasing pressure if sound has stopped // Allow increasing pressure if sound has stopped
if (!_vm->_sound->isPlaying(4642) && _state.cabinValvePosition < 25) { if (!_vm->_sound->isEffectPlaying() && _state.cabinValvePosition < 25) {
_state.cabinValvePosition++; _state.cabinValvePosition++;
// Pressure increasing sound // Pressure increasing sound
_vm->_sound->replaceSoundMyst(4642); _vm->_sound->playEffect(4642);
// Redraw wheel // Redraw wheel
_vm->redrawArea(99); _vm->redrawArea(99);
@ -2068,11 +2068,11 @@ void Myst::basementPressureIncrease_run() {
void Myst::basementPressureDecrease_run() { void Myst::basementPressureDecrease_run() {
// Allow decreasing pressure if sound has stopped // Allow decreasing pressure if sound has stopped
if (!_vm->_sound->isPlaying(4642) && _state.cabinValvePosition > 0) { if (!_vm->_sound->isEffectPlaying() && _state.cabinValvePosition > 0) {
_state.cabinValvePosition--; _state.cabinValvePosition--;
// Pressure decreasing sound // Pressure decreasing sound
_vm->_sound->replaceSoundMyst(4642); _vm->_sound->playEffect(4642);
// Redraw wheel // Redraw wheel
_vm->redrawArea(99); _vm->redrawArea(99);
@ -2117,18 +2117,18 @@ void Myst::tree_run() {
// Tree movement // Tree movement
if (goingDown) { if (goingDown) {
_state.treePosition--; _state.treePosition--;
_vm->_sound->replaceSoundMyst(2); _vm->_sound->playEffect(2);
} else { } else {
_state.treePosition++; _state.treePosition++;
_vm->_sound->replaceSoundMyst(1); _vm->_sound->playEffect(1);
} }
// Stop background music if going up from book room // Stop background music if going up from book room
if (_vm->getCurCard() == 4630) { if (_vm->getCurCard() == 4630) {
if (_state.treePosition > 0) if (_state.treePosition > 0)
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
else else
_vm->_sound->replaceBackgroundMyst(4630, 24576); _vm->_sound->playBackground(4630, 24576);
} }
// Redraw tree // Redraw tree
@ -2168,7 +2168,7 @@ void Myst::o_rocketSoundSliderStartMove(uint16 op, uint16 var, uint16 argc, uint
_rocketSliderSound = 0; _rocketSliderSound = 0;
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
rocketSliderMove(); rocketSliderMove();
} }
@ -2184,7 +2184,7 @@ void Myst::o_rocketSoundSliderEndMove(uint16 op, uint16 var, uint16 argc, uint16
_vm->checkCursorHints(); _vm->checkCursorHints();
if (_state.generatorVoltage == 59 && !_state.generatorBreakers && _rocketSliderSound) if (_state.generatorVoltage == 59 && !_state.generatorBreakers && _rocketSliderSound)
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
if (getInvokingResource<MystArea>() == _rocketSlider1) if (getInvokingResource<MystArea>() == _rocketSlider1)
_state.rocketSliderPosition[0] = _rocketSlider1->_pos.y; _state.rocketSliderPosition[0] = _rocketSlider1->_pos.y;
@ -2197,7 +2197,7 @@ void Myst::o_rocketSoundSliderEndMove(uint16 op, uint16 var, uint16 argc, uint16
else if (getInvokingResource<MystArea>() == _rocketSlider5) else if (getInvokingResource<MystArea>() == _rocketSlider5)
_state.rocketSliderPosition[4] = _rocketSlider5->_pos.y; _state.rocketSliderPosition[4] = _rocketSlider5->_pos.y;
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Myst::rocketSliderMove() { void Myst::rocketSliderMove() {
@ -2207,7 +2207,7 @@ void Myst::rocketSliderMove() {
uint16 soundId = rocketSliderGetSound(slider->_pos.y); uint16 soundId = rocketSliderGetSound(slider->_pos.y);
if (soundId != _rocketSliderSound) { if (soundId != _rocketSliderSound) {
_rocketSliderSound = soundId; _rocketSliderSound = soundId;
_vm->_sound->replaceSoundMyst(soundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(soundId, true);
} }
} }
} }
@ -2223,41 +2223,41 @@ void Myst::rocketCheckSolution() {
bool solved = true; bool solved = true;
soundId = rocketSliderGetSound(_rocketSlider1->_pos.y); soundId = rocketSliderGetSound(_rocketSlider1->_pos.y);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_rocketSlider1->drawConditionalDataToScreen(2); _rocketSlider1->drawConditionalDataToScreen(2);
_vm->wait(250); _vm->wait(250);
if (soundId != 9558) if (soundId != 9558)
solved = false; solved = false;
soundId = rocketSliderGetSound(_rocketSlider2->_pos.y); soundId = rocketSliderGetSound(_rocketSlider2->_pos.y);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_rocketSlider2->drawConditionalDataToScreen(2); _rocketSlider2->drawConditionalDataToScreen(2);
_vm->wait(250); _vm->wait(250);
if (soundId != 9546) if (soundId != 9546)
solved = false; solved = false;
soundId = rocketSliderGetSound(_rocketSlider3->_pos.y); soundId = rocketSliderGetSound(_rocketSlider3->_pos.y);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_rocketSlider3->drawConditionalDataToScreen(2); _rocketSlider3->drawConditionalDataToScreen(2);
_vm->wait(250); _vm->wait(250);
if (soundId != 9543) if (soundId != 9543)
solved = false; solved = false;
soundId = rocketSliderGetSound(_rocketSlider4->_pos.y); soundId = rocketSliderGetSound(_rocketSlider4->_pos.y);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_rocketSlider4->drawConditionalDataToScreen(2); _rocketSlider4->drawConditionalDataToScreen(2);
_vm->wait(250); _vm->wait(250);
if (soundId != 9553) if (soundId != 9553)
solved = false; solved = false;
soundId = rocketSliderGetSound(_rocketSlider5->_pos.y); soundId = rocketSliderGetSound(_rocketSlider5->_pos.y);
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_rocketSlider5->drawConditionalDataToScreen(2); _rocketSlider5->drawConditionalDataToScreen(2);
_vm->wait(250); _vm->wait(250);
if (soundId != 9560) if (soundId != 9560)
solved = false; solved = false;
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
if (solved) { if (solved) {
// Reset lever position // Reset lever position
@ -2313,9 +2313,9 @@ void Myst::o_rocketPianoStart(uint16 op, uint16 var, uint16 argc, uint16 *argv)
// Play note // Play note
_rocketPianoSound = 0; _rocketPianoSound = 0;
if (_state.generatorVoltage == 59 && !_state.generatorBreakers) { if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
_rocketPianoSound = key->getList1(0); _rocketPianoSound = key->getList1(0);
_vm->_sound->replaceSoundMyst(_rocketPianoSound, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(_rocketPianoSound, true);
} }
} }
@ -2355,13 +2355,13 @@ void Myst::o_rocketPianoMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 soundId = key->getList1(0); uint16 soundId = key->getList1(0);
if (soundId != _rocketPianoSound) { if (soundId != _rocketPianoSound) {
_rocketPianoSound = soundId; _rocketPianoSound = soundId;
_vm->_sound->replaceSoundMyst(soundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(soundId, true);
} }
} }
} else { } else {
// Not pressing a key anymore // Not pressing a key anymore
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
} }
} }
@ -2379,8 +2379,8 @@ void Myst::o_rocketPianoStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
// Draw unpressed piano key // Draw unpressed piano key
_vm->_gfx->copyImageSectionToScreen(key->getSubImage(0).wdib, src, dest); _vm->_gfx->copyImageSectionToScreen(key->getSubImage(0).wdib, src, dest);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Myst::o_rocketLeverStartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_rocketLeverStartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -2422,7 +2422,7 @@ void Myst::o_rocketLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 soundId = lever->getList2(0); uint16 soundId = lever->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
// If rocket correctly powered // If rocket correctly powered
if (_state.generatorVoltage == 59 && !_state.generatorBreakers) if (_state.generatorVoltage == 59 && !_state.generatorBreakers)
@ -2484,7 +2484,7 @@ void Myst::o_observatoryMonthSliderStartMove(uint16 op, uint16 var, uint16 argc,
debugC(kDebugScript, "Opcode %d: Month slider start move", op); debugC(kDebugScript, "Opcode %d: Month slider start move", op);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
observatoryUpdateMonth(); observatoryUpdateMonth();
} }
@ -2493,7 +2493,7 @@ void Myst::o_observatoryMonthSliderEndMove(uint16 op, uint16 var, uint16 argc, u
debugC(kDebugScript, "Opcode %d: Month slider end move", op); debugC(kDebugScript, "Opcode %d: Month slider end move", op);
_vm->checkCursorHints(); _vm->checkCursorHints();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
observatoryUpdateMonth(); observatoryUpdateMonth();
} }
@ -2504,7 +2504,7 @@ void Myst::observatoryUpdateMonth() {
if (month != _state.observatoryMonthSetting) { if (month != _state.observatoryMonthSetting) {
_state.observatoryMonthSetting = month; _state.observatoryMonthSetting = month;
_state.observatoryMonthSlider = _observatoryMonthSlider->_pos.y; _state.observatoryMonthSlider = _observatoryMonthSlider->_pos.y;
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
// Redraw digits // Redraw digits
_vm->redrawArea(73); _vm->redrawArea(73);
@ -2515,7 +2515,7 @@ void Myst::o_observatoryDaySliderStartMove(uint16 op, uint16 var, uint16 argc, u
debugC(kDebugScript, "Opcode %d: Day slider start move", op); debugC(kDebugScript, "Opcode %d: Day slider start move", op);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
observatoryUpdateDay(); observatoryUpdateDay();
} }
@ -2524,7 +2524,7 @@ void Myst::o_observatoryDaySliderEndMove(uint16 op, uint16 var, uint16 argc, uin
debugC(kDebugScript, "Opcode %d: Day slider end move", op); debugC(kDebugScript, "Opcode %d: Day slider end move", op);
_vm->checkCursorHints(); _vm->checkCursorHints();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
observatoryUpdateDay(); observatoryUpdateDay();
} }
@ -2535,7 +2535,7 @@ void Myst::observatoryUpdateDay() {
if (day != _state.observatoryDaySetting) { if (day != _state.observatoryDaySetting) {
_state.observatoryDaySetting = day; _state.observatoryDaySetting = day;
_state.observatoryDaySlider = _observatoryDaySlider->_pos.y; _state.observatoryDaySlider = _observatoryDaySlider->_pos.y;
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
// Redraw digits // Redraw digits
_vm->redrawArea(75); _vm->redrawArea(75);
@ -2547,7 +2547,7 @@ void Myst::o_observatoryYearSliderStartMove(uint16 op, uint16 var, uint16 argc,
debugC(kDebugScript, "Opcode %d: Year slider start move", op); debugC(kDebugScript, "Opcode %d: Year slider start move", op);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
observatoryUpdateYear(); observatoryUpdateYear();
} }
@ -2556,7 +2556,7 @@ void Myst::o_observatoryYearSliderEndMove(uint16 op, uint16 var, uint16 argc, ui
debugC(kDebugScript, "Opcode %d: Year slider end move", op); debugC(kDebugScript, "Opcode %d: Year slider end move", op);
_vm->checkCursorHints(); _vm->checkCursorHints();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
observatoryUpdateYear(); observatoryUpdateYear();
} }
@ -2567,7 +2567,7 @@ void Myst::observatoryUpdateYear() {
if (year != _state.observatoryYearSetting) { if (year != _state.observatoryYearSetting) {
_state.observatoryYearSetting = year; _state.observatoryYearSetting = year;
_state.observatoryYearSlider = _observatoryYearSlider->_pos.y; _state.observatoryYearSlider = _observatoryYearSlider->_pos.y;
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
// Redraw digits // Redraw digits
_vm->redrawArea(79); _vm->redrawArea(79);
@ -2581,7 +2581,7 @@ void Myst::o_observatoryTimeSliderStartMove(uint16 op, uint16 var, uint16 argc,
debugC(kDebugScript, "Opcode %d: Time slider start move", op); debugC(kDebugScript, "Opcode %d: Time slider start move", op);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
observatoryUpdateTime(); observatoryUpdateTime();
} }
@ -2590,7 +2590,7 @@ void Myst::o_observatoryTimeSliderEndMove(uint16 op, uint16 var, uint16 argc, ui
debugC(kDebugScript, "Opcode %d: Time slider end move", op); debugC(kDebugScript, "Opcode %d: Time slider end move", op);
_vm->checkCursorHints(); _vm->checkCursorHints();
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
observatoryUpdateTime(); observatoryUpdateTime();
} }
@ -2601,7 +2601,7 @@ void Myst::observatoryUpdateTime() {
if (time != _state.observatoryTimeSetting) { if (time != _state.observatoryTimeSetting) {
_state.observatoryTimeSetting = time; _state.observatoryTimeSetting = time;
_state.observatoryTimeSlider = _observatoryTimeSlider->_pos.y; _state.observatoryTimeSlider = _observatoryTimeSlider->_pos.y;
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
// Redraw digits // Redraw digits
_vm->redrawArea(80); _vm->redrawArea(80);
@ -2622,7 +2622,7 @@ void Myst::o_libraryCombinationBookStop(uint16 op, uint16 var, uint16 argc, uint
void Myst::o_cabinMatchLight(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_cabinMatchLight(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
if (!_cabinMatchState) { if (!_cabinMatchState) {
_vm->_sound->replaceSoundMyst(4103); _vm->_sound->playEffect(4103);
// Match is lit // Match is lit
_cabinMatchState = 1; _cabinMatchState = 1;
@ -2662,7 +2662,7 @@ void Myst::matchBurn_run() {
void Myst::o_courtyardBoxEnter(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_courtyardBoxEnter(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Mouse enters courtyard box", op); debugC(kDebugScript, "Opcode %d: Mouse enters courtyard box", op);
_tempVar = 1; _tempVar = 1;
_vm->_sound->playSound(_courtyardBoxSound); _vm->_sound->playEffect(_courtyardBoxSound);
_vm->redrawArea(var); _vm->redrawArea(var);
} }
@ -2714,7 +2714,7 @@ void Myst::clockWheelStartTurn(uint16 wheel) {
uint16 soundId = resource->getList1(0); uint16 soundId = resource->getList1(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
// Turn wheel one step // Turn wheel one step
if (wheel == 1) if (wheel == 1)
@ -2775,9 +2775,9 @@ void Myst::libraryCombinationBookTurnLeft() {
_vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect); _vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect);
if (_vm->_rnd->getRandomBit()) if (_vm->_rnd->getRandomBit())
_vm->_sound->replaceSoundMyst(_libraryBookSound1); _vm->_sound->playEffect(_libraryBookSound1);
else else
_vm->_sound->replaceSoundMyst(_libraryBookSound2); _vm->_sound->playEffect(_libraryBookSound2);
} }
} }
@ -2799,9 +2799,9 @@ void Myst::libraryCombinationBookTurnRight() {
_vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect); _vm->_gfx->copyImageToScreen(_libraryBookBaseImage + _libraryBookPage, rect);
if (_vm->_rnd->getRandomBit()) if (_vm->_rnd->getRandomBit())
_vm->_sound->replaceSoundMyst(_libraryBookSound1); _vm->_sound->playEffect(_libraryBookSound1);
else else
_vm->_sound->replaceSoundMyst(_libraryBookSound2); _vm->_sound->playEffect(_libraryBookSound2);
} }
} }
@ -2834,7 +2834,7 @@ void Myst::o_observatoryChangeSettingStop(uint16 op, uint16 var, uint16 argc, ui
_vm->redrawResource(_observatoryCurrentSlider); _vm->redrawResource(_observatoryCurrentSlider);
_observatoryCurrentSlider = nullptr; _observatoryCurrentSlider = nullptr;
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -2850,12 +2850,12 @@ void Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16 argc, uint16 *arg
if (_dockVaultState) { if (_dockVaultState) {
// Open switch // Open switch
_state.dockMarkerSwitch = 1; _state.dockMarkerSwitch = 1;
_vm->_sound->replaceSoundMyst(4143); _vm->_sound->playEffect(4143);
_vm->redrawArea(4); _vm->redrawArea(4);
// Close vault // Close vault
_dockVaultState = 0; _dockVaultState = 0;
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->redrawArea(41, false); _vm->redrawArea(41, false);
animatedUpdate(directionalUpdateDataSize, &argv[3], delay); animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
} }
@ -2885,7 +2885,7 @@ void Myst::o_clockLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
if (lever->pullLeverV()) { if (lever->pullLeverV()) {
// Start videos for first step // Start videos for first step
if (_clockWeightPosition < 2214) { if (_clockWeightPosition < 2214) {
_vm->_sound->replaceSoundMyst(5113); _vm->_sound->playEffect(5113);
clockGearForwardOneStep(1); clockGearForwardOneStep(1);
// Left lever // Left lever
@ -2947,7 +2947,7 @@ void Myst::clockWeightDownOneStep() {
void Myst::clockGears_run() { void Myst::clockGears_run() {
if (!_vm->_video->isVideoPlaying() && _clockWeightPosition < 2214) { if (!_vm->_video->isVideoPlaying() && _clockWeightPosition < 2214) {
_clockMiddleGearMovedAlone = true; _clockMiddleGearMovedAlone = true;
_vm->_sound->replaceSoundMyst(5113); _vm->_sound->playEffect(5113);
clockGearForwardOneStep(1); clockGearForwardOneStep(1);
clockWeightDownOneStep(); clockWeightDownOneStep();
} }
@ -2968,7 +2968,7 @@ void Myst::o_clockLeverEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv)
} }
if (_clockMiddleGearMovedAlone) if (_clockMiddleGearMovedAlone)
_vm->_sound->replaceSoundMyst(8113); _vm->_sound->playEffect(8113);
// Release lever // Release lever
MystVideoInfo *lever = getInvokingResource<MystVideoInfo>(); MystVideoInfo *lever = getInvokingResource<MystVideoInfo>();
@ -2987,7 +2987,7 @@ void Myst::clockGearsCheckSolution() {
&& !_state.gearsOpen) { && !_state.gearsOpen) {
// Make weight go down // Make weight go down
_vm->_sound->replaceSoundMyst(9113); _vm->_sound->playEffect(9113);
_clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack)); _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack));
if (!_clockWeightVideo) if (!_clockWeightVideo)
error("Failed to open cl1wlfch movie"); error("Failed to open cl1wlfch movie");
@ -2999,16 +2999,16 @@ void Myst::clockGearsCheckSolution() {
_vm->waitUntilMovieEnds(_clockWeightVideo); _vm->waitUntilMovieEnds(_clockWeightVideo);
_clockWeightPosition = 2214; _clockWeightPosition = 2214;
_vm->_sound->replaceSoundMyst(6113); _vm->_sound->playEffect(6113);
_vm->wait(1000); _vm->wait(1000);
_vm->_sound->replaceSoundMyst(7113); _vm->_sound->playEffect(7113);
// Gear opening video // Gear opening video
_vm->playMovieBlocking(_vm->wrapMovieFilename("cl1wggat", kMystStack), 195, 225); _vm->playMovieBlocking(_vm->wrapMovieFilename("cl1wggat", kMystStack), 195, 225);
_state.gearsOpen = 1; _state.gearsOpen = 1;
_vm->redrawArea(40); _vm->redrawArea(40);
_vm->_sound->replaceBackgroundMyst(4113, 16384); _vm->_sound->playBackground(4113, 16384);
} }
} }
@ -3035,8 +3035,8 @@ void Myst::clockReset() {
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_vm->_sound->replaceSoundMyst(5113); _vm->_sound->playEffect(5113);
// Play reset videos // Play reset videos
clockResetWeight(); clockResetWeight();
@ -3051,13 +3051,13 @@ void Myst::clockReset() {
_vm->waitUntilMovieEnds(handle); _vm->waitUntilMovieEnds(handle);
} }
_vm->_sound->replaceSoundMyst(10113); _vm->_sound->playEffect(10113);
// Close gear // Close gear
if (_state.gearsOpen) { if (_state.gearsOpen) {
_vm->_sound->replaceSoundMyst(6113); _vm->_sound->playEffect(6113);
_vm->wait(1000); _vm->wait(1000);
_vm->_sound->replaceSoundMyst(7113); _vm->_sound->playEffect(7113);
// Gear closing movie // Gear closing movie
VideoEntryPtr handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack)); VideoEntryPtr handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack));
@ -3078,7 +3078,7 @@ void Myst::clockReset() {
} }
void Myst::clockResetWeight() { void Myst::clockResetWeight() {
_vm->_sound->replaceSoundMyst(9113); _vm->_sound->playEffect(9113);
_clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack)); _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack));
if (!_clockWeightVideo) if (!_clockWeightVideo)
@ -3145,7 +3145,7 @@ void Myst::o_courtyardBox_init(uint16 op, uint16 var, uint16 argc, uint16 *argv)
void Myst::towerRotationMap_run() { void Myst::towerRotationMap_run() {
if (!_towerRotationMapInitialized) { if (!_towerRotationMapInitialized) {
_towerRotationMapInitialized = true; _towerRotationMapInitialized = true;
_vm->_sound->replaceSoundMyst(4378); _vm->_sound->playEffect(4378);
towerRotationDrawBuildings(); towerRotationDrawBuildings();
@ -3159,7 +3159,7 @@ void Myst::towerRotationMap_run() {
towerRotationMapRotate(); towerRotationMapRotate();
_startTime = time + 100; _startTime = time + 100;
} else if (_towerRotationBlinkLabel } else if (_towerRotationBlinkLabel
&& _vm->_sound->isPlaying(6378)) { && _vm->_sound->isEffectPlaying()) {
// Blink tower rotation label while sound is playing // Blink tower rotation label while sound is playing
_towerRotationBlinkLabelCount = (_towerRotationBlinkLabelCount + 1) % 14; _towerRotationBlinkLabelCount = (_towerRotationBlinkLabelCount + 1) % 14;
@ -3350,19 +3350,19 @@ void Myst::libraryBookcaseTransform_run(void) {
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
// Play transform sound and video // Play transform sound and video
_vm->_sound->replaceSoundMyst(_libraryBookcaseSoundId); _vm->_sound->playEffect(_libraryBookcaseSoundId);
_libraryBookcaseMovie->playMovie(); _libraryBookcaseMovie->playMovie();
if (_state.libraryBookcaseDoor) { if (_state.libraryBookcaseDoor) {
_vm->_gfx->copyImageSectionToBackBuffer(11179, Common::Rect(0, 0, 106, 81), Common::Rect(0, 72, 106, 153)); _vm->_gfx->copyImageSectionToBackBuffer(11179, Common::Rect(0, 0, 106, 81), Common::Rect(0, 72, 106, 153));
_vm->_gfx->runTransition(kTransitionBottomToTop, Common::Rect(0, 72, 106, 153), 5, 10); _vm->_gfx->runTransition(kTransitionBottomToTop, Common::Rect(0, 72, 106, 153), 5, 10);
_vm->playSoundBlocking(7348); _vm->playSoundBlocking(7348);
_vm->_sound->replaceBackgroundMyst(4348, 16384); _vm->_sound->playBackground(4348, 16384);
} else { } else {
_vm->_gfx->copyImageSectionToBackBuffer(11178, Common::Rect(0, 0, 107, 67), Common::Rect(437, 84, 544, 151)); _vm->_gfx->copyImageSectionToBackBuffer(11178, Common::Rect(0, 0, 107, 67), Common::Rect(437, 84, 544, 151));
_vm->_gfx->copyBackBufferToScreen(Common::Rect(437, 84, 544, 151)); _vm->_gfx->copyBackBufferToScreen(Common::Rect(437, 84, 544, 151));
_vm->playSoundBlocking(7348); _vm->playSoundBlocking(7348);
_vm->_sound->replaceBackgroundMyst(4334, 16384); _vm->_sound->playBackground(4334, 16384);
} }
_vm->_cursor->showCursor(); _vm->_cursor->showCursor();
@ -3529,33 +3529,33 @@ void Myst::observatory_run() {
// Make sliders "initialize" // Make sliders "initialize"
if (observatoryIsDDMMYYYY2400()) { if (observatoryIsDDMMYYYY2400()) {
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryDaySlider->drawConditionalDataToScreen(2); _observatoryDaySlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryDaySlider); _vm->redrawResource(_observatoryDaySlider);
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryMonthSlider->drawConditionalDataToScreen(2); _observatoryMonthSlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryMonthSlider); _vm->redrawResource(_observatoryMonthSlider);
} else { } else {
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryMonthSlider->drawConditionalDataToScreen(2); _observatoryMonthSlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryMonthSlider); _vm->redrawResource(_observatoryMonthSlider);
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryDaySlider->drawConditionalDataToScreen(2); _observatoryDaySlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryDaySlider); _vm->redrawResource(_observatoryDaySlider);
} }
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryYearSlider->drawConditionalDataToScreen(2); _observatoryYearSlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryYearSlider); _vm->redrawResource(_observatoryYearSlider);
_vm->_sound->replaceSoundMyst(8500); _vm->_sound->playEffect(8500);
_observatoryTimeSlider->drawConditionalDataToScreen(2); _observatoryTimeSlider->drawConditionalDataToScreen(2);
_vm->wait(200); _vm->wait(200);
_vm->redrawResource(_observatoryTimeSlider); _vm->redrawResource(_observatoryTimeSlider);
@ -3747,8 +3747,8 @@ void Myst::greenBook_run() {
} }
if (_tempVar == 1) { if (_tempVar == 1) {
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
VideoEntryPtr book = _vm->_video->playMovie(file); VideoEntryPtr book = _vm->_video->playMovie(file);
if (!book) if (!book)

View file

@ -87,9 +87,7 @@ void Preview::o_fadeToBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
void Preview::o_fadeFromBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Preview::o_fadeFromBlack(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Fade from black", op); debugC(kDebugScript, "Opcode %d: Fade from black", op);
// FIXME: This glitches when enabled. The backbuffer is drawn to screen, _vm->_gfx->fadeFromBlack();
// and then the fading occurs, causing the background to appear for one frame.
// _vm->_gfx->fadeFromBlack();
} }
void Preview::o_stayHere(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Preview::o_stayHere(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -103,18 +101,18 @@ void Preview::o_stayHere(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
void Preview::o_speechStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Preview::o_speechStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Speech stop", op); debugC(kDebugScript, "Opcode %d: Speech stop", op);
_vm->_sound->stopSound(3001); _vm->_sound->stopSpeech();
_speechRunning = false; _speechRunning = false;
_globals.currentAge = 2; _globals.currentAge = 2;
} }
void Preview::speechUpdateCue() { void Preview::speechUpdateCue() {
// This is a callback in the original, handling audio events. // This is a callback in the original, handling audio events.
if (!_vm->_sound->isPlaying(3001)) { if (!_vm->_sound->isSpeechPlaying()) {
return; return;
} }
uint samples = _vm->_sound->getNumSamplesPlayed(3001); uint samples = _vm->_sound->getSpeechNumSamplesPlayed();
for (int16 i = 0; i < _cueList.pointCount; i++) { for (int16 i = 0; i < _cueList.pointCount; i++) {
if (_cueList.points[i].sampleFrame > samples) if (_cueList.points[i].sampleFrame > samples)
return; return;
@ -134,7 +132,7 @@ void Preview::speech_run() {
switch (_speechStep) { switch (_speechStep) {
case 0: // Start Voice Over... which controls book opening case 0: // Start Voice Over... which controls book opening
_currentCue = 0; _currentCue = 0;
_vm->_sound->playSound(3001, Audio::Mixer::kMaxChannelVolume, false, &_cueList); _vm->_sound->playSpeech(3001, &_cueList);
_speechStep++; _speechStep++;
break; break;

View file

@ -23,9 +23,11 @@
#ifndef MYST_SCRIPTS_PREVIEW_H #ifndef MYST_SCRIPTS_PREVIEW_H
#define MYST_SCRIPTS_PREVIEW_H #define MYST_SCRIPTS_PREVIEW_H
#include "mohawk/sound.h"
#include "mohawk/myst_stacks/myst.h"
#include "common/scummsys.h" #include "common/scummsys.h"
#include "common/util.h" #include "common/util.h"
#include "mohawk/myst_stacks/myst.h"
namespace Mohawk { namespace Mohawk {

View file

@ -561,7 +561,7 @@ void Selenitic::mazeRunnerPlaySoundHelp() {
soundId = 2191; soundId = 2191;
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_mazeRunnerLight->drawConditionalDataToScreen(0); _mazeRunnerLight->drawConditionalDataToScreen(0);
} }
@ -603,17 +603,17 @@ void Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uint16 argc, uint16
} }
_soundReceiverPosition = &_state.soundReceiverPositions[source]; _soundReceiverPosition = &_state.soundReceiverPositions[source];
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_vm->_sound->replaceSoundMyst(2287); _vm->_sound->playEffect(2287);
soundReceiverDrawView(); soundReceiverDrawView();
uint16 soundId = soundReceiverCurrentSound(source, *_soundReceiverPosition); uint16 soundId = soundReceiverCurrentSound(source, *_soundReceiverPosition);
_vm->_sound->replaceBackgroundMyst(soundId); _vm->_sound->playBackground(soundId);
_vm->wait(1000); _vm->wait(1000);
} }
_soundReceiverPosition = oldPosition; _soundReceiverPosition = oldPosition;
_soundReceiverSigmaPressed = true; _soundReceiverSigmaPressed = true;
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_soundReceiverSources[_state.soundReceiverCurrentSource]->drawConditionalDataToScreen(1); _soundReceiverSources[_state.soundReceiverCurrentSource]->drawConditionalDataToScreen(1);
@ -652,7 +652,7 @@ void Selenitic::soundReceiverLeftRight(uint direction) {
else else
_soundReceiverLeftButton->drawConditionalDataToScreen(1); _soundReceiverLeftButton->drawConditionalDataToScreen(1);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
_soundReceiverDirection = direction; _soundReceiverDirection = direction;
_soundReceiverSpeed = 1; _soundReceiverSpeed = 1;
@ -717,11 +717,11 @@ void Selenitic::o_soundReceiverSource(uint16 op, uint16 var, uint16 argc, uint16
_soundReceiverPosition = &_state.soundReceiverPositions[pressedButton]; _soundReceiverPosition = &_state.soundReceiverPositions[pressedButton];
_soundReceiverCurrentSource = _soundReceiverSources[pressedButton]; _soundReceiverCurrentSource = _soundReceiverSources[pressedButton];
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
uint16 soundId = argv[0]; uint16 soundId = argv[0];
_vm->_sound->stopBackgroundMyst(); _vm->_sound->stopBackground();
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_soundReceiverCurrentSource->drawConditionalDataToScreen(1); _soundReceiverCurrentSource->drawConditionalDataToScreen(1);
@ -738,11 +738,11 @@ void Selenitic::o_mazeRunnerDoorButton(uint16 op, uint16 var, uint16 argc, uint1
if (_mazeRunnerPosition == 288) { if (_mazeRunnerPosition == 288) {
_vm->changeToCard(cardIdEntry, kNoTransition); _vm->changeToCard(cardIdEntry, kNoTransition);
_vm->_sound->replaceSoundMyst(cardIdEntry); _vm->_sound->playEffect(cardIdEntry);
animatedUpdate(argv[2], &argv[3], 10); animatedUpdate(argv[2], &argv[3], 10);
} else if (_mazeRunnerPosition == 289) { } else if (_mazeRunnerPosition == 289) {
_vm->changeToCard(cardIdExit, kNoTransition); _vm->changeToCard(cardIdExit, kNoTransition);
_vm->_sound->replaceSoundMyst(cardIdExit); _vm->_sound->playEffect(cardIdExit);
animatedUpdate(argv[2], &argv[3], 10); animatedUpdate(argv[2], &argv[3], 10);
} }
} }
@ -803,7 +803,7 @@ void Selenitic::o_soundLockMove(uint16 op, uint16 var, uint16 argc, uint16 *argv
uint16 soundId = soundLockCurrentSound(slider->_pos.y, true); uint16 soundId = soundLockCurrentSound(slider->_pos.y, true);
if (_soundLockSoundId != soundId) { if (_soundLockSoundId != soundId) {
_soundLockSoundId = soundId; _soundLockSoundId = soundId;
_vm->_sound->replaceSoundMyst(soundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(soundId, true);
} }
} }
@ -813,10 +813,10 @@ void Selenitic::o_soundLockStartMove(uint16 op, uint16 var, uint16 argc, uint16
MystAreaSlider *slider = soundLockSliderFromVar(var); MystAreaSlider *slider = soundLockSliderFromVar(var);
_vm->_cursor->setCursor(700); _vm->_cursor->setCursor(700);
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
_soundLockSoundId = soundLockCurrentSound(slider->_pos.y, true); _soundLockSoundId = soundLockCurrentSound(slider->_pos.y, true);
_vm->_sound->replaceSoundMyst(_soundLockSoundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(_soundLockSoundId, true);
} }
void Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -861,21 +861,21 @@ void Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint16 argc, uint16 *a
uint16 soundId = slider->getList3(0); uint16 soundId = slider->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} }
void Selenitic::soundLockCheckSolution(MystAreaSlider *slider, uint16 value, uint16 solution, bool &solved) { void Selenitic::soundLockCheckSolution(MystAreaSlider *slider, uint16 value, uint16 solution, bool &solved) {
slider->drawConditionalDataToScreen(2); slider->drawConditionalDataToScreen(2);
_vm->_sound->replaceSoundMyst(soundLockCurrentSound(value / 12, false)); _vm->_sound->playEffect(soundLockCurrentSound(value / 12, false));
_vm->wait(1500); _vm->wait(1500);
if (value / 12 != solution) if (value / 12 != solution)
solved = false; solved = false;
slider->drawConditionalDataToScreen(1); slider->drawConditionalDataToScreen(1);
_vm->_sound->stopSound(); _vm->_sound->stopEffect();
} }
void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -883,8 +883,8 @@ void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *ar
bool solved = true; bool solved = true;
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
_vm->_sound->replaceSoundMyst(1147); _vm->_sound->playEffect(1147);
_soundLockButton->drawConditionalDataToScreen(1); _soundLockButton->drawConditionalDataToScreen(1);
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
@ -894,8 +894,8 @@ void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *ar
soundLockCheckSolution(_soundLockSlider4, _state.soundLockSliderPositions[3], 6, solved); soundLockCheckSolution(_soundLockSlider4, _state.soundLockSliderPositions[3], 6, solved);
soundLockCheckSolution(_soundLockSlider5, _state.soundLockSliderPositions[4], 7, solved); soundLockCheckSolution(_soundLockSlider5, _state.soundLockSliderPositions[4], 7, solved);
_vm->_sound->replaceSoundMyst(1148); _vm->_sound->playEffect(1148);
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
if (solved) { if (solved) {
_soundLockButton->drawConditionalDataToScreen(2); _soundLockButton->drawConditionalDataToScreen(2);
@ -906,7 +906,7 @@ void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *ar
_vm->changeToCard(cardIdClosed, kTransitionDissolve); _vm->changeToCard(cardIdClosed, kTransitionDissolve);
_vm->changeToCard(cardIdOpen, kNoTransition); _vm->changeToCard(cardIdOpen, kNoTransition);
_vm->_sound->replaceSoundMyst(argv[2]); _vm->_sound->playEffect(argv[2]);
animatedUpdate(argv[4], &argv[5], argv[3]); animatedUpdate(argv[4], &argv[5], argv[3]);
} else { } else {
@ -982,7 +982,7 @@ void Selenitic::soundReceiverIncreaseSpeed() {
void Selenitic::soundReceiverUpdateSound() { void Selenitic::soundReceiverUpdateSound() {
uint16 soundId = soundReceiverCurrentSound(_state.soundReceiverCurrentSource, *_soundReceiverPosition); uint16 soundId = soundReceiverCurrentSound(_state.soundReceiverCurrentSource, *_soundReceiverPosition);
_vm->_sound->replaceBackgroundMyst(soundId); _vm->_sound->playBackground(soundId);
} }
uint16 Selenitic::soundReceiverCurrentSound(uint16 source, uint16 position) { uint16 Selenitic::soundReceiverCurrentSound(uint16 source, uint16 position) {

View file

@ -494,7 +494,7 @@ void Stoneship::o_generatorStart(uint16 op, uint16 var, uint16 argc, uint16 *arg
uint16 soundId = handle->getList1(0); uint16 soundId = handle->getList1(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
if (_state.generatorDuration) if (_state.generatorDuration)
_state.generatorDuration -= _vm->_system->getMillis() - _state.generatorDepletionTime; _state.generatorDuration -= _vm->_system->getMillis() - _state.generatorDepletionTime;
@ -510,7 +510,7 @@ void Stoneship::o_generatorStart(uint16 op, uint16 var, uint16 argc, uint16 *arg
soundId = handle->getList2(0); soundId = handle->getList2(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(soundId, true);
} }
void Stoneship::o_generatorStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Stoneship::o_generatorStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -537,7 +537,7 @@ void Stoneship::o_generatorStop(uint16 op, uint16 var, uint16 argc, uint16 *argv
uint16 soundId = handle->getList3(0); uint16 soundId = handle->getList3(0);
if (soundId) if (soundId)
_vm->_sound->replaceSoundMyst(soundId); _vm->_sound->playEffect(soundId);
} }
void Stoneship::chargeBattery_run() { void Stoneship::chargeBattery_run() {
@ -674,7 +674,7 @@ void Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *a
Common::String movie = _vm->wrapMovieFilename("ligspig", kStoneshipStack); Common::String movie = _vm->wrapMovieFilename("ligspig", kStoneshipStack);
_vm->_sound->playSound(2132); _vm->_sound->playEffect(2132);
if (_state.chestValveState) { if (_state.chestValveState) {
// Valve closing // Valve closing
@ -695,7 +695,7 @@ void Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *a
valve->setBounds(Audio::Timestamp(0, 350, 600), Audio::Timestamp(0, 650, 600)); valve->setBounds(Audio::Timestamp(0, 350, 600), Audio::Timestamp(0, 650, 600));
_vm->waitUntilMovieEnds(valve); _vm->waitUntilMovieEnds(valve);
_vm->_sound->playSound(3132); _vm->_sound->playEffect(3132);
for (uint i = 0; i < 25; i++) { for (uint i = 0; i < 25; i++) {
valve = _vm->_video->playMovie(movie); valve = _vm->_video->playMovie(movie);
@ -707,7 +707,7 @@ void Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *a
_vm->waitUntilMovieEnds(valve); _vm->waitUntilMovieEnds(valve);
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
} else { } else {
// Valve opening // Valve opening
VideoEntryPtr valve = _vm->_video->playMovie(movie); VideoEntryPtr valve = _vm->_video->playMovie(movie);
@ -745,7 +745,7 @@ void Stoneship::o_trapLockOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv)
lock->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 750, 600)); lock->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 750, 600));
_vm->waitUntilMovieEnds(lock); _vm->waitUntilMovieEnds(lock);
_vm->_sound->playSound(2143); _vm->_sound->playEffect(2143);
lock = _vm->_video->playMovie(movie); lock = _vm->_video->playMovie(movie);
if (!lock) if (!lock)
@ -756,7 +756,7 @@ void Stoneship::o_trapLockOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv)
_vm->waitUntilMovieEnds(lock); _vm->waitUntilMovieEnds(lock);
if (_state.pumpState != 4) if (_state.pumpState != 4)
_vm->_sound->playSound(4143); _vm->_sound->playEffect(4143);
} }
void Stoneship::o_sideDoorsMovies(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Stoneship::o_sideDoorsMovies(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@ -767,7 +767,7 @@ void Stoneship::o_sideDoorsMovies(uint16 op, uint16 var, uint16 argc, uint16 *ar
debugC(kDebugScript, "\tmovieId: %d", movieId); debugC(kDebugScript, "\tmovieId: %d", movieId);
_vm->_cursor->hideCursor(); _vm->_cursor->hideCursor();
_vm->_sound->pauseBackgroundMyst(); _vm->_sound->pauseBackground();
switch (movieId) { switch (movieId) {
case 0: case 0:
@ -791,14 +791,14 @@ void Stoneship::o_sideDoorsMovies(uint16 op, uint16 var, uint16 argc, uint16 *ar
break; break;
} }
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackground();
_vm->_cursor->showCursor(); _vm->_cursor->showCursor();
} }
void Stoneship::o_cloudOrbEnter(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Stoneship::o_cloudOrbEnter(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Cloud orb enter", op); debugC(kDebugScript, "Opcode %d: Cloud orb enter", op);
_vm->_sound->replaceSoundMyst(_cloudOrbSound, Audio::Mixer::kMaxChannelVolume, true); _vm->_sound->playEffect(_cloudOrbSound, true);
_cloudOrbMovie->playMovie(); _cloudOrbMovie->playMovie();
} }
@ -806,7 +806,7 @@ void Stoneship::o_cloudOrbLeave(uint16 op, uint16 var, uint16 argc, uint16 *argv
debugC(kDebugScript, "Opcode %d: Cloud orb leave", op); debugC(kDebugScript, "Opcode %d: Cloud orb leave", op);
_cloudOrbMovie->pauseMovie(true); _cloudOrbMovie->pauseMovie(true);
_vm->_sound->replaceSoundMyst(_cloudOrbStopSound); _vm->_sound->playEffect(_cloudOrbStopSound);
_vm->_gfx->runTransition(kTransitionTopToBottom, getInvokingResource<MystArea>()->getRect(), 4, 0); _vm->_gfx->runTransition(kTransitionTopToBottom, getInvokingResource<MystArea>()->getRect(), 4, 0);
} }
@ -920,7 +920,7 @@ void Stoneship::tunnel_run() {
_vm->_gfx->copyImageToScreen(_tunnelImages[1], Common::Rect(544, 333)); _vm->_gfx->copyImageToScreen(_tunnelImages[1], Common::Rect(544, 333));
} }
_vm->_sound->replaceSoundMyst(_tunnelAlarmSound); _vm->_sound->playEffect(_tunnelAlarmSound);
// Draw tunnel dark // Draw tunnel dark
if (_tunnelImagesCount) { if (_tunnelImagesCount) {