[Scummvm-git-logs] scummvm master -> ed8852669adc29cdb989ca4d1ed94728de08a8b7

sev- noreply at scummvm.org
Wed Feb 21 17:45:32 UTC 2024


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

Summary:
ea03d64b62 AUDIO: Rename impulsetracker to universaltracker
15a9c63565 AUDIO: Add libopenmpt support
4da1a93e3a SLUDGE: Add support for MO3 files using libopenmpt
28883f9dfe AGS: Add support for libopenmpt
be904229ec AUDIO: Remove redundant probing function
ed8852669a TESTBED: Add testcase for mo3 files


Commit: ea03d64b62b4d12aece53c65cdb67b164e38feca
    https://github.com/scummvm/scummvm/commit/ea03d64b62b4d12aece53c65cdb67b164e38feca
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
AUDIO: Rename impulsetracker to universaltracker

Changed paths:
  A audio/mods/universaltracker.cpp
  A audio/mods/universaltracker.h
  R audio/mods/impulsetracker.cpp
  R audio/mods/impulsetracker.h
    engines/ags/engine/media/audio/sound.cpp
    engines/sludge/sound.cpp
    engines/testbed/sound.cpp


diff --git a/audio/mods/impulsetracker.cpp b/audio/mods/universaltracker.cpp
similarity index 100%
rename from audio/mods/impulsetracker.cpp
rename to audio/mods/universaltracker.cpp
diff --git a/audio/mods/impulsetracker.h b/audio/mods/universaltracker.h
similarity index 100%
rename from audio/mods/impulsetracker.h
rename to audio/mods/universaltracker.h
diff --git a/engines/ags/engine/media/audio/sound.cpp b/engines/ags/engine/media/audio/sound.cpp
index f83c3f0f35b..9f2f7fcf51b 100644
--- a/engines/ags/engine/media/audio/sound.cpp
+++ b/engines/ags/engine/media/audio/sound.cpp
@@ -30,7 +30,7 @@
 #include "ags/engine/media/audio/sound_clip.h"
 #include "ags/engine/media/audio/clip_my_midi.h"
 #include "ags/shared/core/asset_manager.h"
-#include "audio/mods/impulsetracker.h"
+#include "audio/mods/universaltracker.h"
 #include "audio/mods/mod_xm_s3m.h"
 #include "audio/mods/protracker.h"
 #include "audio/decoders/mp3.h"
diff --git a/engines/sludge/sound.cpp b/engines/sludge/sound.cpp
index 5381566e1de..8560e202db3 100644
--- a/engines/sludge/sound.cpp
+++ b/engines/sludge/sound.cpp
@@ -23,7 +23,7 @@
 #include "audio/decoders/wave.h"
 #include "audio/decoders/vorbis.h"
 #include "audio/mods/mod_xm_s3m.h"
-#include "audio/mods/impulsetracker.h"
+#include "audio/mods/universaltracker.h"
 
 #include "sludge/errors.h"
 #include "sludge/fileset.h"
diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp
index dbf3ccd6aa9..962743b19e7 100644
--- a/engines/testbed/sound.cpp
+++ b/engines/testbed/sound.cpp
@@ -21,7 +21,7 @@
 
 #include "audio/softsynth/pcspk.h"
 #include "audio/mods/mod_xm_s3m.h"
-#include "audio/mods/impulsetracker.h"
+#include "audio/mods/universaltracker.h"
 
 #include "backends/audiocd/audiocd.h"
 
@@ -220,6 +220,7 @@ TestExitStatus SoundSubsystem::modPlayback() {
 				mod = Audio::makeImpulseTrackerStream(&f, DisposeAfterUse::NO);
 		}
 #endif
+
 		if (!mod) {
 			Testsuite::displayMessage(Common::String::format("Could not load MOD file '%s'", music[i]));
 			f.close();


Commit: 15a9c63565c03c010aa890d97f1257a68d1491f1
    https://github.com/scummvm/scummvm/commit/15a9c63565c03c010aa890d97f1257a68d1491f1
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
AUDIO: Add libopenmpt support

Changed paths:
    audio/mods/universaltracker.cpp
    audio/mods/universaltracker.h
    audio/module.mk
    base/version.cpp
    configure
    devtools/create_project/cmake.cpp
    devtools/create_project/create_project.cpp
    devtools/create_project/msvc.cpp
    devtools/create_project/xcode.cpp
    engines/testbed/sound.cpp
    ports.mk
    vcpkg.json


diff --git a/audio/mods/universaltracker.cpp b/audio/mods/universaltracker.cpp
index bc8df733a50..95e8f6c23fe 100644
--- a/audio/mods/universaltracker.cpp
+++ b/audio/mods/universaltracker.cpp
@@ -33,12 +33,6 @@
 #define FORBIDDEN_SYMBOL_EXCEPTION_longjmp
 #endif
 
-#include "audio/mods/impulsetracker.h"
-
-#ifdef USE_MIKMOD
-
-#include <mikmod.h>
-
 #include "common/inttypes.h"
 #include "common/ptr.h"
 #include "common/stream.h"
@@ -48,8 +42,61 @@
 #include "audio/audiostream.h"
 #include "audio/decoders/raw.h"
 
-// Start memory wrapper
-// Extras, mikmod mreader struct to wrap readstream
+#ifdef USE_OPENMPT
+
+#include <libopenmpt/libopenmpt.h>
+
+#elif defined(USE_MIKMOD)
+
+#include <mikmod.h>
+
+#endif
+
+#ifdef USE_OPENMPT
+
+static size_t memoryReaderRead(void *stream, void *dst, size_t bytes) {
+	Common::SeekableReadStream *reader = (Common::SeekableReadStream *)stream;
+
+	if (!reader) {
+		return 0;
+	}
+
+	uint32 receivedBytes = reader->read(dst, bytes);
+
+	if (receivedBytes < bytes) {
+		return 0;
+	}
+
+	return receivedBytes;
+}
+
+static int memoryReaderSeek(void *stream, int64_t offset, int whence) {
+	Common::SeekableReadStream *reader = (Common::SeekableReadStream *)stream;
+
+	if (!reader) {
+		return -1;
+	}
+
+	bool ret = reader->seek(offset, whence);
+
+	if (ret)
+		return 0;
+
+	return -1;
+}
+
+static int64_t memoryReaderTell(void *stream) {
+	Common::SeekableReadStream *reader = (Common::SeekableReadStream *)stream;
+
+	if (reader) {
+		return reader->pos();
+	}
+
+	return -1;
+}
+
+#elif defined(USE_MIKMOD)
+
 typedef struct MikMemoryReader {
 	MREADER core;
 	Common::SeekableReadStream *stream;
@@ -131,11 +178,106 @@ static long memoryReaderTell(MREADER *reader) {
 }
 // End memory wrappper
 
+#endif // USE_MIKMOD
+
+#ifdef USE_OPENMPT
+
 namespace Audio {
-class ImpulseTrackerMod : public RewindableAudioStream {
+class UniversalTrackerMod : public RewindableAudioStream {
 public:
-	ImpulseTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse);
-	~ImpulseTrackerMod();
+	UniversalTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate);
+	~UniversalTrackerMod();
+
+	// ImpulseTrackerMod functions
+	bool isLoaded() {
+		return _mpt_load_successful;
+	}
+
+	int readBuffer(int16 *buffer, const int numSamples) override {
+		openmpt_module_read_interleaved_stereo(_mod, getRate(), numSamples / 2, buffer);
+
+		return numSamples;
+	}
+
+	bool isStereo() const override {
+		return true;
+	}
+
+	int getRate() const override {
+		return _sampleRate;
+	}
+
+	bool endOfData() const override {
+		return _stream->eos();
+	}
+
+	bool endOfStream() const override {
+		return endOfData();
+	}
+
+	// RewindableAudioStream API
+	bool rewind() override {
+		openmpt_module_set_position_seconds(_mod, 0.0);
+		return true;
+	}
+
+private:
+	DisposeAfterUse::Flag _dispose;
+	bool _mpt_load_successful = false;
+	Common::SeekableReadStream *_stream;
+	openmpt_module *_mod = nullptr;
+	int _sampleRate;
+};
+
+UniversalTrackerMod::UniversalTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate) {
+	if (!stream) {
+		warning("UniversalTrackerMod::UniversalTrackerMod(): Input file/stream is invalid.");
+		return;
+	}
+
+	int mod_err;
+	const char *mod_err_str = NULL;
+
+	_stream = stream;
+	_dispose = disposeAfterUse;
+	_sampleRate = rate;
+
+	openmpt_stream_callbacks stream_callbacks;
+	stream_callbacks.read = &memoryReaderRead;
+	stream_callbacks.seek = &memoryReaderSeek;
+	stream_callbacks.tell = &memoryReaderTell;
+
+	_mod = openmpt_module_create2(stream_callbacks, _stream, NULL, NULL, NULL, NULL, &mod_err, &mod_err_str, NULL);
+
+	if (!_mod) {
+		mod_err_str = openmpt_error_string(mod_err);
+		warning("UniversalTrackerMod::UniversalTrackerMod(): Parsing mod error: %s ", mod_err_str);
+		openmpt_free_string(mod_err_str);
+		return;
+	}
+
+	_mpt_load_successful = true;
+}
+
+UniversalTrackerMod::~UniversalTrackerMod() {
+	if (_mod)
+		openmpt_module_destroy(_mod);
+
+	if (_dispose == DisposeAfterUse::Flag::YES)
+		delete _stream;
+}
+
+} // End of namespace Audio
+
+#endif // #ifdef USE_OPENMPT
+
+#ifdef USE_MIKMOD
+
+namespace Audio {
+class UniversalTrackerMod : public RewindableAudioStream {
+public:
+	UniversalTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate);
+	~UniversalTrackerMod();
 
 	// ImpulseTrackerMod functions
 	bool isLoaded() {
@@ -154,7 +296,7 @@ public:
 		return true;
 	}
 	int getRate() const override {
-		return 44100;
+		return _sampleRate;
 	}
 	bool endOfData() const override {
 		return !Player_Active();
@@ -175,14 +317,17 @@ private:
 	Common::SeekableReadStream *_stream;
 	MREADER *_reader = nullptr;
 	MODULE *_mod = nullptr;
+	int _sampleRate;
 };
 
-ImpulseTrackerMod::ImpulseTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
+UniversalTrackerMod::UniversalTrackerMod(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate) {
 	if (!stream) {
-		warning("ImpulseTrackerMod::ImpulseTrackerMod(): Input file/stream is invalid.");
+		warning("UniversalTrackerMod::UniversalTrackerMod(): Input file/stream is invalid.");
 		return;
 	}
 
+	_sampleRate = rate;
+
 	MikMod_InitThreads();
 	MikMod_RegisterDriver(&drv_nos);
 
@@ -191,7 +336,7 @@ ImpulseTrackerMod::ImpulseTrackerMod(Common::SeekableReadStream *stream, Dispose
 	md_mixfreq = getRate();
 
 	if (MikMod_Init("")) {
-		warning("ImpulseTrackerMod::ImpulseTrackerMod(): Could not initialize sound, reason: %s",
+		warning("UniversalTrackerMod::UniversalTrackerMod(): Could not initialize sound, reason: %s",
 		        MikMod_strerror(MikMod_errno));
 		return;
 	}
@@ -206,7 +351,7 @@ ImpulseTrackerMod::ImpulseTrackerMod(Common::SeekableReadStream *stream, Dispose
 	_reader = createMikMemoryReader(_stream);
 	_mod = Player_LoadGeneric(_reader, 64, 0);
 	if (!_mod) {
-		warning("ImpulseTrackerMod::ImpulseTrackerMod(): Parsing mod error: %s", MikMod_strerror(MikMod_errno));
+		warning("UniversalTrackerMod::UniversalTrackerMod(): Parsing mod error: %s", MikMod_strerror(MikMod_errno));
 		return;
 	}
 
@@ -215,7 +360,7 @@ ImpulseTrackerMod::ImpulseTrackerMod(Common::SeekableReadStream *stream, Dispose
 	_mikmod_load_successful = true;
 }
 
-ImpulseTrackerMod::~ImpulseTrackerMod() {
+UniversalTrackerMod::~UniversalTrackerMod() {
 	Player_Stop();
 
 	if (_mod)
@@ -230,12 +375,16 @@ ImpulseTrackerMod::~ImpulseTrackerMod() {
 	MikMod_Exit();
 }
 
-RewindableAudioStream *makeImpulseTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
-	ImpulseTrackerMod *impulseTrackerMod = new ImpulseTrackerMod(stream, disposeAfterUse);
-	return impulseTrackerMod;
-}
 
-bool probeImpulseTracker(Common::SeekableReadStream *st) {
+} // End of namespace Audio
+
+#endif // #ifdef USE_MIKMOD
+
+namespace Audio {
+
+bool probeUniversalTracker(Common::SeekableReadStream *st) {
+#ifdef USE_MIKMOD
+
 	int32 setPos = st->pos();
 
 	// xm file
@@ -246,9 +395,45 @@ bool probeImpulseTracker(Common::SeekableReadStream *st) {
 		return true;
 	}
 
+#elif defined(USE_OPENMPT)
+
+	openmpt_stream_callbacks stream_callbacks;
+	stream_callbacks.read = &memoryReaderRead;
+	stream_callbacks.seek = &memoryReaderSeek;
+	stream_callbacks.tell = &memoryReaderTell;
+
+	uint result = openmpt_probe_file_header_from_stream(OPENMPT_PROBE_FILE_HEADER_FLAGS_DEFAULT, stream_callbacks, st, NULL, NULL, NULL, NULL, NULL, NULL);
+
+	if (result == OPENMPT_PROBE_FILE_HEADER_RESULT_SUCCESS) {
+		return true;
+	}
+
+#endif
+
 	return false;
 }
 
-} // End of namespace Audio
+RewindableAudioStream *makeUniversalTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate) {
 
-#endif // #ifdef USE_MIKMOD
+#if !defined(USE_OPENMPT) && !defined(USE_MIKMOD)
+	warning("Modplayer Support not compiled in");
+	return nullptr;
+#else
+
+	if (!probeUniversalTracker(stream)) {
+		return nullptr;
+	}
+
+	UniversalTrackerMod *impulseTrackerMod = new UniversalTrackerMod(stream, disposeAfterUse, rate);
+
+	if (!impulseTrackerMod->isLoaded()) {
+		delete impulseTrackerMod;
+		return nullptr;
+	}
+
+	return impulseTrackerMod;
+
+#endif
+}
+
+}
diff --git a/audio/mods/universaltracker.h b/audio/mods/universaltracker.h
index 178a8051efe..ed18adf6420 100644
--- a/audio/mods/universaltracker.h
+++ b/audio/mods/universaltracker.h
@@ -25,13 +25,15 @@
  *  - sludge
  */
 
-#ifndef AUDIO_IMPULSETRACKER_H
-#define AUDIO_IMPULSETRACKER_H
+#ifndef AUDIO_UNIVERSALTRACKER_H
+#define AUDIO_UNIVERSALTRACKER_H
 
 #include "common/scummsys.h"
 #include "common/types.h"
 
-#ifdef USE_MIKMOD
+#if defined(USE_MIKMOD) && defined(USE_OPENMPT)
+#error "MikMod and OpenMPT are mutually exclusive"
+#endif
 
 namespace Common {
 class SeekableReadStream;
@@ -47,14 +49,13 @@ class RewindableAudioStream;
  * @param disposeAfterUse   whether to delete the stream after use
  * @return  a new AudioStream, or NULL, if an error occurred
  */
-RewindableAudioStream *makeImpulseTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse);
+RewindableAudioStream *makeUniversalTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate = 48000);
 
 /**
  * Check if the stream is one of the supported formats
  */
-bool probeImpulseTracker(Common::SeekableReadStream *stream);
+bool probeUniversalTracker(Common::SeekableReadStream *stream);
 
 } // End of namespace Audio
 
-#endif // #ifdef USE_MIKMOD
-#endif // #ifndef AUDIO_IMPULSETRACKER_H
+#endif // #ifndef AUDIO_UNIVERSALTRACKER_H
diff --git a/audio/module.mk b/audio/module.mk
index 8d671571203..8f7e9a77af3 100644
--- a/audio/module.mk
+++ b/audio/module.mk
@@ -43,7 +43,7 @@ MODULE_OBJS := \
 	decoders/wma.o \
 	decoders/xa.o \
 	decoders/xan_dpcm.o \
-	mods/impulsetracker.o \
+	mods/universaltracker.o \
 	mods/infogrames.o \
 	mods/maxtrax.o \
 	mods/mod_xm_s3m.o \
diff --git a/base/version.cpp b/base/version.cpp
index f995f9dc36d..2e35544357e 100644
--- a/base/version.cpp
+++ b/base/version.cpp
@@ -145,6 +145,10 @@ const char gScummVMFeatures[] = ""
 	"MikMod "
 #endif
 
+#ifdef USE_OPENMPT
+	"OpenMPT "
+#endif
+
 #ifdef USE_THEORADEC
 	"Theora "
 #endif
diff --git a/configure b/configure
index b0d5d200cc9..a6e8e025211 100755
--- a/configure
+++ b/configure
@@ -170,6 +170,7 @@ _tinygl=yes
 _readline=auto
 _freetype2=auto
 _libmikmod=auto
+_libopenmpt=auto
 _taskbar=auto
 _updates=no
 _libunity=auto
@@ -254,6 +255,7 @@ _sdlpath="$PATH"
 _freetypepath="$PATH"
 _libcurlpath="$PATH"
 _libmikmodpath="$PATH"
+_libopenmptpath="$PATH"
 _nasmpath="$PATH"
 NASMFLAGS=""
 NASM=""
@@ -1026,6 +1028,9 @@ Optional Libraries:
   --with-mikmod-prefix=DIR    Prefix where libmikmod is installed (optional)
   --enable-mikmod             enable mikmod module for playing various sound formats like impulsetracker [autodetect]
 
+  --with-openmpt-prefix=DIR    Prefix where libopenmpt is installed (optional)
+  --enable-openmpt             enable openmpt module for playing various sound formats like impulsetracker [autodetect]
+
   --with-a52-prefix=DIR    Prefix where liba52 is installed (optional)
   --enable-a52             enable a52 codec for MPEG decoder [autodetect]
 
@@ -1221,6 +1226,8 @@ for ac_option in $@; do
 	--disable-mpeg2)              _mpeg2=no              ;;
 	--enable-mikmod)              _libmikmod=yes         ;;
 	--disable-mikmod)             _libmikmod=no          ;;
+	--enable-openmpt)             _libopenmpt=yes        ;;
+	--disable-openmpt)            _libopenmpt=no         ;;
 	--enable-a52)                 _a52=yes               ;;
 	--disable-a52)                _a52=no                ;;
 	--disable-jpeg)               _jpeg=no               ;;
@@ -1535,6 +1542,10 @@ for ac_option in $@; do
 		arg=`echo $ac_option | cut -d '=' -f 2`
 		_libmikmodpath="$arg:$arg/bin"
 		;;
+	--with-openmpt-prefix=*)
+		arg=`echo $ac_option | cur -d '=' -f 2`
+		_libopenmptpath="$arg:$arg/bin"
+		;;
 	--with-nasm-prefix=*)
 		arg=`echo $ac_option | cut -d '=' -f 2`
 		_nasmpath="$arg:$arg/bin"
@@ -5809,6 +5820,50 @@ echo "$_libcurl"
 
 define_in_config_if_yes "$_libcurl" "USE_LIBCURL"
 
+#
+# Check for libopenmpt to be present
+#
+if test "$_libopenmpt" != "no"; then
+	echocheck "libopenmpt"
+
+	if test "$_pkg_config" = "yes" && $_pkgconfig --exists libopenmpt; then
+		append_var LIBOPENMPT_LIBS "`$_pkgconfig --libs libopenmpt`"
+		append_var LIBOPENMPT_CFLAGS "`$_pkgconfig --cflags libopenmpt`"
+	else
+		append_var LIBOPENMPT_LIBS "-lopenmpt"
+	fi
+
+	if test "$_libopenmpt" = "auto"; then
+		_libopenmpt=no
+		cat > $TMPC << EOF
+		#include <libopenmpt/libopenmpt.h>
+		#include <libopenmpt/libopenmpt_stream_callbacks_file.h>
+		int main(void) {
+			openmpt_module *mod = 0;
+			FILE *file = 0;
+
+			file = fopen("abc", "rb");
+			mod = openmpt_module_create2( openmpt_stream_get_file_callbacks2(), file, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
+
+			fclose(file);
+			return 0;
+		}
+EOF
+		cc_check $LIBOPENMPT_CFLAGS $LIBOPENMPT_LIBS && _libopenmpt=yes
+	fi
+
+	if test "$_libopenmpt" = "yes"; then
+		append_var LIBS "$LIBOPENMPT_LIBS"
+		append_var INCLUDES "$LIBOPENMPT_CFLAGS"
+
+		# Skip mikmod detection if openmpt is detected
+		_libmikmod=no
+	fi
+
+	define_in_config_if_yes "$_libopenmpt" "USE_OPENMPT"
+	echo "$_libopenmpt"
+fi
+
 #
 # Check for libmikmod to be present
 #
diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp
index e3763f86860..3f25396bd67 100644
--- a/devtools/create_project/cmake.cpp
+++ b/devtools/create_project/cmake.cpp
@@ -49,6 +49,7 @@ const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *f
 		LibraryProps("flac", "flac").Libraries("FLAC"),
 		LibraryProps("mad", "mad").Libraries("mad"),
 		LibraryProps("mikmod", "mikmod").Libraries("mikmod"),
+		LibraryProps("openmpt", "openmpt").Libraries("openmpt"),
 		LibraryProps("ogg", "ogg").Libraries("ogg"),
 		LibraryProps("vorbis", "vorbisfile vorbis").Libraries("vorbisfile vorbis"),
 		LibraryProps("tremor", "vorbisidec").Libraries("vorbisidec"),
diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp
index 48c180b1252..e315c090314 100644
--- a/devtools/create_project/create_project.cpp
+++ b/devtools/create_project/create_project.cpp
@@ -1088,6 +1088,7 @@ const Feature s_features[] = {
 	{       "gif",         "USE_GIF", true, false, "libgif support" },
 	{      "faad",        "USE_FAAD", true, false, "AAC support" },
 	{    "mikmod",      "USE_MIKMOD", true, false, "libmikmod support" },
+	{   "openmpt",     "USE_OPENMPT", true, false, "libopenmpt support" },
 	{     "mpeg2",       "USE_MPEG2", true, true,  "MPEG-2 support" },
 	{ "theoradec",   "USE_THEORADEC", true, true,  "Theora decoding support" },
 	{       "vpx",         "USE_VPX", true, false, "VP8/VP9 decoding support" },
diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp
index aa667a005e2..97e3966c419 100644
--- a/devtools/create_project/msvc.cpp
+++ b/devtools/create_project/msvc.cpp
@@ -64,6 +64,7 @@ std::string MSVCProvider::getLibraryFromFeature(const char *feature, const Build
 		{       "gif", "gif.lib",                   nullptr,         nullptr                                           },
 		{      "faad", "faad.lib",                  nullptr,         nullptr                                           },
 		{    "mikmod", "mikmod.lib",                nullptr,         nullptr                                           },
+		{   "openmpt", "openmpt.lib",               nullptr,         nullptr                                           },
 		{     "mpeg2", "mpeg2.lib",                 nullptr,         nullptr                                           },
 		{ "theoradec", "theora.lib",                nullptr,         nullptr                                           },
 		{       "vpx", "vpx.lib",                   nullptr,         nullptr                                           },
diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp
index ed581b298ca..74198561ee3 100644
--- a/devtools/create_project/xcode.cpp
+++ b/devtools/create_project/xcode.cpp
@@ -532,6 +532,10 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 		DEF_LOCALLIB_STATIC("libmikmod");
 		DEF_LOCALXCFRAMEWORK("mikmod", projectOutputDirectory);
 	}
+	if (CONTAINS_DEFINE(setup.defines, "USE_OPENMPT")) {
+		DEF_LOCALLIB_STATIC("libopenmpt");
+		DEF_LOCALXCFRAMEWORK("openmpt", projectOutputDirectory);
+	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_MPEG2")) {
 		DEF_LOCALLIB_STATIC("libmpeg2");
 		DEF_LOCALXCFRAMEWORK("mpeg2", projectOutputDirectory);
@@ -667,6 +671,9 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 	if (CONTAINS_DEFINE(setup.defines, "USE_MIKMOD")) {
 		frameworks_iOS.push_back(getLibString("mikmod", setup.useXCFramework));
 	}
+	if (CONTAINS_DEFINE(setup.defines, "USE_OPENMPT")) {
+		frameworks_iOS.push_back(getLibString("openmpt", setup.useXCFramework));
+	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_MPEG2")) {
 		frameworks_iOS.push_back(getLibString("mpeg2", setup.useXCFramework));
 	}
@@ -767,6 +774,9 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 	if (CONTAINS_DEFINE(setup.defines, "USE_MIKMOD")) {
 		frameworks_osx.push_back("libmikmod.a");
 	}
+	if (CONTAINS_DEFINE(setup.defines, "USE_OPENMPT")) {
+		frameworks_osx.push_back("libopenmpt.a");
+	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_MPEG2")) {
 		frameworks_osx.push_back(getLibString("mpeg2", setup.useXCFramework));
 	}
@@ -895,6 +905,9 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 	if (CONTAINS_DEFINE(setup.defines, "USE_MIKMOD")) {
 		frameworks_tvOS.push_back(getLibString("mikmod", setup.useXCFramework));
 	}
+	if (CONTAINS_DEFINE(setup.defines, "USE_OPENMPT")) {
+		frameworks_tvOS.push_back(getLibString("openmpt", setup.useXCFramework));
+	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_MPEG2")) {
 		frameworks_tvOS.push_back(getLibString("mpeg2", setup.useXCFramework));
 	}
diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp
index 962743b19e7..388dc0d5b11 100644
--- a/engines/testbed/sound.cpp
+++ b/engines/testbed/sound.cpp
@@ -214,12 +214,9 @@ TestExitStatus SoundSubsystem::modPlayback() {
 		if (Audio::probeModXmS3m(&f))
 			mod = Audio::makeModXmS3mStream(&f, DisposeAfterUse::NO);
 
-#ifdef USE_MIKMOD
 		if (!mod) {
-			if (Audio::probeImpulseTracker(&f))
-				mod = Audio::makeImpulseTrackerStream(&f, DisposeAfterUse::NO);
+			mod = Audio::makeUniversalTrackerStream(&f, DisposeAfterUse::NO);
 		}
-#endif
 
 		if (!mod) {
 			Testsuite::displayMessage(Common::String::format("Could not load MOD file '%s'", music[i]));
diff --git a/ports.mk b/ports.mk
index 854ee2013fd..871282e1cd3 100644
--- a/ports.mk
+++ b/ports.mk
@@ -513,6 +513,10 @@ ifdef USE_MIKMOD
 OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libmikmod.a
 endif
 
+ifdef USE_OPENMPT
+OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libopenmpt.a
+endif
+
 ifdef USE_MPEG2
 OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libmpeg2.a
 endif
diff --git a/vcpkg.json b/vcpkg.json
index 363a2dab5b6..c7affcf886e 100644
--- a/vcpkg.json
+++ b/vcpkg.json
@@ -13,6 +13,7 @@
     "libjpeg-turbo",
     "libmad",
     "libmikmod",
+    "libopenmpt",
     "libmpeg2",
     "libogg",
     "libpng",


Commit: 4da1a93e3af3157d18e85cea757cbc0a5afb97bf
    https://github.com/scummvm/scummvm/commit/4da1a93e3af3157d18e85cea757cbc0a5afb97bf
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
SLUDGE: Add support for MO3 files using libopenmpt

Changed paths:
    engines/sludge/sound.cpp


diff --git a/engines/sludge/sound.cpp b/engines/sludge/sound.cpp
index 8560e202db3..8760dcaf8c8 100644
--- a/engines/sludge/sound.cpp
+++ b/engines/sludge/sound.cpp
@@ -228,12 +228,11 @@ bool SoundManager::playMOD(int f, int a, int fromTrack) {
 
 	if (Audio::probeModXmS3m(memImage))
 		mod = Audio::makeModXmS3mStream(memImage, DisposeAfterUse::NO, fromTrack);
-#ifdef USE_MIKMOD
+
 	if (!mod) {
-		if (Audio::probeImpulseTracker(memImage))
-			mod = Audio::makeImpulseTrackerStream(memImage, DisposeAfterUse::NO);
+		mod = Audio::makeUniversalTrackerStream(memImage, DisposeAfterUse::NO, g_sludge->_mixer->getOutputRate());
 	}
-#endif
+
 	if (!mod) {
 		warning("Could not load MOD file");
 		g_sludge->_resMan->finishAccess();


Commit: 28883f9dfec453e3dd20afc6ef2bbe5128c9e019
    https://github.com/scummvm/scummvm/commit/28883f9dfec453e3dd20afc6ef2bbe5128c9e019
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
AGS: Add support for libopenmpt

Changed paths:
    engines/ags/engine/media/audio/sound.cpp


diff --git a/engines/ags/engine/media/audio/sound.cpp b/engines/ags/engine/media/audio/sound.cpp
index 9f2f7fcf51b..6a1570a7e08 100644
--- a/engines/ags/engine/media/audio/sound.cpp
+++ b/engines/ags/engine/media/audio/sound.cpp
@@ -111,13 +111,12 @@ SOUNDCLIP *my_load_mod(const AssetPath &asset_name, bool loop) {
 		Audio::AudioStream *audioStream = nullptr;
 		if (charAfterDot == 'I') {
 			// Impulse Tracker
-#ifdef USE_MIKMOD
-			audioStream = Audio::makeImpulseTrackerStream(data, DisposeAfterUse::YES);
-#else
-			warning("MIKMOD support was not compiled in! Skipping Impulse Tracker audio");
-			audioStream = Audio::makeSilentAudioStream(22050, true);
-			delete data;
-#endif
+			audioStream = Audio::makeUniversalTrackerStream(data, DisposeAfterUse::YES);
+			if (!audioStream) {
+				audioStream = Audio::makeSilentAudioStream(22050, true);
+				delete data;
+			}
+
 		} else if (charAfterDot == 'X') {
 			audioStream = Audio::makeModXmS3mStream(data, DisposeAfterUse::YES);
 		} else if (charAfterDot == 'S') {


Commit: be904229ec7561d3e200e1cee6a762afe37abbf5
    https://github.com/scummvm/scummvm/commit/be904229ec7561d3e200e1cee6a762afe37abbf5
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
AUDIO: Remove redundant probing function

since checking whether a particular format is supported is checked
within the constructor, a separate probing function is not required

Changed paths:
    audio/mods/universaltracker.cpp
    audio/mods/universaltracker.h


diff --git a/audio/mods/universaltracker.cpp b/audio/mods/universaltracker.cpp
index 95e8f6c23fe..cdf31ce326d 100644
--- a/audio/mods/universaltracker.cpp
+++ b/audio/mods/universaltracker.cpp
@@ -382,37 +382,6 @@ UniversalTrackerMod::~UniversalTrackerMod() {
 
 namespace Audio {
 
-bool probeUniversalTracker(Common::SeekableReadStream *st) {
-#ifdef USE_MIKMOD
-
-	int32 setPos = st->pos();
-
-	// xm file
-	char sigIt[4] = { 0 };
-	st->read(sigIt, 4);
-	st->seek(setPos);
-	if (!memcmp(sigIt, "IMPM", 4)) {
-		return true;
-	}
-
-#elif defined(USE_OPENMPT)
-
-	openmpt_stream_callbacks stream_callbacks;
-	stream_callbacks.read = &memoryReaderRead;
-	stream_callbacks.seek = &memoryReaderSeek;
-	stream_callbacks.tell = &memoryReaderTell;
-
-	uint result = openmpt_probe_file_header_from_stream(OPENMPT_PROBE_FILE_HEADER_FLAGS_DEFAULT, stream_callbacks, st, NULL, NULL, NULL, NULL, NULL, NULL);
-
-	if (result == OPENMPT_PROBE_FILE_HEADER_RESULT_SUCCESS) {
-		return true;
-	}
-
-#endif
-
-	return false;
-}
-
 RewindableAudioStream *makeUniversalTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate) {
 
 #if !defined(USE_OPENMPT) && !defined(USE_MIKMOD)
@@ -420,10 +389,6 @@ RewindableAudioStream *makeUniversalTrackerStream(Common::SeekableReadStream *st
 	return nullptr;
 #else
 
-	if (!probeUniversalTracker(stream)) {
-		return nullptr;
-	}
-
 	UniversalTrackerMod *impulseTrackerMod = new UniversalTrackerMod(stream, disposeAfterUse, rate);
 
 	if (!impulseTrackerMod->isLoaded()) {
diff --git a/audio/mods/universaltracker.h b/audio/mods/universaltracker.h
index ed18adf6420..c3a9af25963 100644
--- a/audio/mods/universaltracker.h
+++ b/audio/mods/universaltracker.h
@@ -51,11 +51,6 @@ class RewindableAudioStream;
  */
 RewindableAudioStream *makeUniversalTrackerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate = 48000);
 
-/**
- * Check if the stream is one of the supported formats
- */
-bool probeUniversalTracker(Common::SeekableReadStream *stream);
-
 } // End of namespace Audio
 
 #endif // #ifndef AUDIO_UNIVERSALTRACKER_H


Commit: ed8852669adc29cdb989ca4d1ed94728de08a8b7
    https://github.com/scummvm/scummvm/commit/ed8852669adc29cdb989ca4d1ed94728de08a8b7
Author: polyesterswing (kurianjojo2004 at gmail.com)
Date: 2024-02-21T18:45:25+01:00

Commit Message:
TESTBED: Add testcase for mo3 files

Changed paths:
  A dists/engine-data/testbed-audiocd-files/README.md
  A dists/engine-data/testbed-audiocd-files/music0038.mo3
    engines/testbed/sound.cpp


diff --git a/dists/engine-data/testbed-audiocd-files/README.md b/dists/engine-data/testbed-audiocd-files/README.md
new file mode 100644
index 00000000000..515ffa46001
--- /dev/null
+++ b/dists/engine-data/testbed-audiocd-files/README.md
@@ -0,0 +1,8 @@
+The following files are from Out of Order
+- music0077.it
+- music0078.it
+- music0167.xm
+- music0360.xm
+
+The following files are from Frasse and the Peas of Kejick
+- music0038.mo3
diff --git a/dists/engine-data/testbed-audiocd-files/music0038.mo3 b/dists/engine-data/testbed-audiocd-files/music0038.mo3
new file mode 100644
index 00000000000..022838b6ebd
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/music0038.mo3 differ
diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp
index 388dc0d5b11..ad3d6453944 100644
--- a/engines/testbed/sound.cpp
+++ b/engines/testbed/sound.cpp
@@ -179,6 +179,7 @@ TestExitStatus SoundSubsystem::mixSounds() {
 const char *music[] = {
 	"music0167.xm",
 	"music0360.xm",
+	"music0038.mo3",
 	"music0077.it",
 	"music0078.it",
 	0
@@ -188,7 +189,7 @@ TestExitStatus SoundSubsystem::modPlayback() {
 	Testsuite::clearScreen();
 	TestExitStatus passed = kTestPassed;
 	Common::String info = "Testing Module Playback\n"
-			"You should hear 4 melodies\n";
+			"You should hear 5 melodies\n";
 
 	if (Testsuite::handleInteractiveInput(info, "OK", "Skip", kOptionRight)) {
 		Testsuite::logPrintf("Info! Skipping test : Mod Playback\n");




More information about the Scummvm-git-logs mailing list