[Scummvm-cvs-logs] scummvm master -> 3385fd37b974088e1cd7117e67c87e935742d729

Littleboy littleboy22 at gmail.com
Wed Jun 29 18:11:58 CEST 2011


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3385fd37b9 LASTEXPRESS: Hook up preliminary sound filtering


Commit: 3385fd37b974088e1cd7117e67c87e935742d729
    https://github.com/scummvm/scummvm/commit/3385fd37b974088e1cd7117e67c87e935742d729
Author: Littleboy (littleboy at users.sourceforge.net)
Date: 2011-06-29T09:06:33-07:00

Commit Message:
LASTEXPRESS: Hook up preliminary sound filtering

 - Add debug checks in soundFilter()
 - Rename kSoundStatusClear1 to kSoundStatusFilterVariant

Changed paths:
    engines/lastexpress/shared.h
    engines/lastexpress/sound/entry.cpp
    engines/lastexpress/sound/entry.h
    engines/lastexpress/sound/queue.cpp



diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 6969e43..b4ced96 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -90,24 +90,24 @@ enum SoundState {
 };
 
 enum SoundStatus {
-	kSoundStatus_20       = 0x20,
-	kSoundStatus_40       = 0x40,
-	kSoundStatus_180      = 0x180,
-	kSoundStatusRemoved   = 0x200,
-	kSoundStatus_400      = 0x400,
-
-	kSoundStatus_8000     = 0x8000,
-	kSoundStatus_20000    = 0x20000,
-	kSoundStatus_100000   = 0x100000,
-	kSoundStatus_20000000 = 0x20000000,
-	kSoundStatus_40000000 = 0x40000000,
-
-	kSoundStatusClear0    = 0x10,
-	kSoundStatusClear1    = 0x1F,
-	kSoundStatusClear2    = 0x80,
-	kSoundStatusClear3    = 0x200,
-	kSoundStatusClear4    = 0x800,
-	kSoundStatusClearAll  = 0xFFFFFFE0
+	kSoundStatus_20            = 0x20,
+	kSoundStatus_40            = 0x40,
+	kSoundStatus_180           = 0x180,
+	kSoundStatusRemoved        = 0x200,
+	kSoundStatus_400           = 0x400,
+
+	kSoundStatus_8000          = 0x8000,
+	kSoundStatus_20000         = 0x20000,
+	kSoundStatus_100000        = 0x100000,
+	kSoundStatus_20000000      = 0x20000000,
+	kSoundStatus_40000000      = 0x40000000,
+
+	kSoundStatusClear0         = 0x10,
+	kSoundStatusFilterVariant  = 0x1F,
+	kSoundStatusClear2         = 0x80,
+	kSoundStatusClear3         = 0x200,
+	kSoundStatusClear4         = 0x800,
+	kSoundStatusClearAll       = 0xFFFFFFE0
 };
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp
index 5cbc593..4bdb9f7 100644
--- a/engines/lastexpress/sound/entry.cpp
+++ b/engines/lastexpress/sound/entry.cpp
@@ -47,7 +47,7 @@ namespace LastExpress {
 SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
 	_type = kSoundTypeNone;
 
-	_currentDataPtr = 0;
+	_currentDataPtr = NULL;
 	_soundBuffer = NULL;
 
 	_blockCount = 0;
@@ -58,7 +58,7 @@ SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
 	_field_34 = 0;
 	_field_38 = 0;
 	_field_3C = 0;
-	_field_40 = 0;
+	_variant = 0;
 	_entity = kEntityPlayer;
 	_field_48 = 0;
 	_priority = 0;
@@ -118,32 +118,37 @@ void SoundEntry::close() {
 }
 
 void SoundEntry::play() {
-	if (!_soundStream)
-		_soundStream = new StreamedSound();
-
-	if (_queued)
-		return;
-
 	if (!_stream) {
 		warning("[SoundEntry::play] stream has been disposed");
 		return;
 	}
 
-	// Stream the contents of the sound buffer
-	/*int16 *buffer = (int16 *)malloc(FILTER_BUFFER_SIZE);
+	if (_queued)
+		return;
+
+	// Apply filter
+	int16 *buffer = (int16 *)malloc(FILTER_BUFFER_SIZE);
 	memset(buffer, 0, FILTER_BUFFER_SIZE);
 
 	applyFilter(buffer);
 
-	_soundStream->queueBuffer((const byte *)buffer, FILTER_BUFFER_SIZE, true);
+	// Queue the filtered data
+#if 0
+	if (!_soundStream)
+		_soundStream = new AppendableSound();
 
+	// FIXME: make sure the filtered sound buffer is disposed
+	_soundStream->queueBuffer((const byte *)buffer, FILTER_BUFFER_SIZE /* true */);
+#else
+	free(buffer);
 
-	// Skip header
-	_stream->seek(12, SEEK_SET);
-	*/
+	// DEBUG: unfiltered stream
+	if (!_soundStream)
+		_soundStream = new StreamedSound();
 
 	_stream->seek(0);
 	_soundStream->load(_stream);
+#endif
 
 	_queued = true;
 }
@@ -233,7 +238,7 @@ void SoundEntry::setType(SoundFlag flag) {
 
 void SoundEntry::setupStatus(SoundFlag flag) {
 	SoundStatus statusFlag = (SoundStatus)flag;
-	if (!((statusFlag & 0xFF) & kSoundStatusClear1))
+	if (!((statusFlag & 0xFF) & kSoundStatusFilterVariant))
 		statusFlag = (SoundStatus)(statusFlag | kSoundStatusClear2);
 
 	if (((statusFlag & 0xFF00) >> 8) & kSoundStatusClear0)
@@ -269,6 +274,7 @@ void SoundEntry::loadSoundData(Common::String name) {
 
 	if (_stream) {
 		_stream->read(_soundBuffer, MIN(SOUNDCACHE_ENTRY_SIZE, _stream->size()));
+		_currentDataPtr = _soundBuffer + 6;
 	} else {
 		_status.status = kSoundStatusRemoved;
 	}
@@ -282,7 +288,7 @@ void SoundEntry::update(uint val) {
 
 		if (val) {
 			if (getSoundQueue()->getFlag() & 32) {
-				_field_40 = val;
+				_variant = val;
 				value2 = val * 2 + 1;
 			}
 
@@ -297,12 +303,12 @@ void SoundEntry::update(uint val) {
 void SoundEntry::updateState() {
 	if (getSoundQueue()->getFlag() & 32) {
 		if (_type != kSoundType9 && _type != kSoundType7 && _type != kSoundType5) {
-			uint32 newStatus = _status.status & kSoundStatusClear1;
+			uint32 variant = _status.status & kSoundStatusFilterVariant;
 
 			_status.status &= kSoundStatusClearAll;
 
-			_field_40 = newStatus;
-			_status.status |= newStatus * 2 + 1;
+			_variant = variant;
+			_status.status |= variant * 2 + 1;
 		}
 	}
 
@@ -680,16 +686,16 @@ static const int p2s[17] = { 0, 1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15,
 static void soundFilter(byte *data, int16 *buffer, int p1, int p2);
 
 void SoundEntry::applyFilter(int16 *buffer) {
-	if ((_soundBuffer[1] << 6) > 5632) {
+	if ((READ_UINT16((int16 *)(_currentDataPtr + 2)) << 6) > 5632) {
 		_status.status |= kSoundStatus_20000000;
 	} else {
-		int variant = _status.status & 0x1f;
+		int variant = _status.status & kSoundStatusFilterVariant;
 
-		soundFilter(_soundBuffer, buffer, p1s[variant], p2s[variant]);
+		soundFilter(_currentDataPtr, buffer, p1s[variant], p2s[variant]);
+		_currentDataPtr += 739;
 	}
 }
 
-
 static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
 	int data1, data2, data1p, data2p;
 	byte idx;
@@ -701,6 +707,12 @@ static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
 
 	for (int count = 0; count < 735; count++) {
 		idx = data[count] >> 4;
+
+		if ((idx + data1) > ARRAYSIZE(filterData)) {
+			warning("Error in sound filter, aborting...");
+			return;
+		}
+
 		data1p = filterData[idx + data1];
 		data2p = CLIP(filterData2[idx + data1] + data2, -32767, 32767);
 
@@ -708,6 +720,11 @@ static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
 
 		idx = data[count] & 0xF;
 
+		if ((idx + data1p) > ARRAYSIZE(filterData)) {
+			warning("Error in sound filter, aborting...");
+			return;
+		}
+
 		data1 = filterData[idx + data1p];
 		data2 = CLIP(filterData2[idx + data1p] + data2p, -32767, 32767);
 		buffer[2 * count + 1] = (p2 * data2) >> p1;
diff --git a/engines/lastexpress/sound/entry.h b/engines/lastexpress/sound/entry.h
index 8da780f..a466d31 100644
--- a/engines/lastexpress/sound/entry.h
+++ b/engines/lastexpress/sound/entry.h
@@ -134,7 +134,7 @@ private:
 	SoundType _type;    // int
 	//int _data;
 	//int _endOffset;
-	int _currentDataPtr;
+	byte * _currentDataPtr;
 	//int _currentBufferPtr;
 	int _blockCount;
 	uint32 _time;
@@ -145,7 +145,7 @@ private:
 	int _field_34;
 	int _field_38;
 	int _field_3C;
-	int _field_40;
+	int _variant;
 	EntityIndex _entity;
 	int _field_48;
 	uint32 _priority;
diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp
index d5475a27..ad5c9bf 100644
--- a/engines/lastexpress/sound/queue.cpp
+++ b/engines/lastexpress/sound/queue.cpp
@@ -102,9 +102,9 @@ void SoundQueue::removeFromQueue(Common::String filename) {
 }
 
 void SoundQueue::updateQueue() {
-	Common::StackLock locker(_mutex);
+	//Common::StackLock locker(_mutex);
 
-	warning("[Sound::updateQueue] Not implemented");
+	//warning("[Sound::updateQueue] Not implemented");
 }
 
 void SoundQueue::resetQueue() {
@@ -292,11 +292,11 @@ void SoundQueue::updateSubtitles() {
 		if (!(status & kSoundStatus_40)
 		 || status & kSoundStatus_180
 		 || soundEntry->getTime() == 0
-		 || (status & kSoundStatusClear1) < 6
+		 || (status & kSoundStatusFilterVariant) < 6
 		 || ((getFlags()->nis & 0x8000) && soundEntry->getPriority() < 90)) {
 			 current_index = 0;
 		} else {
-			current_index = soundEntry->getPriority() + (status & kSoundStatusClear1);
+			current_index = soundEntry->getPriority() + (status & kSoundStatusFilterVariant);
 
 			if (_currentSubtitle == (*i))
 				current_index += 4;






More information about the Scummvm-git-logs mailing list