[Scummvm-cvs-logs] SF.net SVN: scummvm:[35736] scummvm/trunk/engines/scumm
Kirben at users.sourceforge.net
Kirben at users.sourceforge.net
Mon Jan 5 07:45:43 CET 2009
Revision: 35736
http://scummvm.svn.sourceforge.net/scummvm/?rev=35736&view=rev
Author: Kirben
Date: 2009-01-05 06:45:42 +0000 (Mon, 05 Jan 2009)
Log Message:
-----------
Add support for RIFF sound format in createSound().
Modified Paths:
--------------
scummvm/trunk/engines/scumm/he/intern_he.h
scummvm/trunk/engines/scumm/he/resource_he.cpp
scummvm/trunk/engines/scumm/scumm.cpp
Modified: scummvm/trunk/engines/scumm/he/intern_he.h
===================================================================
--- scummvm/trunk/engines/scumm/he/intern_he.h 2009-01-05 01:40:08 UTC (rev 35735)
+++ scummvm/trunk/engines/scumm/he/intern_he.h 2009-01-05 06:45:42 UTC (rev 35736)
@@ -393,7 +393,7 @@
const OpcodeEntryV80he *_opcodesV80he;
- int32 _heSndResId, _curSndId, _sndPtrOffs, _sndTmrOffs;
+ int32 _heSndResId, _curSndId, _sndPtrOffs, _sndTmrOffs, _sndDataSize;
public:
ScummEngine_v80he(OSystem *syst, const DetectorResult &dr);
Modified: scummvm/trunk/engines/scumm/he/resource_he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/resource_he.cpp 2009-01-05 01:40:08 UTC (rev 35735)
+++ scummvm/trunk/engines/scumm/he/resource_he.cpp 2009-01-05 06:45:42 UTC (rev 35736)
@@ -1665,11 +1665,35 @@
return size;
}
+byte *getSoundOffset(byte *ptr) {
+ byte *endPtr;
+ uint32 offset, size;
+
+ if (READ_BE_UINT32(ptr) != MKID_BE('RIFF'))
+ return NULL;
+
+ endPtr = (ptr + 12);
+ size = READ_LE_UINT32(ptr + 4) - 4;
+
+ while (size > 0) {
+ offset = READ_LE_UINT32(endPtr + 4);
+
+ if (offset <= 0)
+ error("Illegal chunk length - %d bytes.", offset);
+
+ if (offset > size)
+ error("Chunk extends beyond file end - %d versus %d.", offset, size);
+
+ if (READ_BE_UINT32(endPtr) == MKID_BE('data'))
+ return endPtr;
+
+ endPtr = endPtr + offset + 8;
+ }
+
+ return NULL;
+}
+
void ScummEngine_v80he::createSound(int snd1id, int snd2id) {
- // HACK: Unsupported sound format
- if (_game.id == GID_MOONBASE)
- return;
-
byte *snd1Ptr, *snd2Ptr;
byte *sbng1Ptr, *sbng2Ptr;
byte *sdat1Ptr, *sdat2Ptr;
@@ -1677,9 +1701,13 @@
int len, offs, size;
int sdat1size, sdat2size;
+ sbng1Ptr = NULL;
+ sbng2Ptr = NULL;
+
if (snd2id == -1) {
_sndPtrOffs = 0;
_sndTmrOffs = 0;
+ _sndDataSize = 0;
return;
}
@@ -1687,6 +1715,7 @@
_curSndId = snd1id;
_sndPtrOffs = 0;
_sndTmrOffs = 0;
+ _sndDataSize = 0;
}
snd1Ptr = getResourceAddress(rtSound, snd1id);
@@ -1701,8 +1730,10 @@
chan = i;
}
- sbng1Ptr = heFindResource(MKID_BE('SBNG'), snd1Ptr);
- sbng2Ptr = heFindResource(MKID_BE('SBNG'), snd2Ptr);
+ if (!getSoundOffset(snd1Ptr)) {
+ sbng1Ptr = heFindResource(MKID_BE('SBNG'), snd1Ptr);
+ sbng2Ptr = heFindResource(MKID_BE('SBNG'), snd2Ptr);
+ }
if (sbng1Ptr != NULL && sbng2Ptr != NULL) {
if (chan != -1 && ((SoundHE *)_sound)->_heChannel[chan].codeOffs > 0) {
@@ -1745,14 +1776,28 @@
}
}
- sdat1Ptr = heFindResource(MKID_BE('SDAT'), snd1Ptr);
- assert(sdat1Ptr);
- sdat2Ptr = heFindResource(MKID_BE('SDAT'), snd2Ptr);
- assert(sdat2Ptr);
+ if (getSoundOffset(snd1Ptr)) {
+ sdat1Ptr = getSoundOffset(snd1Ptr);
+ assert(sdat1Ptr);
+ sdat2Ptr = getSoundOffset(snd2Ptr);
+ assert(sdat2Ptr);
- sdat1size = READ_BE_UINT32(sdat1Ptr + 4) - 8 - _sndPtrOffs;
- sdat2size = READ_BE_UINT32(sdat2Ptr + 4) - 8;
+ if (!_sndDataSize)
+ _sndDataSize = READ_LE_UINT32(sdat1Ptr + 4) - 8;
+ sdat2size = READ_LE_UINT32(sdat2Ptr + 4) - 8;
+ } else {
+ sdat1Ptr = heFindResource(MKID_BE('SDAT'), snd1Ptr);
+ assert(sdat1Ptr);
+ sdat2Ptr = heFindResource(MKID_BE('SDAT'), snd2Ptr);
+ assert(sdat2Ptr);
+
+ _sndDataSize = READ_BE_UINT32(sdat1Ptr + 4) - 8;
+
+ sdat2size = READ_BE_UINT32(sdat2Ptr + 4) - 8;
+ }
+
+ sdat1size = _sndDataSize - _sndPtrOffs;
if (sdat2size < sdat1size) {
src = sdat2Ptr + 8;
dst = sdat1Ptr + 8 + _sndPtrOffs;
Modified: scummvm/trunk/engines/scumm/scumm.cpp
===================================================================
--- scummvm/trunk/engines/scumm/scumm.cpp 2009-01-05 01:40:08 UTC (rev 35735)
+++ scummvm/trunk/engines/scumm/scumm.cpp 2009-01-05 06:45:42 UTC (rev 35736)
@@ -772,6 +772,7 @@
_curSndId = 0;
_sndPtrOffs = 0;
_sndTmrOffs = 0;
+ _sndDataSize = 0;
VAR_PLATFORM = 0xFF;
VAR_PLATFORM_VERSION = 0xFF;
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