aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/sfx/audio.h3
-rw-r--r--engines/sci/sfx/music.cpp41
2 files changed, 36 insertions, 8 deletions
diff --git a/engines/sci/sfx/audio.h b/engines/sci/sfx/audio.h
index 82b5896499..febe77cefc 100644
--- a/engines/sci/sfx/audio.h
+++ b/engines/sci/sfx/audio.h
@@ -63,6 +63,7 @@ public:
void setAudioRate(uint16 rate) { _audioRate = rate; }
Audio::SoundHandle* getAudioHandle() { return &_audioHandle; }
+ Audio::AudioStream* getAudioStream(uint32 number, uint32 volume, int *sampleLen);
int getAudioPosition();
int startAudio(uint16 module, uint32 tuple);
void stopAudio();
@@ -88,8 +89,6 @@ private:
Resource *_syncResource; /**< Used by kDoSync for speech syncing in CD talkie games */
uint _syncOffset;
uint32 _audioCdStart;
-
- Audio::AudioStream* getAudioStream(uint32 number, uint32 volume, int *sampleLen);
};
} // End of namespace Sci
diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp
index 60c4436cd1..f919fc8fdc 100644
--- a/engines/sci/sfx/music.cpp
+++ b/engines/sci/sfx/music.cpp
@@ -321,13 +321,42 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
pSnd->pStreamAud = Audio::makeLinearInputStream(pdata + 8, size, rate,
Audio::Mixer::FLAG_UNSIGNED, 0, 0);
pSnd->hCurrentAud = Audio::SoundHandle();
- } else {// play MIDI track
- if (pSnd->pMidiParser == NULL) {
- pSnd->pMidiParser = new MidiParser_SCI();
- pSnd->pMidiParser->setMidiDriver(_pMidiDrv);
- pSnd->pMidiParser->setTimerRate(_dwTempo);
+ } else {
+ // In SCI1.1 games, sound effects are started from here. If we can find
+ // a relevant audio resource, play it, otherwise switch to synthesized
+ // effects. If the resource exists, play it using map 65535 (sound
+ // effects map)
+ int16 songNumber = GET_SEL32V(_segMan, pSnd->soundObj, number);
+ EngineState *s = ((SciEngine *)g_engine)->getEngineState(); // HACK
+ AudioPlayer *audio = s->_audio;
+ ResourceManager* resMan = s->resMan;
+
+ if (resMan->testResource(ResourceId(kResourceTypeAudio, songNumber)) &&
+ getSciVersion() >= SCI_VERSION_1_1) {
+ // Found a relevant audio resource, play it
+ audio->stopAudio();
+
+ if (pSnd->pStreamAud)
+ delete pSnd->pStreamAud;
+ int sampleLen;
+ pSnd->pStreamAud = audio->getAudioStream(songNumber, 65535, &sampleLen);
+ pSnd->hCurrentAud = Audio::SoundHandle();
+
+ PUT_SEL32V(_segMan, pSnd->soundObj, signal, 0);
+
+ // FIXME: the scripts are signalled that the sound has stopped before it has
+ // actually stopped, observable in the ship flight sequence in the first scene
+ // of SQ4CD, right after the intro
+ soundPlay(pSnd);
+ } else {
+ // play MIDI track
+ if (pSnd->pMidiParser == NULL) {
+ pSnd->pMidiParser = new MidiParser_SCI();
+ pSnd->pMidiParser->setMidiDriver(_pMidiDrv);
+ pSnd->pMidiParser->setTimerRate(_dwTempo);
+ }
+ pSnd->pMidiParser->loadMusic(pTrack, pSnd);
}
- pSnd->pMidiParser->loadMusic(pTrack, pSnd);
}
}