[Scummvm-cvs-logs] SF.net SVN: scummvm:[46631] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Dec 27 13:33:47 CET 2009


Revision: 46631
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46631&view=rev
Author:   m_kiewitz
Date:     2009-12-27 12:33:47 +0000 (Sun, 27 Dec 2009)

Log Message:
-----------
SCI/newmusic: now playing sample data for sci0 games (this also fixes sq3 amiga freezing during pot exit)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/resource.cpp
    scummvm/trunk/engines/sci/resource.h
    scummvm/trunk/engines/sci/sfx/music.cpp

Modified: scummvm/trunk/engines/sci/resource.cpp
===================================================================
--- scummvm/trunk/engines/sci/resource.cpp	2009-12-27 12:21:12 UTC (rev 46630)
+++ scummvm/trunk/engines/sci/resource.cpp	2009-12-27 12:33:47 UTC (rev 46631)
@@ -1858,6 +1858,12 @@
 			sampleChannel->data = data;
 			sampleChannel->size = channel->size - (data - channel->data);
 			channel->size = data - channel->data;
+			// Read sample header information
+			//Offset 14 in the header contains the frequency as a short integer. Offset 32 contains the sample length, also as a short integer.
+			_tracks->digitalSampleRate = READ_LE_UINT16(sampleChannel->data + 14);
+			_tracks->digitalSampleSize = READ_LE_UINT16(sampleChannel->data + 32);
+			sampleChannel->data += 44; // Skip over header
+			sampleChannel->size -= 44;
 		}
 		break;
 
@@ -1891,6 +1897,8 @@
 			_tracks[trackNr].channels = new Channel[_tracks[trackNr].channelCount];
 			if (_tracks[trackNr].type != 0xF0) { // Digital track marker - not supported currently
 				_tracks[trackNr].digitalChannelNr = -1; // No digital sound associated
+				_tracks[trackNr].digitalSampleRate = 0;
+				_tracks[trackNr].digitalSampleSize = 0;
 				for (channelNr = 0; channelNr < _tracks[trackNr].channelCount; channelNr++) {
 					channel = &_tracks[trackNr].channels[channelNr];
 					channel->unk = READ_LE_UINT16(data);
@@ -1899,8 +1907,14 @@
 					channel->number = *(channel->data - 2);
 					channel->poly = *(channel->data - 1);
 					channel->time = channel->prev = 0;
-					if (channel->number == 0xFE) // Digital channel
+					if (channel->number == 0xFE) { // Digital channel
 						_tracks[trackNr].digitalChannelNr = channelNr;
+						_tracks[trackNr].digitalSampleRate = READ_LE_UINT16(channel->data);
+						_tracks[trackNr].digitalSampleSize = READ_LE_UINT16(channel->data + 2);
+						assert(READ_LE_UINT16(channel->data + 4) == 0); // Possibly a compression flag
+						channel->data += 8; // Skip over header
+						channel->size -= 8;
+					}
 					data += 6;
 				}
 			} else {

Modified: scummvm/trunk/engines/sci/resource.h
===================================================================
--- scummvm/trunk/engines/sci/resource.h	2009-12-27 12:21:12 UTC (rev 46630)
+++ scummvm/trunk/engines/sci/resource.h	2009-12-27 12:33:47 UTC (rev 46631)
@@ -450,9 +450,11 @@
 
 	struct Track {
 		TrackType type;
-		int16 digitalChannelNr;
 		byte channelCount;
 		Channel *channels;
+		int16 digitalChannelNr;
+		int digitalSampleRate;
+		uint32 digitalSampleSize;
 	};
 public:
 	SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersion soundVersion);

Modified: scummvm/trunk/engines/sci/sfx/music.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/music.cpp	2009-12-27 12:21:12 UTC (rev 46630)
+++ scummvm/trunk/engines/sci/sfx/music.cpp	2009-12-27 12:33:47 UTC (rev 46631)
@@ -311,13 +311,10 @@
 		// play digital sample
 		if (track->digitalChannelNr != -1) {
 			byte *channelData = track->channels[track->digitalChannelNr].data;
-			int rate = READ_LE_UINT16(channelData);
-			uint32 size = READ_LE_UINT16(channelData + 2);
-			assert(READ_LE_UINT16(channelData + 4) == 0);	// Possibly a compression flag
 			//assert(READ_LE_UINT16(channelData + 6) == size);
 			if (pSnd->pStreamAud)
 				delete pSnd->pStreamAud;
-			pSnd->pStreamAud = Audio::makeLinearInputStream(channelData + 8, size, rate,
+			pSnd->pStreamAud = Audio::makeLinearInputStream(channelData, track->digitalSampleSize, track->digitalSampleRate,
 					Audio::Mixer::FLAG_UNSIGNED, 0, 0);
 			pSnd->hCurrentAud = Audio::SoundHandle();
 		} else {


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