[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