aboutsummaryrefslogtreecommitdiff
path: root/sword1/music.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sword1/music.cpp')
-rw-r--r--sword1/music.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/sword1/music.cpp b/sword1/music.cpp
index e4dfa33d84..9e8bcee336 100644
--- a/sword1/music.cpp
+++ b/sword1/music.cpp
@@ -25,8 +25,8 @@
#include "common/util.h"
#include "common/file.h"
-// This means fading takes about half a second. This may need some tuning...
-#define FADE_SAMPLES 5512
+// This means fading takes 3 seconds.
+#define FADE_LENGTH 3
// These functions are only called from SwordMusic, so I'm just going to
// assume that if locking is needed it has already been taken care of.
@@ -35,14 +35,16 @@ void SwordMusicHandle::fadeDown() {
if (_fading < 0)
_fading = -_fading;
else if (_fading == 0)
- _fading = FADE_SAMPLES;
+ _fading = FADE_LENGTH * getRate();
+ _fadeSamples = FADE_LENGTH * getRate();
}
void SwordMusicHandle::fadeUp() {
if (_fading > 0)
_fading = -_fading;
else if (_fading == 0)
- _fading = -FADE_SAMPLES;
+ _fading = -(FADE_LENGTH * getRate());
+ _fadeSamples = FADE_LENGTH * getRate();
}
bool SwordMusicHandle::endOfData() const {
@@ -74,10 +76,10 @@ int16 SwordMusicHandle::read() {
_looping = false;
_file.close();
}
- sample = (sample * _fading) / FADE_SAMPLES;
+ sample = (sample * _fading) / _fadeSamples;
} else if (_fading < 0) {
_fading++;
- sample = (sample * (FADE_SAMPLES + _fading)) / FADE_SAMPLES;
+ sample = (sample * (_fadeSamples + _fading)) / _fadeSamples;
}
return sample;
}
@@ -153,9 +155,14 @@ void SwordMusic::startMusic(int32 tuneId, int32 loopFlag) {
}
char fName[20];
sprintf(fName, "music/%s.wav", _tuneList[tuneId]);
- _handles[newStream].play(fName, loopFlag);
+ _handles[newStream].play(fName, loopFlag != 0);
delete _converter[newStream];
_converter[newStream] = makeRateConverter(_handles[newStream].getRate(), _mixer->getOutputRate(), _handles[newStream].isStereo(), false);
+ } else {
+ if (_handles[0].streaming())
+ _handles[0].fadeDown();
+ if (_handles[1].streaming())
+ _handles[1].fadeDown();
}
}