aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/pregob/pregob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/pregob/pregob.cpp')
-rw-r--r--engines/gob/pregob/pregob.cpp50
1 files changed, 39 insertions, 11 deletions
diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp
index f39a7a112e..675958035d 100644
--- a/engines/gob/pregob/pregob.cpp
+++ b/engines/gob/pregob/pregob.cpp
@@ -151,23 +151,28 @@ void PreGob::loadSounds(const char * const *sounds, uint soundCount) {
_sounds.resize(soundCount);
- for (uint i = 0; i < soundCount; i++) {
- int32 size;
- byte *data = _vm->_dataIO->getFile(sounds[i], size);
-
- if (!data || !_sounds[i].load(SOUND_SND, data, size)) {
- delete data;
-
- warning("PreGob::loadSounds(): Failed to load sound \"%s\"", sounds[i]);
- continue;
- }
- }
+ for (uint i = 0; i < soundCount; i++)
+ loadSound(_sounds[i], sounds[i]);
}
void PreGob::freeSounds() {
_sounds.clear();
}
+bool PreGob::loadSound(SoundDesc &sound, const Common::String &file) const {
+ int32 size;
+ byte *data = _vm->_dataIO->getFile(file, size);
+
+ if (!data || !sound.load(SOUND_SND, data, size)) {
+ delete data;
+
+ warning("PreGob::loadSound(): Failed to load sound \"%s\"", file.c_str());
+ return false;
+ }
+
+ return true;
+}
+
void PreGob::playSound(uint sound, int16 frequency, int16 repCount) {
if (sound >= _sounds.size())
return;
@@ -179,6 +184,29 @@ void PreGob::stopSound() {
_vm->_sound->blasterStop(0);
}
+void PreGob::playSoundFile(const Common::String &file, int16 frequency, int16 repCount, bool interruptible) {
+ stopSound();
+
+ SoundDesc sound;
+ if (!loadSound(sound, file))
+ return;
+
+ _vm->_sound->blasterPlay(&sound, repCount, frequency);
+
+ _vm->_util->forceMouseUp();
+
+ bool finished = false;
+ while (!_vm->shouldQuit() && !finished && _vm->_sound->blasterPlayingSound()) {
+ endFrame(true);
+
+ finished = hasInput();
+ }
+
+ _vm->_util->forceMouseUp();
+
+ stopSound();
+}
+
void PreGob::endFrame(bool doInput) {
_vm->_draw->blitInvalidated();
_vm->_util->waitEndFrame();