[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