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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Mon May 25 21:57:09 CEST 2009


Revision: 40894
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40894&view=rev
Author:   thebluegr
Date:     2009-05-25 19:57:09 +0000 (Mon, 25 May 2009)

Log Message:
-----------
WIP code for the speech in the floppy version of KQ6 (still needs work)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/ksound.cpp
    scummvm/trunk/engines/sci/resource.cpp
    scummvm/trunk/engines/sci/resource.h

Modified: scummvm/trunk/engines/sci/engine/ksound.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/ksound.cpp	2009-05-25 19:48:52 UTC (rev 40893)
+++ scummvm/trunk/engines/sci/engine/ksound.cpp	2009-05-25 19:57:09 UTC (rev 40894)
@@ -797,7 +797,7 @@
 		break;
 	}
 	case _K_SCI1_SOUND_GET_AUDIO_CAPABILITY : {
-		return NULL_REG;
+		return make_reg(0, 1);//NULL_REG;
 	}
 	case _K_SCI1_SOUND_PLAY_HANDLE : {
 		int looping = GET_SEL32V(obj, loop);
@@ -996,6 +996,11 @@
 
 // Used for speech playback in CD games
 reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	printf("kDoAudio called with %d parameters: ", argc);
+	for (int i = 0; i < argc; i++)
+		printf("%d, ", SKPV(i));
+	printf("\n");
+
 	Audio::Mixer *mixer = g_system->getMixer();
 	int sampleLen = 0;
 
@@ -1012,11 +1017,20 @@
 		// Try to load from an external patch file first
 		Sci::Resource* audioRes = s->resmgr->findResource(kResourceTypeAudio, UKPV(1), 1);
 
-		if (audioRes) {
-			audioStream = s->sound.audioResource->getAudioStream(audioRes, &sampleLen);
-		} else {
-			// No patch file found, read it from the audio volume
-			audioStream = s->sound.audioResource->getAudioStream(UKPV(1), &sampleLen);
+		if (s->_gameName == "KQ5") {
+			if (audioRes) {
+				audioStream = s->sound.audioResource->getAudioStreamKQ5CD(audioRes, &sampleLen);
+			} else {
+				// No patch file found, read it from the audio volume
+				audioStream = s->sound.audioResource->getAudioStreamKQ5CD(UKPV(1), &sampleLen);
+			}
+		} else if (s->_gameName == "Kq6") {
+			if (audioRes) {
+				audioStream = s->sound.audioResource->getAudioStreamKQ6Floppy(audioRes, &sampleLen);
+			} else {
+				// No patch file found, read it from the audio volume
+				audioStream = s->sound.audioResource->getAudioStreamKQ6Floppy(UKPV(1), &sampleLen);
+			}
 		}
 
 		if (audioStream)

Modified: scummvm/trunk/engines/sci/resource.cpp
===================================================================
--- scummvm/trunk/engines/sci/resource.cpp	2009-05-25 19:48:52 UTC (rev 40893)
+++ scummvm/trunk/engines/sci/resource.cpp	2009-05-25 19:57:09 UTC (rev 40894)
@@ -1208,7 +1208,7 @@
 	}
 }
 
-bool AudioResource::findAudEntry(uint16 audioNumber, byte& volume, uint32& offset, uint32& size) {
+bool AudioResource::findAudEntryKQ5CD(uint16 audioNumber, byte& volume, uint32& offset, uint32& size) {
 	// AUDIO00X.MAP contains 10-byte entries:
 	// w nEntry
 	// dw offset+volume (as in resource.map)
@@ -1235,13 +1235,13 @@
 	return false;
 }
 
-Audio::AudioStream* AudioResource::getAudioStream(uint16 audioNumber, int* sampleLen) {
+Audio::AudioStream* AudioResource::getAudioStreamKQ5CD(uint16 audioNumber, int* sampleLen) {
 	Audio::AudioStream *audioStream = 0;
 	byte volume;
 	uint32 offset;
 	uint32 size;
 
-	if (findAudEntry(audioNumber, volume, offset, size)) {
+	if (findAudEntryKQ5CD(audioNumber, volume, offset, size)) {
 		uint32 start = offset * 1000 / _audioRate;
 		uint32 duration = size * 1000 / _audioRate;
 
@@ -1271,9 +1271,95 @@
 	return audioStream;
 }
 
-Audio::AudioStream* AudioResource::getAudioStream(Resource* audioRes, int* sampleLen) {
+bool AudioResource::findAudEntryKQ6Floppy(uint16 audioNumber, uint32& offset) {
+	// 65535.MAP contains 8-byte entries:
+	// w nEntry
+	// dw offset
+	// w unknown
+	uint16 n;
+	offset = 0;
+	int cur = 0;
+	int fileSize = 0;
+
+	// Load audio map
+	Common::File* audioMapFile = new Common::File();
+	if (audioMapFile->open("65535.map")) {
+		_audioMap = new byte[audioMapFile->size()];
+		audioMapFile->read(_audioMap, audioMapFile->size());
+		fileSize = audioMapFile->size();
+		audioMapFile->close();
+		delete audioMapFile;
+	} else {
+		_audioMap = 0;
+		return false;
+	}
+
+	byte *ptr = _audioMap;
+	while (cur < fileSize) {
+		n = READ_UINT16(ptr);
+		if (n == audioNumber) {
+			offset = READ_LE_UINT32(ptr + 2);
+			delete[] _audioMap;
+			_audioMap = 0;
+			return true;
+		}
+		ptr += 8;
+		cur += 8;
+	}
+
+	delete[] _audioMap;
+	_audioMap = 0;
+	return false;
+}
+
+Audio::AudioStream* AudioResource::getAudioStreamKQ6Floppy(uint16 audioNumber, int* sampleLen) {
+	Audio::AudioStream *audioStream = 0;
+	uint32 offset;
+	uint32 size;
+
+	if (findAudEntryKQ6Floppy(audioNumber, offset)) {
+		Common::File* audioFile = new Common::File();
+		if (audioFile->open("resource.aud")) {
+			audioFile->seek(offset);
+			// Read audio file info
+			// Audio files are actually Sierra Audio files.
+			// Check here for more info: http://wiki.multimedia.cx/index.php?title=Sierra_Audio
+			audioFile->readByte();			// skip version
+			audioFile->readByte();			// skip header size
+			audioFile->readUint32LE();		// skip "SOL" + 0
+			_audioRate = audioFile->readUint16LE();
+			audioFile->readByte();			// skip flags
+			size = audioFile->readUint16LE();
+			byte *soundbuff = (byte *)malloc(size);
+			audioFile->read(soundbuff, size); 
+			audioFile->close();
+			delete audioFile;
+
+			audioStream = Audio::makeLinearInputStream(soundbuff, size,	_audioRate,
+				Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_UNSIGNED, 0, 0);
+		}
+
+		*sampleLen = size * 60 / _audioRate;
+	}
+
+	return audioStream;
+}
+
+Audio::AudioStream* AudioResource::getAudioStreamKQ5CD(Resource* audioRes, int* sampleLen) {
 	*sampleLen = audioRes->size * 60 / _audioRate;
 	return Audio::makeLinearInputStream(audioRes->data, audioRes->size, _audioRate, Audio::Mixer::FLAG_UNSIGNED, 0, 0);
 }
 
+Audio::AudioStream* AudioResource::getAudioStreamKQ6Floppy(Resource* audioRes, int* sampleLen) {
+	// Read audio file info
+	// Audio files are actually Sierra Audio files.
+	// Check here for more info: http://wiki.multimedia.cx/index.php?title=Sierra_Audio
+	_audioRate = READ_UINT16(audioRes->data + 6);
+	uint32 size = READ_UINT16(audioRes->data + 9);
+
+	*sampleLen = size * 60 / _audioRate;
+	return Audio::makeLinearInputStream(audioRes->data + 11, size, _audioRate, Audio::Mixer::FLAG_UNSIGNED, 0, 0);
+}
+
+
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/resource.h
===================================================================
--- scummvm/trunk/engines/sci/resource.h	2009-05-25 19:48:52 UTC (rev 40893)
+++ scummvm/trunk/engines/sci/resource.h	2009-05-25 19:57:09 UTC (rev 40894)
@@ -312,9 +312,13 @@
 
 	Audio::SoundHandle* getAudioHandle() { return &_audioHandle; }
 	int getAudioPosition();
-	Audio::AudioStream* getAudioStream(uint16 audioNumber, int* sampleLen);
-	Audio::AudioStream* getAudioStream(Resource* audioRes, int* sampleLen);
 
+	// TODO: these need better names
+	Audio::AudioStream* getAudioStreamKQ5CD(uint16 audioNumber, int* sampleLen);
+	Audio::AudioStream* getAudioStreamKQ5CD(Resource* audioRes, int* sampleLen);
+	Audio::AudioStream* getAudioStreamKQ6Floppy(uint16 audioNumber, int* sampleLen);
+	Audio::AudioStream* getAudioStreamKQ6Floppy(Resource* audioRes, int* sampleLen);
+
 	void stop() { g_system->getMixer()->stopHandle(_audioHandle); }
 	void pause() { g_system->getMixer()->pauseHandle(_audioHandle, true); }
 	void resume() { g_system->getMixer()->pauseHandle(_audioHandle, false); }
@@ -325,7 +329,9 @@
 	int16 _lang;
 	byte *_audioMap;
 
-	bool findAudEntry(uint16 audioNumber, byte& volume, uint32& offset, uint32& size);
+	// TODO: these need better names
+	bool findAudEntryKQ5CD(uint16 audioNumber, byte& volume, uint32& offset, uint32& size);
+	bool findAudEntryKQ6Floppy(uint16 audioNumber, uint32& offset);
 };
 
 } // End of namespace Sci


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