diff options
| author | James Brown | 2002-05-13 08:25:58 +0000 | 
|---|---|---|
| committer | James Brown | 2002-05-13 08:25:58 +0000 | 
| commit | 4466f1555b6158ec7f8e35f46def08c744b0ae1f (patch) | |
| tree | 5c18e675712290fab11ac2993eae2ee9ad313119 /sound.cpp | |
| parent | 2a53e8f661c06b79a9a2d7443f4fb1e6be71cf13 (diff) | |
| download | scummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.tar.gz scummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.tar.bz2 scummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.zip | |
The DIG SFX support - thanks to aquadran
svn-id: r4303
Diffstat (limited to 'sound.cpp')
| -rw-r--r-- | sound.cpp | 53 | 
1 files changed, 53 insertions, 0 deletions
| @@ -87,6 +87,59 @@ void Scumm::processSoundQues()  						data[1], data[2], data[3], data[4], data[5], data[6], data[7]  				);  #endif +			if ((_gameId == GID_DIG) && (data[0] == 12)){ +				uint32 size, rate, tag, chan; +				uint8 * ptr = getResourceAddress(rtSound, data[1]); +				if (ptr != NULL) { +					ptr+=16;       /* Skip header */ +					for (;;) { +				    		tag = READ_BE_UINT32(ptr);  ptr+=4; +						switch(tag) { +							case MKID_BE('FRMT'): +								size = READ_BE_UINT32(ptr); ptr+=16;					 +								rate = READ_BE_UINT32(ptr); ptr+=4; +								chan = READ_BE_UINT32(ptr); ptr+=4; +							break; +							case MKID_BE('TEXT'): +							case MKID_BE('REGN'): +							case MKID_BE('STOP'): +								size = READ_BE_UINT32(ptr); ptr+=size+4; +							break; +							case MKID_BE('DATA'): +								size = READ_BE_UINT32(ptr); ptr+=4; +							break; +							default: +								error("Unknown sfx header %c%c%c%c", tag>>24, tag>>16, tag>>8, tag); +						} +						if (tag == MKID_BE('DATA')) break; +					} +					if (chan == 1) +					{ +						uint32 s_size = (size * 2) / 3; +						byte * buffer = (byte*)malloc (s_size); +						uint32 l = 0, r = 0, tmp; +						memset (buffer, 0, s_size); +						for (; l < size - 1; l += 3) +						{ +							tmp = (ptr[l + 1] & 0x0f) << 8; +							tmp = (tmp | ptr[l + 0]) << 4; +							tmp -= 0x8000; +//							buffer[r++] = (uint8)(tmp & 0xff); +							buffer[r++] = (uint8)((tmp >> 8) & 0xff); + +							tmp = (ptr[l + 1] & 0xf0) << 4; +							tmp = (tmp | ptr[l + 2]) << 4; +							tmp -= 0x8000; +//							buffer[r++] = (uint8)(tmp & 0xff); +							buffer[r++] = (uint8)((tmp >> 8) & 0xff); +						}  +						_mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE); +					} else { +						warning("DIG: ignoring stereo sample"); +					} +				} +			} +																										    																																						  			if (!(_features & GF_AFTER_V7)) {  				if (se)  					_vars[VAR_SOUNDRESULT] = | 
