diff options
author | Martin Kiewitz | 2010-01-01 22:15:52 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-01-01 22:15:52 +0000 |
commit | 0a965ced69bbc28ce16e9ae4e80a74a60f95a5e1 (patch) | |
tree | 4de749aae1904dc03366f7728bda9a0ff1841747 /engines/sci/sfx | |
parent | 671cc15bd1b4f56b95eccb68b792d369b4534d18 (diff) | |
download | scummvm-rg350-0a965ced69bbc28ce16e9ae4e80a74a60f95a5e1.tar.gz scummvm-rg350-0a965ced69bbc28ce16e9ae4e80a74a60f95a5e1.tar.bz2 scummvm-rg350-0a965ced69bbc28ce16e9ae4e80a74a60f95a5e1.zip |
SCI/newmusic: changed setting volume from fade logic, implemented updating loop selector for sound fx
svn-id: r46856
Diffstat (limited to 'engines/sci/sfx')
-rw-r--r-- | engines/sci/sfx/music.cpp | 11 | ||||
-rw-r--r-- | engines/sci/sfx/music.h | 2 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.cpp | 14 |
3 files changed, 19 insertions, 8 deletions
diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index 8a5f55f7c0..01771935c0 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -359,9 +359,8 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { void SciMusic::onTimer() { const MusicList::iterator end = _playList.end(); - for (MusicList::iterator i = _playList.begin(); i != end; ++i) { + for (MusicList::iterator i = _playList.begin(); i != end; ++i) (*i)->onTimer(_soundVersion); - } } void SciMusic::soundPlay(MusicEntry *pSnd) { @@ -521,11 +520,13 @@ MusicEntry::MusicEntry() { hold = 0; pauseCounter = 0; + sampleLoopCounter = 0; fadeTo = 0; fadeStep = 0; fadeTicker = 0; fadeTickerStep = 0; + fadeVolumeSet = false; status = kSoundStopped; @@ -542,6 +543,7 @@ void MusicEntry::onTimer(SciVersion soundVersion) { if (status != kSoundPlaying) return; + // Fade MIDI and digital sound effects if (fadeStep) doFade(); @@ -569,9 +571,8 @@ void MusicEntry::doFade() { // Only process MIDI streams in this thread, not digital sound effects if (pMidiParser) pMidiParser->setVolume(volume); - // TODO: create onTimer within audio.cpp to do the handling there, if we do it in cmdUpdateCues it wont - // work right, because the last volume set won't get done at all. Also we are fading digital sound effects - // currently here in any case currently. Fade code should get moved to void SciMusic::onTimer() + if (pStreamAud) + fadeVolumeSet = true; // set flag so that SoundCommandParser::cmdUpdateCues will set the volume of the stream } } diff --git a/engines/sci/sfx/music.h b/engines/sci/sfx/music.h index f1202ab822..a1458b234c 100644 --- a/engines/sci/sfx/music.h +++ b/engines/sci/sfx/music.h @@ -87,11 +87,13 @@ public: byte hold; int16 pauseCounter; + uint sampleLoopCounter; byte fadeTo; short fadeStep; uint32 fadeTicker; uint32 fadeTickerStep; + bool fadeVolumeSet; SoundStatus status; diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp index 12c909493b..3c1f9b62ef 100644 --- a/engines/sci/sfx/soundcmd.cpp +++ b/engines/sci/sfx/soundcmd.cpp @@ -775,7 +775,12 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { Audio::Mixer *mixer = g_system->getMixer(); if (musicSlot->pStreamAud) { - + uint currentLoopCounter = musicSlot->pStreamAud->getNumPlayedLoops(); + if (currentLoopCounter != musicSlot->sampleLoopCounter) { + // during last time we looped at least one time, update loop accordingly + musicSlot->loop -= currentLoopCounter - musicSlot->sampleLoopCounter; + musicSlot->sampleLoopCounter = currentLoopCounter; + } // TODO: We need to update loop selector here, when sample is looping if (!mixer->isSoundHandleActive(musicSlot->hCurrentAud)) { musicSlot->ticker = SIGNAL_OFFSET; @@ -784,8 +789,11 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { } else { musicSlot->ticker = (uint16)(mixer->getSoundElapsedTime(musicSlot->hCurrentAud) * 0.06); } - if (musicSlot->fadeStep) - mixer->setChannelVolume(musicSlot->hCurrentAud, musicSlot->volume); + // We get a flag from MusicEntry::doFade() here to set volume for the stream + if (musicSlot->fadeVolumeSet) { + mixer->setChannelVolume(musicSlot->hCurrentAud, musicSlot->volume); + musicSlot->fadeVolumeSet = false; + } } _music->_mutex.lock(); // and lock again |