[Scummvm-cvs-logs] SF.net SVN: scummvm:[35353] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Sun Dec 14 05:13:48 CET 2008


Revision: 35353
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35353&view=rev
Author:   drmccoy
Date:     2008-12-14 04:13:48 +0000 (Sun, 14 Dec 2008)

Log Message:
-----------
16bit background "music" for Urban Runner

Modified Paths:
--------------
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v6.cpp
    scummvm/trunk/engines/gob/sound/sounddesc.cpp
    scummvm/trunk/engines/gob/sound/sounddesc.h
    scummvm/trunk/engines/gob/sound/soundmixer.cpp
    scummvm/trunk/engines/gob/sound/soundmixer.h

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/inter.h	2008-12-14 04:13:48 UTC (rev 35353)
@@ -630,6 +630,8 @@
 	bool o6_evaluateStore(OpFuncParams &params);
 	bool o6_palLoad(OpFuncParams &params);
 	bool o6_freeCollision(OpFuncParams &params);
+
+	void probe16bitMusic(char *fileName);
 };
 
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2008-12-14 04:13:48 UTC (rev 35353)
@@ -689,6 +689,10 @@
 		_vm->_sound->bgStop();
 		return;
 	} else if (lastFrame == -9) {
+		probe16bitMusic(fileName);
+
+		warning("==> %s", fileName);
+
 		_vm->_sound->bgStop();
 		_vm->_sound->bgPlay(fileName, SOUND_WAV);
 		return;
@@ -902,4 +906,24 @@
 	return false;
 }
 
+void Inter_v6::probe16bitMusic(char *fileName) {
+	int len = strlen(fileName);
+
+	if (len < 4)
+		return;
+
+	if (scumm_stricmp(fileName + len - 4, ".WA8"))
+		return;
+
+	fileName[len - 1] = 'V';
+
+	int16 handle;
+	if ((handle = _vm->_dataIO->openData(fileName)) >= 0) {
+		_vm->_dataIO->closeData(handle);
+		return;
+	}
+
+	fileName[len - 1] = '8';
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/sound/sounddesc.cpp
===================================================================
--- scummvm/trunk/engines/gob/sound/sounddesc.cpp	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/sound/sounddesc.cpp	2008-12-14 04:13:48 UTC (rev 35353)
@@ -43,6 +43,7 @@
 	_frequency = 0;
 	_flag = 0;
 	_id = 0;
+	_mixerFlags = 0;
 }
 
 SoundDesc::~SoundDesc() {
@@ -86,9 +87,19 @@
 }
 
 void SoundDesc::convToSigned() {
-	if (((_type == SOUND_SND) || (_type == SOUND_WAV)) && _data && _dataPtr)
+	if ((_type != SOUND_SND) && (_type != SOUND_WAV))
+		return;
+	if (!_data || !_dataPtr)
+		return;
+
+	if (_mixerFlags & Audio::Mixer::FLAG_16BITS) {
+		uint16 *data = (uint16 *) _dataPtr;
 		for (uint32 i = 0; i < _size; i++)
+			data[i] ^= 0x8000;
+	} else
+		for (uint32 i = 0; i < _size; i++)
 			_dataPtr[i] ^= 0x80;
+
 }
 
 int16 SoundDesc::calcFadeOutLength(int16 frequency) {
@@ -125,8 +136,8 @@
 		return false;
 
 	if (wavFlags & Audio::Mixer::FLAG_16BITS) {
-		warning("TODO: SoundDesc::loadWAV() - 16bit");
-		return false;
+		_mixerFlags |= Audio::Mixer::FLAG_16BITS;
+		wavSize >>= 1;
 	}
 
 	if (wavFlags & Audio::Mixer::FLAG_STEREO) {

Modified: scummvm/trunk/engines/gob/sound/sounddesc.h
===================================================================
--- scummvm/trunk/engines/gob/sound/sounddesc.h	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/sound/sounddesc.h	2008-12-14 04:13:48 UTC (rev 35353)
@@ -48,6 +48,7 @@
 	int16 _frequency;
 	int16 _flag;
 	int16 _id;
+	byte _mixerFlags;
 
 	byte *getData() { return _dataPtr; }
 

Modified: scummvm/trunk/engines/gob/sound/soundmixer.cpp
===================================================================
--- scummvm/trunk/engines/gob/sound/soundmixer.cpp	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/sound/soundmixer.cpp	2008-12-14 04:13:48 UTC (rev 35353)
@@ -32,7 +32,8 @@
 
 	_rate = _mixer->getOutputRate();
 	_end = true;
-	_data = 0;
+	_data8 = 0;
+	_data16 = 0;
 	_length = 0;
 	_freq = 0;
 	_repCount = 0;
@@ -57,6 +58,13 @@
 	_mixer->stopHandle(_handle);
 }
 
+inline int16 SoundMixer::getData(int offset) {
+	if (!_16bit)
+		return (int16) _data8[offset];
+	else
+		return (int16) _data16[offset];
+}
+
 bool SoundMixer::isPlaying() const {
 	return !_end;
 }
@@ -69,7 +77,8 @@
 	Common::StackLock slock(_mutex);
 
 	if (fadeLength <= 0) {
-		_data = 0;
+		_data8 = 0;
+		_data16 = 0;
 		_end = true;
 		_playingSound = 0;
 		return;
@@ -97,7 +106,16 @@
 	sndDesc._repCount = repCount - 1;
 	sndDesc._frequency = frequency;
 
-	_data = (int8 *) sndDesc.getData();
+	_16bit = (sndDesc._mixerFlags & Audio::Mixer::FLAG_16BITS) != 0;
+
+	if (_16bit) {
+		_data16 = (int16 *) sndDesc.getData();
+		_shift = 0;
+	} else {
+		_data8 = (int8 *) sndDesc.getData();
+		_shift = 8;
+	}
+
 	_length = sndDesc.size();
 	_freq = frequency;
 
@@ -110,7 +128,7 @@
 	_offsetInc = (_freq << FRAC_BITS) / _rate;
 
 	_last = _cur;
-	_cur = _data[0];
+	_cur = getData(0);
 
 	_curFadeSamples = 0;
 	if (fadeLength == 0) {
@@ -152,7 +170,7 @@
 	Common::StackLock slock(_mutex);
 
 	for (int i = 0; i < numSamples; i++) {
-		if (!_data)
+		if (!_data8 && !_data16)
 			return i;
 		if (_end || (_offset >= _length))
 			checkEndSample();
@@ -162,7 +180,7 @@
 		// Linear interpolation. See sound/rate.cpp
 
 		int16 val = (_last + (((_cur - _last) * _offsetFrac +
-					FRAC_HALF) >> FRAC_BITS)) << 8;
+					FRAC_HALF) >> FRAC_BITS)) << _shift;
 		*buffer++ = (val * _fadeVol) >> 16;
 
 		_offsetFrac += _offsetInc;
@@ -170,7 +188,7 @@
 		// Was there an integral change?
 		if (fracToInt(_offsetFrac) > 0) {
 			_last = _cur;
-			_cur = _data[_offset];
+			_cur = getData(_offset);
 			_offset += fracToInt(_offsetFrac);
 			_offsetFrac &= FRAC_LO_MASK;
 		}
@@ -192,7 +210,8 @@
 
 void SoundMixer::endFade() {
 	if (_fadeVolStep > 0) {
-		_data = 0;
+		_data8 = 0;
+		_data16 = 0;
 		_end = true;
 		_playingSound = 0;
 	} else {

Modified: scummvm/trunk/engines/gob/sound/soundmixer.h
===================================================================
--- scummvm/trunk/engines/gob/sound/soundmixer.h	2008-12-14 03:44:39 UTC (rev 35352)
+++ scummvm/trunk/engines/gob/sound/soundmixer.h	2008-12-14 04:13:48 UTC (rev 35353)
@@ -61,8 +61,12 @@
 	Audio::SoundHandle _handle;
 	Common::Mutex _mutex;
 
+	bool _16bit;
+	int _shift;
+
 	bool _end;
-	int8 *_data;
+	int8 *_data8;
+	int16 *_data16;
 	uint32 _length;
 	uint32 _rate;
 	int32 _freq;
@@ -88,6 +92,9 @@
 			int16 frequency, int16 fadeLength);
 	virtual void checkEndSample();
 	virtual void endFade();
+
+private:
+	inline int16 getData(int offset);
 };
 
 } // End of namespace Gob


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