[Scummvm-git-logs] scummvm master -> 2542c923592631c0bcdc2e2d1f50bc92a142a3c7

dreammaster noreply at scummvm.org
Tue Feb 11 04:18:54 UTC 2025


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:
2542c92359 M4: RIDDLE: Attempts at implementing music playback, console command


Commit: 2542c923592631c0bcdc2e2d1f50bc92a142a3c7
    https://github.com/scummvm/scummvm/commit/2542c923592631c0bcdc2e2d1f50bc92a142a3c7
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2025-02-10T20:18:48-08:00

Commit Message:
M4: RIDDLE: Attempts at implementing music playback, console command

Changed paths:
    engines/m4/adv_r/adv_file.cpp
    engines/m4/adv_r/adv_file.h
    engines/m4/console.cpp
    engines/m4/console.h
    engines/m4/platform/sound/midi.cpp
    engines/m4/platform/sound/midi.h


diff --git a/engines/m4/adv_r/adv_file.cpp b/engines/m4/adv_r/adv_file.cpp
index 5132c54550d..c9b42698dba 100644
--- a/engines/m4/adv_r/adv_file.cpp
+++ b/engines/m4/adv_r/adv_file.cpp
@@ -408,4 +408,8 @@ Common::String expand_name_2_RAW(const Common::String &name, int32 room_num) {
 	}
 }
 
+Common::String expand_name_2_HMP(const Common::String &name, int32 room_num) {
+	return f_extension_new(name, "HMP");
+}
+
 } // End of namespace M4
diff --git a/engines/m4/adv_r/adv_file.h b/engines/m4/adv_r/adv_file.h
index 8847e662339..e8dddf256d1 100644
--- a/engines/m4/adv_r/adv_file.h
+++ b/engines/m4/adv_r/adv_file.h
@@ -32,29 +32,30 @@
 
 namespace M4 {
 
-M4sprite *kernel_CreateThumbnail(int32 *spriteSize);
-bool kernel_CreateSSFromGrBuff(GrBuff *myBuff, RGB8 *myPalette, bool completePal, const char *ssName);
+extern M4sprite *kernel_CreateThumbnail(int32 *spriteSize);
+extern bool kernel_CreateSSFromGrBuff(GrBuff *myBuff, RGB8 *myPalette, bool completePal, const char *ssName);
 
-bool kernel_load_room(int minPalEntry, int maxPalEntry, SceneDef *rdef, GrBuff **scr_orig_data, GrBuff **scr_orig);
-void kernel_unload_room(SceneDef *rdef, GrBuff **code_data, GrBuff **loadBuffer);
+extern bool kernel_load_room(int minPalEntry, int maxPalEntry, SceneDef *rdef, GrBuff **scr_orig_data, GrBuff **scr_orig);
+extern void kernel_unload_room(SceneDef *rdef, GrBuff **code_data, GrBuff **loadBuffer);
 
-int kernel_save_game(int slot, const char *desc, int32 sizeofDesc, M4sprite *thumbNail, int32 sizeofThumbData);
-bool kernel_load_game(int slot);
-bool kernel_save_game_exists(int32 slot);
-int32 extract_room_num(const Common::String &name);
+extern int kernel_save_game(int slot, const char *desc, int32 sizeofDesc, M4sprite *thumbNail, int32 sizeofThumbData);
+extern bool kernel_load_game(int slot);
+extern bool kernel_save_game_exists(int32 slot);
+extern int32 extract_room_num(const Common::String &name);
 
-bool kernel_load_variant(const char *variant);
-GrBuff *load_codes(SysFile *code_file);
-bool load_background(SysFile *pic_file, GrBuff **loadBuffer, RGB8 *palette);
+extern bool kernel_load_variant(const char *variant);
+extern GrBuff *load_codes(SysFile *code_file);
+extern bool load_background(SysFile *pic_file, GrBuff **loadBuffer, RGB8 *palette);
 
-bool load_picture_and_codes(SysFile *pic_file, SysFile *code_file, GrBuff **loadBuf, GrBuff **code_data, uint8 minPalEntry, uint8 maxPalEntry);
+extern bool load_picture_and_codes(SysFile *pic_file, SysFile *code_file, GrBuff **loadBuf, GrBuff **code_data, uint8 minPalEntry, uint8 maxPalEntry);
 
-bool kernel_load_code_variant(SceneDef *rdef, char *variant, GrBuff **codeData);
+extern bool kernel_load_code_variant(SceneDef *rdef, char *variant, GrBuff **codeData);
 
-void kernel_current_background_name(char *result);
-void kernel_current_codes_name(char *result);
-void screen_capture(RGB8 *masterPalette);
-Common::String expand_name_2_RAW(const Common::String &name, int32 room_num);
+extern void kernel_current_background_name(char *result);
+extern void kernel_current_codes_name(char *result);
+extern void screen_capture(RGB8 *masterPalette);
+extern Common::String expand_name_2_RAW(const Common::String &name, int32 room_num);
+extern Common::String expand_name_2_HMP(const Common::String &name, int32 room_num);
 
 } // End of namespace M4
 
diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp
index 3bb2fc7af0c..89a6a40bee8 100644
--- a/engines/m4/console.cpp
+++ b/engines/m4/console.cpp
@@ -35,6 +35,7 @@ Console::Console() : ::GUI::Debugger() {
 	registerCmd("cels",      WRAP_METHOD(Console, cmdCels));
 	registerCmd("cel",       WRAP_METHOD(Console, cmdCel));
 	registerCmd("interface", WRAP_METHOD(Console, cmdInterface));
+	registerCmd("music",     WRAP_METHOD(Console, cmdMusic));
 }
 
 bool Console::cmdTeleport(int argc, const char **argv) {
@@ -146,4 +147,15 @@ bool Console::cmdInterface(int argc, const char **argv) {
 	}
 }
 
+bool Console::cmdMusic(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("music <name>\n");
+		midi_play("ripthem1", 255, 0, -1, 999);
+		return true;
+	} else {
+		midi_play(argv[1], 255, 0, -1, 999);
+		return false;
+	}
+}
+
 } // End of namespace M4
diff --git a/engines/m4/console.h b/engines/m4/console.h
index a4bb2c86051..401bc9a9225 100644
--- a/engines/m4/console.h
+++ b/engines/m4/console.h
@@ -37,6 +37,7 @@ private:
 	bool cmdCels(int argc, const char **argv);
 	bool cmdCel(int argc, const char **argv);
 	bool cmdInterface(int argc, const char **argv);
+	bool cmdMusic(int argc, const char **argv);
 
 public:
 	Console();
diff --git a/engines/m4/platform/sound/midi.cpp b/engines/m4/platform/sound/midi.cpp
index d108bec7a76..70a204859a9 100644
--- a/engines/m4/platform/sound/midi.cpp
+++ b/engines/m4/platform/sound/midi.cpp
@@ -19,16 +19,66 @@
  *
  */
 
+#include "audio/midiparser.h"
 #include "m4/platform/sound/midi.h"
+#include "m4/adv_r/adv_file.h"
 #include "m4/vars.h"
 
 namespace M4 {
 namespace Sound {
 
+int Midi::_midiEndTrigger;
+
+Midi::Midi() {
+	Midi::createDriver();
+
+	int ret = _driver->open();
+	if (ret == 0) {
+		if (_nativeMT32)
+			_driver->sendMT32Reset();
+		else
+			_driver->sendGMReset();
+
+		_driver->setTimerCallback(this, &timerCallback);
+	}
+}
+
 void Midi::midi_play(const char *name, int volume, int loop, int trigger, int roomNum) {
-	warning("TODO: midi_play");
+	MemHandle workHandle;
+	int32 assetSize;
+
+	_midiEndTrigger = trigger;
+
+	// Load in the resource
+	Common::String fileName = expand_name_2_HMP(name, roomNum);
+	if ((workHandle = rget(fileName, &assetSize)) == nullptr)
+		error("Could not find music - %s", fileName.c_str());
+
+	HLock(workHandle);
+	byte *pSrc = (byte *)*workHandle;
+#ifdef TODO
+	MidiParser *parser = MidiParser::createParser_SMF();
+	bool loaded = parser->loadMusic(pSrc, assetSize);
+
+	if (loaded) {
+		stop();
+		parser->setTrack(0);
+		parser->setMidiDriver(this);
+		parser->setTimerRate(_driver->getBaseTempo());
+		parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
+
+		_parser = parser;
+		_isLooping = false;
+		_isPlaying = true;
+	}
+#else
+	// TODO: When music is properly implemented, trigger when music done
 	if (trigger != -1)
 		kernel_timing_trigger(10, trigger);
+#endif
+
+	HUnLock(workHandle);
+	rtoss(fileName);
 }
 
 void Midi::task() {
@@ -39,10 +89,6 @@ void Midi::loop() {
 	// No implementation
 }
 
-void Midi::stop() {
-	// No implementation
-}
-
 void Midi::set_overall_volume(int vol) {
 	// No implementation
 }
diff --git a/engines/m4/platform/sound/midi.h b/engines/m4/platform/sound/midi.h
index e84ddf08001..0c6ef46b791 100644
--- a/engines/m4/platform/sound/midi.h
+++ b/engines/m4/platform/sound/midi.h
@@ -23,17 +23,21 @@
 #ifndef M4_SOUND_PLATFORM_MIDI_H
 #define M4_SOUND_PLATFORM_MIDI_H
 
+#include "audio/midiplayer.h"
 #include "m4/m4_types.h"
 
 namespace M4 {
 namespace Sound {
 
-class Midi {
+class Midi : public Audio::MidiPlayer {
+private:
+	static int _midiEndTrigger;
 public:
+	Midi();
+
 	void midi_play(const char *name, int volume, int loop, int trigger, int roomNum);
 	void task();
 	void loop();
-	void stop();
 	void set_overall_volume(int vol);
 };
 




More information about the Scummvm-git-logs mailing list