[Scummvm-cvs-logs] SF.net SVN: scummvm: [31644] scummvm/trunk/engines/made
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Mon Apr 21 18:52:10 CEST 2008
Revision: 31644
http://scummvm.svn.sourceforge.net/scummvm/?rev=31644&view=rev
Author: thebluegr
Date: 2008-04-21 09:52:09 -0700 (Mon, 21 Apr 2008)
Log Message:
-----------
Performed some optimizations to the PMV player
Modified Paths:
--------------
scummvm/trunk/engines/made/pmvplayer.cpp
scummvm/trunk/engines/made/sound.cpp
Modified: scummvm/trunk/engines/made/pmvplayer.cpp
===================================================================
--- scummvm/trunk/engines/made/pmvplayer.cpp 2008-04-21 14:00:39 UTC (rev 31643)
+++ scummvm/trunk/engines/made/pmvplayer.cpp 2008-04-21 16:52:09 UTC (rev 31644)
@@ -41,18 +41,25 @@
_mixer->stopAll();
- _audioStream = Audio::makeAppendableAudioStream(soundFreq, Audio::Mixer::FLAG_UNSIGNED);
- _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, _audioStream);
-
// Read palette
_fd->read(_palette, 768);
updatePalette();
uint32 frameCount = 0;
+ uint16 chunkCount = 0;
+ uint32 soundSize = 0;
+ uint32 palChunkOfs = 0;
+ uint32 palSize = 0;
+ byte *frameData, *audioData, *soundData, *palData, *imageData;
+ bool firstTime = true;
+ uint32 frameNum;
+ uint16 width, height, cmdOffs, pixelOffs, maskOffs, lineSize;
+
// TODO: Sound can still be a little choppy. A bug in the decoder or -
// perhaps more likely - do we have to implement double buffering to
// get it to work well?
+ _audioStream = Audio::makeAppendableAudioStream(soundFreq, Audio::Mixer::FLAG_UNSIGNED);
while (!_abort && !_fd->eof()) {
@@ -61,42 +68,41 @@
if (_fd->eof())
break;
- byte *frameData = new byte[chunkSize];
+ frameData = new byte[chunkSize];
_fd->read(frameData, chunkSize);
// Handle audio
- byte *audioData = frameData + READ_LE_UINT32(frameData + 8) - 8;
+ audioData = frameData + READ_LE_UINT32(frameData + 8) - 8;
chunkSize = READ_LE_UINT16(audioData + 4);
- uint16 chunkCount = READ_LE_UINT16(audioData + 6);
+ chunkCount = READ_LE_UINT16(audioData + 6);
if (chunkCount > 50) break; // FIXME: this is a hack
debug(2, "chunkCount = %d; chunkSize = %d\n", chunkCount, chunkSize);
- uint32 soundSize = chunkCount * chunkSize;
- byte *soundData = new byte[soundSize];
+ soundSize = chunkCount * chunkSize;
+ soundData = new byte[soundSize];
decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
_audioStream->queueBuffer(soundData, soundSize);
// Handle palette
- uint32 palChunkOfs = READ_LE_UINT32(frameData + 16);
+ palChunkOfs = READ_LE_UINT32(frameData + 16);
if (palChunkOfs) {
- byte *palData = frameData + palChunkOfs - 8;
- uint32 palSize = READ_LE_UINT32(palData + 4);
+ palData = frameData + palChunkOfs - 8;
+ palSize = READ_LE_UINT32(palData + 4);
decompressPalette(palData + 8, _palette, palSize);
- updatePalette();
}
// Handle video
- byte *imageData = frameData + READ_LE_UINT32(frameData + 12) - 8;
+ imageData = frameData + READ_LE_UINT32(frameData + 12) - 8;
- uint32 frameNum = READ_LE_UINT32(frameData);
- uint16 width = READ_LE_UINT16(imageData + 8);
- uint16 height = READ_LE_UINT16(imageData + 10);
- uint16 cmdOffs = READ_LE_UINT16(imageData + 12);
- uint16 pixelOffs = READ_LE_UINT16(imageData + 16);
- uint16 maskOffs = READ_LE_UINT16(imageData + 20);
- uint16 lineSize = READ_LE_UINT16(imageData + 24);
+ frameNum = READ_LE_UINT32(frameData);
+ width = READ_LE_UINT16(imageData + 8);
+ height = READ_LE_UINT16(imageData + 10);
+ cmdOffs = READ_LE_UINT16(imageData + 12);
+ pixelOffs = READ_LE_UINT16(imageData + 16);
+ maskOffs = READ_LE_UINT16(imageData + 20);
+ lineSize = READ_LE_UINT16(imageData + 24);
debug(2, "width = %d; height = %d; cmdOffs = %04X; pixelOffs = %04X; maskOffs = %04X; lineSize = %d\n",
width, height, cmdOffs, pixelOffs, maskOffs, lineSize);
@@ -107,14 +113,20 @@
}
decompressImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize, frameNum > 0);
+
+ if (firstTime) {
+ _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, _audioStream);
+ firstTime = false;
+ }
- delete[] frameData;
-
+ updatePalette();
handleEvents();
updateScreen();
frameCount++;
+ delete[] frameData;
+
while (_mixer->getSoundElapsedTime(_audioStreamHandle) < frameCount * frameDelay) {
_system->delayMillis(10);
}
Modified: scummvm/trunk/engines/made/sound.cpp
===================================================================
--- scummvm/trunk/engines/made/sound.cpp 2008-04-21 14:00:39 UTC (rev 31643)
+++ scummvm/trunk/engines/made/sound.cpp 2008-04-21 16:52:09 UTC (rev 31644)
@@ -32,24 +32,35 @@
void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCount) {
- int16 prevSample = 0;
+ int16 prevSample = 0, workSample = 0;
byte soundBuffer[1025];
byte soundBuffer3[1024];
int16 soundBuffer2[16];
+ byte deltaType, type;
+ uint16 workChunkSize, byteCount, bitCount;
+ byte bitMask, bitShift;
+ uint16 ofs = 0;
+ uint16 i = 0, l = 0;
+ byte val;
+ const int modeValues[3][4] = {
+ { 2, 8, 0x01, 1},
+ { 4, 4, 0x03, 2},
+ {16, 2, 0x0F, 4}
+ };
+
while (chunkCount--) {
+ deltaType = (*source) >> 6;
+ workChunkSize = chunkSize;
- byte deltaType = (*source) >> 6;
-
- uint16 workChunkSize = chunkSize;
if (deltaType == 1)
workChunkSize /= 2;
else if (deltaType == 2)
workChunkSize /= 4;
- byte type = (*source++) & 0x0F;
+ type = (*source++) & 0x0F;
- int16 workSample = prevSample;
+ workSample = prevSample;
switch (type) {
@@ -64,27 +75,18 @@
case 2:
case 3:
case 4:
- {
+ byteCount = modeValues[type - 2][0];
+ bitCount = modeValues[type - 2][1];
+ bitMask = modeValues[type - 2][2];
+ bitShift = modeValues[type - 2][3];
+ ofs = 0;
- const int modeValues[3][4] = {
- { 2, 8, 0x01, 1},
- { 4, 4, 0x03, 2},
- {16, 2, 0x0F, 4}
- };
-
- uint16 byteCount = modeValues[type - 2][0];
- uint16 bitCount = modeValues[type - 2][1];
- byte bitMask = modeValues[type - 2][2];
- byte bitShift = modeValues[type - 2][3];
-
- uint16 ofs = 0;
-
- for (uint16 i = 0; i < byteCount; i++)
+ for (i = 0; i < byteCount; i++)
soundBuffer2[i] = (*source++) * 2 - 128;
while (ofs < workChunkSize) {
- byte val = *source++;
- for (uint i = 0; i < bitCount; i++) {
+ val = *source++;
+ for (i = 0; i < bitCount; i++) {
workSample = CLIP<int16>(workSample + soundBuffer2[val & bitMask], -127, 127);
val >>= bitShift;
soundBuffer[ofs++] = workSample + 128;
@@ -92,15 +94,12 @@
}
break;
- }
case 5:
- {
- for (uint16 i = 0; i < workChunkSize; i++)
+ for (i = 0; i < workChunkSize; i++)
soundBuffer[i] = *source++;
workSample = soundBuffer[workChunkSize - 1] - 128;
break;
- }
default:
return;
@@ -108,12 +107,12 @@
}
if (deltaType == 1) {
- for (uint16 i = 0; i < chunkSize - 1; i += 2) {
- uint16 l = i / 2;
+ for (i = 0; i < chunkSize - 1; i += 2) {
+ l = i / 2;
soundBuffer3[i] = soundBuffer[l];
soundBuffer3[i + 1] = (soundBuffer[l + 1] + soundBuffer[l]) / 2;
}
- for (uint16 i = 0; i < chunkSize; i++) {
+ for (i = 0; i < chunkSize; i++) {
soundBuffer[i] = soundBuffer3[i];
}
} else if (deltaType == 2) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list