[Scummvm-git-logs] scummvm master -> 50be5b017e49e6620c9725fc91ff1f88878b3951

phcoder noreply at scummvm.org
Wed Dec 14 12:50:22 UTC 2022


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:
50be5b017e SAGA: Support music for ITE Amiga


Commit: 50be5b017e49e6620c9725fc91ff1f88878b3951
    https://github.com/scummvm/scummvm/commit/50be5b017e49e6620c9725fc91ff1f88878b3951
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-12-14T13:50:10+01:00

Commit Message:
SAGA: Support music for ITE Amiga

Changed paths:
    engines/saga/music.cpp
    engines/saga/music.h
    engines/saga/resource.cpp


diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index 71653678270..90aafa237eb 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -36,6 +36,7 @@
 #include "audio/decoders/mp3.h"
 #include "audio/decoders/raw.h"
 #include "audio/decoders/vorbis.h"
+#include "audio/mods/mod_xm_s3m.h"
 #include "audio/softsynth/fmtowns_pc98/towns_pc98_driver.h"
 #include "common/config-manager.h"
 #include "common/file.h"
@@ -51,7 +52,9 @@ Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer), _par
 	_currentVolume = 0;
 	_currentMusicBuffer = nullptr;
 
-	if (_vm->getPlatform() == Common::kPlatformPC98) {
+	if (_vm->getPlatform() == Common::kPlatformAmiga) {
+		_musicType = _driverType = MT_AMIGA;
+	} else if (_vm->getPlatform() == Common::kPlatformPC98) {
 		_musicType = _driverType = MT_PC98;
 
 		_driverPC98 = new TownsPC98_AudioDriver(mixer, PC98AudioPluginDriver::kType86);
@@ -333,7 +336,9 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
 
 	if (!digital) {
 		// Load MIDI/XMI resource data
-		if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) {
+		if (_vm->getGameId() == GID_ITE && _vm->getPlatform() == Common::Platform::kPlatformAmiga) {
+			playAmigaMod(resourceId, flags);
+		} else if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) {
 			// Load the external music file for Mac IHNM
 			playQuickTime(resourceId, flags);
 		} else {
@@ -465,9 +470,22 @@ void Music::playQuickTime(uint32 resourceId, MusicFlags flags) {
 	_parser->setTrack(0);
 }
 
+void Music::playAmigaMod(uint32 resourceId, MusicFlags flags) {
+	ByteArray ba;
+
+	_vm->_resource->loadResource(_musicContext, resourceId, ba);
+
+	Common::MemoryReadStream ms(ba.getBuffer(), ba.size());
+
+	/* No reference to the 'stream' object is kept, so you can safely delete it after
+	   invoking this factory. */
+	Audio::RewindableAudioStream *amigaModStream = Audio::makeModXmS3mStream(&ms, DisposeAfterUse::NO);
+
+	_mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle,
+			   Audio::makeLoopingAudioStream(amigaModStream, (flags == MUSIC_LOOP ? 0 : 1)));
+}
+
 void Music::playMidi(uint32 resourceId, MusicFlags flags) {
-	if (_vm->isITEAmiga()) // Not supported yet
-		return;
 	if (_currentMusicBuffer == &_musicBuffer[1]) {
 		_currentMusicBuffer = &_musicBuffer[0];
 	} else {
diff --git a/engines/saga/music.h b/engines/saga/music.h
index f710fe04ce2..33455220579 100644
--- a/engines/saga/music.h
+++ b/engines/saga/music.h
@@ -24,6 +24,7 @@
 #ifndef SAGA_MUSIC_H
 #define SAGA_MUSIC_H
 
+#include "audio/audiostream.h"
 #include "audio/mididrv.h"
 #include "audio/mididrv_ms.h"
 #include "audio/mt32gm.h"
@@ -96,6 +97,7 @@ private:
 	void onTimer();
 	bool playDigital(uint32 resourceId, MusicFlags flags);
 	void playQuickTime(uint32 resourceId, MusicFlags flags);
+	void playAmigaMod(uint32 resourceId, MusicFlags flags);
 	void playMidi(uint32 resourceId, MusicFlags flags);
 	void musicVolumeGauge();
 	ByteArray *_currentMusicBuffer;
diff --git a/engines/saga/resource.cpp b/engines/saga/resource.cpp
index e748af7205b..5cf6099f5c8 100644
--- a/engines/saga/resource.cpp
+++ b/engines/saga/resource.cpp
@@ -259,6 +259,8 @@ bool Resource::createContexts() {
 			addContext(gameFileDescription->fileName, gameFileDescription->fileType);
 		if ((gameFileDescription->fileType & GAME_RESOURCEFILE) && _vm->getPlatform() == Common::kPlatformAmiga && _vm->getGameId() == GID_ITE)
 			addContext(gameFileDescription->fileName, (gameFileDescription->fileType & ~GAME_RESOURCEFILE) | GAME_SCRIPTFILE | GAME_SWAPENDIAN);
+		if ((gameFileDescription->fileType & GAME_RESOURCEFILE) && _vm->getPlatform() == Common::kPlatformAmiga && _vm->getGameId() == GID_ITE)
+			addContext(gameFileDescription->fileName, (gameFileDescription->fileType & ~GAME_RESOURCEFILE) | GAME_MUSICFILE_FM);
 		if (gameFileDescription->fileType == GAME_SOUNDFILE) {
 			soundFileInArray = true;
 		}
@@ -451,6 +453,14 @@ void Resource::loadResource(ResourceContext *context, uint32 resourceId, ByteArr
 			warning("Uncompressed size mismatch in resource %d: %d vs %d", resourceId, unpackedLen, actualUncompressedLen);
 		}
 
+		if (context->fileType() & GAME_MUSICFILE_FM) {
+			byte b = 0;
+			for (uint32 i = 0; i < unpackedLen; i++) {
+				b += uncompressed[i];
+				uncompressed[i] = b;
+			}
+		}
+
 		// TODO: Use move semantics
 		resourceBuffer = ByteArray(uncompressed, actualUncompressedLen);
 		delete[] uncompressed;




More information about the Scummvm-git-logs mailing list