diff options
author | Martin Kiewitz | 2010-01-01 13:21:30 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-01-01 13:21:30 +0000 |
commit | 7cf1d5bd5df915fe0f26182b1c2d696ca8d11a34 (patch) | |
tree | 46c37c29988ef633d7678387d743abf03fdc2f34 | |
parent | ea86c41cc535b066b222a883cba4a9cf17697d6b (diff) | |
download | scummvm-rg350-7cf1d5bd5df915fe0f26182b1c2d696ca8d11a34.tar.gz scummvm-rg350-7cf1d5bd5df915fe0f26182b1c2d696ca8d11a34.tar.bz2 scummvm-rg350-7cf1d5bd5df915fe0f26182b1c2d696ca8d11a34.zip |
SCI/newmusic: added fade and loop capability to samples (looping doesnt work yet), fixes lsl1 doll inflation endless loop
svn-id: r46820
-rw-r--r-- | engines/sci/sfx/music.cpp | 21 | ||||
-rw-r--r-- | engines/sci/sfx/music.h | 2 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.cpp | 2 |
3 files changed, 20 insertions, 5 deletions
diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index d185334359..9d01c2266e 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -377,6 +377,13 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { _mutex.unlock(); if (pSnd->pStreamAud && !_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) { + SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK + uint16 loop = GET_SEL32V(segMan, pSnd->soundObj, loop); + // Are we supposed to loop the stream? + if (loop > 1) + pSnd->pStreamAud->setNumLoops(loop); + else + pSnd->pStreamAud->setNumLoops(1); _pMixer->playInputStream(Audio::Mixer::kSFXSoundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, pSnd->volume, 0, false); } else if (pSnd->pMidiParser) { @@ -529,12 +536,15 @@ MusicEntry::~MusicEntry() { void MusicEntry::onTimer(SciVersion soundVersion, Audio::Mixer *mixer) { if (status != kSoundPlaying) return; + + if (fadeStep) + doFade(mixer); + if (pMidiParser) { - if (fadeStep) - doFade(); pMidiParser->onTimer(); ticker = (uint16)pMidiParser->getTick(); } else if (pStreamAud) { + // TODO: We need to update loop selector here, when sample is looping if (!mixer->isSoundHandleActive(hCurrentAud)) { ticker = SIGNAL_OFFSET; signal = SIGNAL_OFFSET; @@ -545,7 +555,7 @@ void MusicEntry::onTimer(SciVersion soundVersion, Audio::Mixer *mixer) { } } -void MusicEntry::doFade() { +void MusicEntry::doFade(Audio::Mixer *mixer) { if (fadeTicker) fadeTicker--; else { @@ -557,7 +567,10 @@ void MusicEntry::doFade() { signal = SIGNAL_OFFSET; } - pMidiParser->setVolume(volume); + if (pMidiParser) + pMidiParser->setVolume(volume); + if (pStreamAud) + mixer->setChannelVolume(hCurrentAud, volume); } } diff --git a/engines/sci/sfx/music.h b/engines/sci/sfx/music.h index 8eca6bb483..f1d5edf53c 100644 --- a/engines/sci/sfx/music.h +++ b/engines/sci/sfx/music.h @@ -103,7 +103,7 @@ public: MusicEntry(); ~MusicEntry(); - void doFade(); + void doFade(Audio::Mixer *mixer); void onTimer(SciVersion soundVersion, Audio::Mixer *mixer); #ifndef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp index 02951d7e8b..4316192dbd 100644 --- a/engines/sci/sfx/soundcmd.cpp +++ b/engines/sci/sfx/soundcmd.cpp @@ -400,6 +400,8 @@ void SoundCommandParser::cmdPlayHandle(reg_t obj, int16 value) { // Find slot again :) musicSlot = _music->getSlot(obj); } + int16 loop = GET_SEL32V(_segMan, obj, loop); + debugC(2, kDebugLevelSound, "cmdPlayHandle: resource number %d, loop %d", number, loop); PUT_SEL32(_segMan, obj, handle, obj); |