[Scummvm-git-logs] scummvm master -> 14a7cc7c182a997f0f5386e1b4c32972923052f1

athrxx noreply at scummvm.org
Fri Mar 8 03:00:05 UTC 2024


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

Summary:
74c3c69f71 SCUMM: (MI1/Mac) - minor sound player fixes
14a7cc7c18 SCUMM: (MI1/Mac) - add music quality slider


Commit: 74c3c69f715bbd16e6f74438cef61e91faad48b3
    https://github.com/scummvm/scummvm/commit/74c3c69f715bbd16e6f74438cef61e91faad48b3
Author: athrxx (athrxx at scummvm.org)
Date: 2024-03-08T03:59:17+01:00

Commit Message:
SCUMM: (MI1/Mac) - minor sound player fixes

Changed paths:
    engines/scumm/players/player_mac_loom_monkey.cpp
    engines/scumm/players/player_v5m.cpp


diff --git a/engines/scumm/players/player_mac_loom_monkey.cpp b/engines/scumm/players/player_mac_loom_monkey.cpp
index dfc3b8b065c..24ddbfaa847 100644
--- a/engines/scumm/players/player_mac_loom_monkey.cpp
+++ b/engines/scumm/players/player_mac_loom_monkey.cpp
@@ -44,8 +44,9 @@ public:
 	virtual bool init() = 0;
 	virtual bool checkResource(const byte *data, uint32 dataSize) const = 0;
 	virtual bool blocked(const byte *data, uint32 dataSize) const = 0;
-	virtual bool loadSound(byte synthType, const byte *data, uint32 dataSize) = 0;
+	virtual bool loadSound(const byte *data, uint32 dataSize) = 0;
 	virtual void unblock() = 0;
+	void setSynthType(byte type) { _synth = type; }
 
 	const MacLowLevelPCMDriver::PCMSound *getInstrData(uint16 chan);
 	virtual bool isInstrUsable(uint16 chan) const = 0;
@@ -104,7 +105,7 @@ public:
 	bool init() override;
 	bool checkResource(const byte *data, uint32 dataSize) const override;
 	bool blocked(const byte *data, uint32 dataSize) const override { return false; }
-	bool loadSound(byte synthType, const byte *data, uint32 dataSize) override;
+	bool loadSound(const byte *data, uint32 dataSize) override;
 	void unblock() override {}
 
 	bool isInstrUsable(uint16 chan) const override;
@@ -125,7 +126,7 @@ public:
 	bool init() override;
 	bool checkResource(const byte *data, uint32 dataSize) const override;
 	bool blocked(const byte *data, uint32 dataSize) const override;
-	bool loadSound(byte synthType, const byte *data, uint32 dataSize) override;
+	bool loadSound(const byte *data, uint32 dataSize) override;
 	void unblock() override { _blockSfx = false; }
 
 	bool isInstrUsable(uint16 chan) const override;
@@ -240,7 +241,7 @@ bool LoomMacSndLoader::checkResource(const byte *data, uint32 dataSize) const {
 	return (dataSize >= 14 && READ_BE_UINT16(data + 4) == 'so' && !READ_BE_UINT32(data + 10));
 }
 
-bool LoomMacSndLoader::loadSound(byte synthType, const byte *data, uint32 dataSize) {
+bool LoomMacSndLoader::loadSound(const byte *data, uint32 dataSize) {
 	if (dataSize < 40)
 		return false;
 
@@ -256,8 +257,6 @@ bool LoomMacSndLoader::loadSound(byte synthType, const byte *data, uint32 dataSi
 		_chanCurEvent[i] = 0;
 	}
 
-	_synth = synthType;
-
 	return true;
 }
 
@@ -308,7 +307,7 @@ bool MonkeyMacSndLoader::blocked(const byte *data, uint32 dataSize) const {
 	return (dataSize < 14 || (_blockSfx && !data[13]));
 }
 
-bool MonkeyMacSndLoader::loadSound(byte synthType, const byte *data, uint32 dataSize) {
+bool MonkeyMacSndLoader::loadSound(const byte *data, uint32 dataSize) {
 	if (dataSize < 32)
 		return false;
 
@@ -345,7 +344,6 @@ bool MonkeyMacSndLoader::loadSound(byte synthType, const byte *data, uint32 data
 	}
 
 	_blockSfx = (_isMusic && _loop);
-	_synth = synthType;
 
 	return true;
 }
@@ -504,8 +502,8 @@ void LoomMonkeyMacSnd::setSfxVolume(int vol) {
 }
 
 void LoomMonkeyMacSnd::startSound(int id, int jumpToTick) {
-	if (_sdrv == nullptr || id < 0 || id >= _idRangeMax) {
-		warning("LoomMonkeyMacSnd::startSound(): sound id '%d' out of range (0 - %d)", id, _idRangeMax - 1);
+	if (_sdrv == nullptr || id < 1 || id >= _idRangeMax) {
+		warning("LoomMonkeyMacSnd::startSound(): sound id '%d' out of range (1 - %d)", id, _idRangeMax - 1);
 		return;
 	}
 
@@ -530,7 +528,7 @@ void LoomMonkeyMacSnd::startSound(int id, int jumpToTick) {
 	if (!_defaultChanConfig)
 		detectQuality();
 
-	if (!_loader->loadSound(_curSynthType, ptr, size)) {
+	if (!_loader->loadSound(ptr, size)) {
 		warning("LoomMonkeyMacSnd::startSound(): Sound resource '%d' cannot be played", id);
 		return;
 	}
@@ -668,9 +666,9 @@ const MacSoundDriver::Status &LoomMonkeyMacSnd::getDriverStatus(uint8, Audio::Mi
 }
 
 void LoomMonkeyMacSnd::sndChannelCallback(uint16 arg1, const void*) {
-	// We do this a little smarter than the original player which would stop the track immediately when
-	// the first channel invoked its end-of-track callback. This would cut of the playback early, in an
-	// unpleasant way. Instead, we stop the playback not before all channels have finished.
+	// The original Loom player stops the track immediately when the first channel invoked its end-of-track
+	// callback. This cuts of the playback early, in an unpleasant way. The Monkey Island player stops the
+	// playback not before all channels have finished. We do the same here for both games.
 	_chanPlaying &= ~arg1;
 	if (_chanPlaying)
 		return;
@@ -796,6 +794,7 @@ void LoomMonkeyMacSnd::setupChannels() {
 		_curSynthType = synthType[_curChanConfig];
 		_chanUse = numChan[_curChanConfig];
 		_lastSndType = _curSndType;
+		_loader->setSynthType(_curSynthType);
 
 		switch (_curSynthType) {
 		case 1:
diff --git a/engines/scumm/players/player_v5m.cpp b/engines/scumm/players/player_v5m.cpp
index 3126984e92e..46c0d79436d 100644
--- a/engines/scumm/players/player_v5m.cpp
+++ b/engines/scumm/players/player_v5m.cpp
@@ -83,6 +83,7 @@ namespace Scumm {
 Player_V5M::Player_V5M(ScummEngine *scumm, Audio::Mixer *mixer)
 	: Player_Mac(scumm, mixer, 3, 0x07, false) {
 	assert(_vm->_game.id == GID_MONKEY);
+	memset(_lastNoteSamples, 0, sizeof(_lastNoteSamples));
 	_lastVersionBeforeSaveFormatChange = VER(114);
 }
 


Commit: 14a7cc7c182a997f0f5386e1b4c32972923052f1
    https://github.com/scummvm/scummvm/commit/14a7cc7c182a997f0f5386e1b4c32972923052f1
Author: athrxx (athrxx at scummvm.org)
Date: 2024-03-08T03:59:22+01:00

Commit Message:
SCUMM: (MI1/Mac) - add music quality slider

The layout is not good and needs more work. I haven't
yet understood how the theme layout code has to be used.
I commit this nonetheless, since it is the only way to access
the music quality settings for MI1.

Changed paths:
    engines/scumm/dialogs.cpp
    engines/scumm/dialogs.h
    engines/scumm/metaengine.cpp


diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp
index 52e3c80f1a3..e00c08ccf1f 100644
--- a/engines/scumm/dialogs.cpp
+++ b/engines/scumm/dialogs.cpp
@@ -1370,24 +1370,26 @@ void LoomEgaGameOptionsWidget::updateOvertureTicksValue() {
 	_overtureTicksValue->setLabel(Common::String::format("%d:%02d.%d", ticks / 600, (ticks % 600) / 10, ticks % 10));
 }
 
-// Mac Loom options
-LoomMacGameOptionsWidget::LoomMacGameOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain) :
-	ScummOptionsContainerWidget(boss, name, "LoomMacGameOptionsWidget", domain), _sndQualitySlider(nullptr), _sndQualityValue(nullptr), _enableOriginalGUICheckbox(nullptr), _quality(0) {
-	GUI::StaticTextWidget *text = new GUI::StaticTextWidget(widgetsBoss(), "LoomMacGameOptionsWidget.SndQualityLabel", _("Music Quality:"));
+// Mac Loom/MI1 options
+LoomMonkeyMacGameOptionsWidget::LoomMonkeyMacGameOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain, int gameId) :
+	ScummOptionsContainerWidget(boss, name, "LoomMonkeyMacGameOptionsWidget", domain), _sndQualitySlider(nullptr), _sndQualityValue(nullptr), _enableOriginalGUICheckbox(nullptr), _quality(0) {
+	GUI::StaticTextWidget *text = new GUI::StaticTextWidget(widgetsBoss(), "LoomMonkeyMacGameOptionsWidget.SndQualityLabel", _("Music Quality:"));
 	text->setAlign(Graphics::TextAlign::kTextAlignEnd);
 
-	_sndQualitySlider = new GUI::SliderWidget(widgetsBoss(), "LoomMacGameOptionsWidget.SndQuality", _("Select music quality. The original would determine the basic setup by hardware detection and speed tests, but it could also be changed in the game menu to some degree."), kQualitySliderUpdate);
-	_sndQualitySlider->setMinValue(0);
+	_sndQualitySlider = new GUI::SliderWidget(widgetsBoss(), "LoomMonkeyMacGameOptionsWidget.SndQuality", gameId == GID_MONKEY ?
+		_("Select music quality. The original lets you choose this from the Game menu.") :
+		_("Select music quality. The original determines the basic setup by hardware detection and speed tests, "
+			"but also allows changes through the Game menu to some degree."), kQualitySliderUpdate);
+	_sndQualitySlider->setMinValue(gameId == GID_MONKEY ? 6 : 0);
 	_sndQualitySlider->setMaxValue(9);
-	_sndQualityValue = new GUI::StaticTextWidget(widgetsBoss(), "LoomMacGameOptionsWidget.SndQualityValue", Common::U32String());
+	_sndQualityValue = new GUI::StaticTextWidget(widgetsBoss(), "LoomMonkeyMacGameOptionsWidget.SndQualityValue", Common::U32String());
 	_sndQualityValue->setFlags(GUI::WIDGET_CLEARBG);
 	updateQualitySlider();
-
-	createEnhancementsWidget(widgetsBoss(), "LoomMacGameOptionsWidget");
-	_enableOriginalGUICheckbox = createOriginalGUICheckbox(widgetsBoss(), "LoomMacGameOptionsWidget.EnableOriginalGUI");
+	createEnhancementsWidget(widgetsBoss(), "LoomMonkeyMacGameOptionsWidget");
+	_enableOriginalGUICheckbox = createOriginalGUICheckbox(widgetsBoss(), "LoomMonkeyMacGameOptionsWidget.EnableOriginalGUI");
 }
 
-void LoomMacGameOptionsWidget::load() {
+void LoomMonkeyMacGameOptionsWidget::load() {
 	ScummOptionsContainerWidget::load();
 
 	_quality = 0;
@@ -1407,14 +1409,14 @@ void LoomMacGameOptionsWidget::load() {
 	_enableOriginalGUICheckbox->setState(ConfMan.getBool("original_gui", _domain));
 }
 
-bool LoomMacGameOptionsWidget::save() {
+bool LoomMonkeyMacGameOptionsWidget::save() {
 	bool res = ScummOptionsContainerWidget::save();
 	ConfMan.setInt("mac_snd_quality", _quality, _domain);
 	ConfMan.setBool("original_gui", _enableOriginalGUICheckbox->getState(), _domain);
 	return res;
 }
 
-void LoomMacGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const {
+void LoomMonkeyMacGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const {
 	layouts.addDialog(layoutName, overlayedLayout)
 		.addLayout(GUI::ThemeLayout::kLayoutVertical, 5)
 		.addPadding(0, 0, 0, 0)
@@ -1427,13 +1429,15 @@ void LoomMacGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Commo
 		.addPadding(0, 0, 10, 0)
 		.addWidget("SndQualityLabel", "OptionsLabel")
 		.addWidget("SndQuality", "Slider")
-		.addWidget("SndQualityValue", "ShortOptionsLabel")
 		.closeLayout()
+		.addLayout(GUI::ThemeLayout::kLayoutVertical, 0)
+		.addPadding(200, 50, -20, 0)
+		.addWidget("SndQualityValue", "", -1, -1, Graphics::kTextAlignCenter)
 		.closeLayout()
 		.closeDialog();
 }
 
-void LoomMacGameOptionsWidget::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
+void LoomMonkeyMacGameOptionsWidget::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
 	switch (cmd) {
 	case kQualitySliderUpdate:
 		updateQualitySlider();
@@ -1444,9 +1448,17 @@ void LoomMacGameOptionsWidget::handleCommand(GUI::CommandSender *sender, uint32
 	}
 }
 
-void LoomMacGameOptionsWidget::updateQualitySlider() {
+void LoomMonkeyMacGameOptionsWidget::updateQualitySlider() {
 	_quality = _sndQualitySlider->getValue();
-	Common::U32String label(_quality == 0 ? "auto" : Common::String::format("%4d", _quality));
+	static const char *const descr1[] = { _s("auto"), _s("Low"), _s("Medium"), _s("High") };
+	static const char *const descr2[] = { _s("auto"), _s("Good"), _s("Better"), _s("Best") };
+	static const char *const pattern[] = { _s("Hardware Rating: %s   -   "), _s("Quality Selection: %s") };
+
+	Common::String pt1(Common::String::format(pattern[1], descr2[_quality == _sndQualitySlider->getMinValue() ? 0 : ((_quality - 1) % 3) + 1]));
+	if (_sndQualitySlider->getMinValue() == 0)
+		pt1.insertString(Common::String::format(pattern[0], descr1[_quality == _sndQualitySlider->getMinValue() ? 0 : ((_quality - 1) / 3) + 1]), 0);
+
+	Common::U32String label(pt1);
 	_sndQualityValue->setLabel(label);
 }
 
diff --git a/engines/scumm/dialogs.h b/engines/scumm/dialogs.h
index eeeeb373d84..ea146520447 100644
--- a/engines/scumm/dialogs.h
+++ b/engines/scumm/dialogs.h
@@ -301,10 +301,10 @@ private:
 /**
 * Options widget for Mac Loom.
 */
-class LoomMacGameOptionsWidget : public ScummOptionsContainerWidget {
+class LoomMonkeyMacGameOptionsWidget : public ScummOptionsContainerWidget {
 public:
-	LoomMacGameOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain);
-	~LoomMacGameOptionsWidget() override {};
+	LoomMonkeyMacGameOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain, int gameId);
+	~LoomMonkeyMacGameOptionsWidget() override {};
 
 	void load() override;
 	bool save() override;
diff --git a/engines/scumm/metaengine.cpp b/engines/scumm/metaengine.cpp
index 51badcb06aa..aae7c0ef5a7 100644
--- a/engines/scumm/metaengine.cpp
+++ b/engines/scumm/metaengine.cpp
@@ -581,7 +581,7 @@ GUI::OptionsContainerWidget *ScummMetaEngine::buildLoomOptionsWidget(GUI::GuiObj
 	if (extra == "Steam")
 		return MetaEngine::buildEngineOptionsWidget(boss, name, target);
 	else if (platform == Common::kPlatformMacintosh)
-		return new Scumm::LoomMacGameOptionsWidget(boss, name, target);
+		return new Scumm::LoomMonkeyMacGameOptionsWidget(boss, name, target, GID_LOOM);
 
 	// These EGA Loom settings are only relevant for the EGA
 	// version, since that is the only one that has an overture.
@@ -590,6 +590,10 @@ GUI::OptionsContainerWidget *ScummMetaEngine::buildLoomOptionsWidget(GUI::GuiObj
 
 GUI::OptionsContainerWidget *ScummMetaEngine::buildMI1OptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const {
 	Common::String extra = ConfMan.get("extra", target);
+	Common::Platform platform = Common::parsePlatform(ConfMan.get("platform", target));
+
+	if (platform == Common::kPlatformMacintosh && extra != "Steam")
+		return new Scumm::LoomMonkeyMacGameOptionsWidget(boss, name, target, GID_MONKEY);
 
 	if (extra != "CD" && extra != "FM-TOWNS" && extra != "SEGA")
 		return nullptr;




More information about the Scummvm-git-logs mailing list