aboutsummaryrefslogtreecommitdiff
path: root/engines/mortevielle
diff options
context:
space:
mode:
authorStrangerke2013-08-04 10:45:32 +0200
committerStrangerke2013-08-04 10:46:10 +0200
commitc1f93815ee9d41d4e505dde87fdd503f94e31dae (patch)
treea319aef68ea27ad132345f559d864ec974d7758d /engines/mortevielle
parent2af07d5d8e5b4312af154b7b66dbc66fb1e78a03 (diff)
downloadscummvm-rg350-c1f93815ee9d41d4e505dde87fdd503f94e31dae.tar.gz
scummvm-rg350-c1f93815ee9d41d4e505dde87fdd503f94e31dae.tar.bz2
scummvm-rg350-c1f93815ee9d41d4e505dde87fdd503f94e31dae.zip
MORTEVIELLE: Compute real buffer size in order to avoid ticks at the end of the song
Diffstat (limited to 'engines/mortevielle')
-rw-r--r--engines/mortevielle/sound.cpp12
-rw-r--r--engines/mortevielle/sound.h2
-rw-r--r--engines/mortevielle/utils.cpp4
3 files changed, 14 insertions, 4 deletions
diff --git a/engines/mortevielle/sound.cpp b/engines/mortevielle/sound.cpp
index 76495c6658..3cb5284494 100644
--- a/engines/mortevielle/sound.cpp
+++ b/engines/mortevielle/sound.cpp
@@ -148,11 +148,13 @@ SoundManager::~SoundManager() {
/**
* Decode music data
*/
-void SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) {
+int SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) {
static const int tab[16] = { -96, -72, -48, -32, -20, -12, -8, -4, 0, 4, 8, 12, 20, 32, 48, 72 };
uint seed = 128;
int v;
+ int decompSize = 0;
+ int skipSize = 0;
for (int idx1 = 0; idx1 < size; ++idx1) {
byte srcByte = *PSrc++;
@@ -163,7 +165,15 @@ void SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) {
v = tab[srcByte & 0xf];
seed += v;
*PDest++ = seed & 0xff;
+
+ if (srcByte == 0)
+ skipSize += 2;
+ else {
+ decompSize += skipSize + 2;
+ skipSize = 0;
+ }
}
+ return decompSize;
}
void SoundManager::litph(tablint &t, int typ, int tempo) {
diff --git a/engines/mortevielle/sound.h b/engines/mortevielle/sound.h
index c1df98e937..313859dacf 100644
--- a/engines/mortevielle/sound.h
+++ b/engines/mortevielle/sound.h
@@ -105,7 +105,7 @@ public:
void setParent(MortevielleEngine *vm);
void playNote(int frequency, int32 length);
- void decodeMusic(const byte *PSrc, byte *PDest, int size);
+ int decodeMusic(const byte *PSrc, byte *PDest, int size);
void playSong(const byte *buf, int size);
void litph(tablint &t, int typ, int tempo);
diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp
index b729d5951e..d5dc678a72 100644
--- a/engines/mortevielle/utils.cpp
+++ b/engines/mortevielle/utils.cpp
@@ -2207,7 +2207,7 @@ void MortevielleEngine::music() {
f.read(compMusicBuf, size);
f.close();
- _soundManager.decodeMusic(compMusicBuf, musicBuf, size);
+ int musicSize = _soundManager.decodeMusic(compMusicBuf, musicBuf, size);
free(compMusicBuf);
_addFix = (float)((kTempoMusic - 8)) / 256;
@@ -2217,7 +2217,7 @@ void MortevielleEngine::music() {
int k = 0;
do {
fin = keyPressed();
- _soundManager.playSong(musicBuf, size * 2);
+ _soundManager.playSong(musicBuf, musicSize);
++k;
fin = fin | keyPressed() | (k >= 5);
} while (!fin);