diff options
| -rw-r--r-- | resource.cpp | 5 | ||||
| -rw-r--r-- | sound.cpp | 36 | 
2 files changed, 40 insertions, 1 deletions
diff --git a/resource.cpp b/resource.cpp index 3e04c0bb0e..5a214f282f 100644 --- a/resource.cpp +++ b/resource.cpp @@ -605,6 +605,9 @@ int Scumm::readSoundResource(int type, int idx)  			pri = -1;  			switch (tag) { +			case MKID('SBL '): +				pri = 15; +				break;  			case MKID('ADL '):  				if (_use_adlib)  					pri = 10; @@ -702,7 +705,7 @@ int Scumm::readSoundResource(int type, int idx)  		   00 0F 00 40  		   Maybe I am mistaken when I think it's four byte, some other parts -		   seem to suggest it's 2 byte oriented, or even variable lenght... +		   seem to suggest it's 2 byte oriented, or even variable length...  		 */  		fileSeek(_fileHandle, -12, SEEK_CUR);  		total_size = fileReadDwordBE(); @@ -216,6 +216,42 @@ void Sound::playSound(int sound) {  		_scumm->_mixer->play_raw(NULL, sound, size, rate, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE);  		return;  	} +	// Support for sampled sound effects in Monkey1 and Monkey2 +	else if (ptr != NULL && READ_UINT32_UNALIGNED(ptr) == MKID('SBL ')) { +		debug(2, "Using SBL sound effect"); + +		// TODO - Figuring out how the SBL chunk works. Here's an +		// example: +		// +		// 53 42 4c 20 00 00 11 ae  |SBL ....| +		// 41 55 68 64 00 00 00 03  |AUhd....| +		// 00 00 80 41 55 64 74 00  |...AUdt.| +		// 00 11 9b 01 96 11 00 a6  |........| +		// 00 7f 7f 7e 7e 7e 7e 7e  |...~~~~~| +		// 7e 7f 7f 80 80 7f 7f 7f  |~.......| +		// 7f 80 80 7f 7e 7d 7d 7e  |....~}}~| +		// 7e 7e 7e 7e 7e 7e 7e 7f  |~~~~~~~.| +		// 7f 7f 7f 80 80 80 80 80  |........| +		// 80 81 80 80 7f 7f 80 85  |........| +		// 8b 8b 83 78 72 6d 6f 75  |...xrmou| +		// 7a 78 77 7d 83 84 83 81  |zxw}....| +		// +		// The length of the AUhd chunk always seems to be 3 bytes. +		// Let's skip that for now. +		// +		// The starting offset, length and sample rate is all pure +		// guesswork. The result sounds reasonable to me, but I've +		// never heard the original. + +		int size = READ_BE_UINT32_UNALIGNED(ptr + 4) - 27; +		int rate = 8000; + +		// Allocate a sound buffer, copy the data into it, and play +		char *sound = (char*)malloc(size); +		memcpy(sound, ptr + 33, size); +		_scumm->_mixer->play_raw(NULL, sound, size, rate, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE); +		return; +	}  	if ((_scumm->_features & GF_OLD256) && (ptr != NULL)) {  		char *sound;  | 
