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

mduggan mgithub at guarana.org
Wed Apr 15 08:37:29 UTC 2020


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:
ddde574f46 ULTIMA8: Restore MIDI transitions and alternate midis for adlib


Commit: ddde574f4602e21f9255decacfde5b86cd686a4a
    https://github.com/scummvm/scummvm/commit/ddde574f4602e21f9255decacfde5b86cd686a4a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-15T17:37:18+09:00

Commit Message:
ULTIMA8: Restore MIDI transitions and alternate midis for adlib

Changed paths:
    engines/ultima/ultima8/audio/midi_player.cpp
    engines/ultima/ultima8/audio/midi_player.h
    engines/ultima/ultima8/audio/music_process.cpp


diff --git a/engines/ultima/ultima8/audio/midi_player.cpp b/engines/ultima/ultima8/audio/midi_player.cpp
index a9e9c67240..be97fe2a6a 100644
--- a/engines/ultima/ultima8/audio/midi_player.cpp
+++ b/engines/ultima/ultima8/audio/midi_player.cpp
@@ -27,8 +27,12 @@
 namespace Ultima {
 namespace Ultima8 {
 
+byte MidiPlayer::_callbackData[2];
+
 MidiPlayer::MidiPlayer() {
 	MidiPlayer::createDriver();
+	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+	_isFMSynth = MidiDriver::getMusicType(dev) == MT_ADLIB;
 
 	if (_driver) {
 		int retValue = _driver->open();
@@ -47,10 +51,12 @@ MidiPlayer::~MidiPlayer() {
 	_driver->close();
 }
 
-void MidiPlayer::play(byte *data, size_t size) {
+void MidiPlayer::play(byte *data, size_t size, int seqNo) {
 	if (!_driver)
 		return;
 
+	assert(seqNo == 0 || seqNo == 1);
+
 	stop();
 
 	if (size < 4)
@@ -60,7 +66,7 @@ void MidiPlayer::play(byte *data, size_t size) {
 		warning("play() Unexpected signature");
 		_isPlaying = false;
 	} else {
-		_parser = MidiParser::createParser_XMIDI();
+		_parser = MidiParser::createParser_XMIDI(xmidiCallback, _callbackData + seqNo);
 
 		if (!_parser->loadMusic(data, size))
 			error("play() wrong music resource");
@@ -81,5 +87,13 @@ void MidiPlayer::setLooping(bool loop) {
 	_parser->property(MidiParser::mpAutoLoop, loop);
 }
 
+void MidiPlayer::xmidiCallback(byte eventData, void *data) {
+	if (data == nullptr)
+		return;
+
+	*static_cast<byte*>(data) = eventData;
+}
+
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/audio/midi_player.h b/engines/ultima/ultima8/audio/midi_player.h
index 67fd4afe13..87c3c733b3 100644
--- a/engines/ultima/ultima8/audio/midi_player.h
+++ b/engines/ultima/ultima8/audio/midi_player.h
@@ -26,10 +26,6 @@
 #include "audio/mixer.h"
 #include "audio/midiplayer.h"
 
-namespace Audio {
-class PCSpeaker;
-}
-
 namespace Ultima {
 namespace Ultima8 {
 
@@ -41,7 +37,7 @@ public:
 	/**
 	 * Play the specified music
 	 */
-	void play(byte *data, size_t size);
+	void play(byte *data, size_t size, int seqNo);
 
 	/**
 	 * Sets whether the music should loop
@@ -49,8 +45,18 @@ public:
 	void setLooping(bool loop);
 
 	bool isFMSynth() const {
-		return false;
+		return _isFMSynth;
+	};
+
+	static void xmidiCallback(byte eventData, void *data);
+
+	byte getSequenceCallbackData(int seq) const {
+		assert(seq == 0 || seq == 1);
+		return _callbackData[seq];
 	}
+private:
+	bool _isFMSynth;
+	static byte _callbackData[2];
 };
 
 } // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/audio/music_process.cpp b/engines/ultima/ultima8/audio/music_process.cpp
index 2f5e265b00..053c82ad89 100644
--- a/engines/ultima/ultima8/audio/music_process.cpp
+++ b/engines/ultima/ultima8/audio/music_process.cpp
@@ -117,19 +117,17 @@ void MusicProcess::playMusic_internal(int track) {
 
 	} else {
 		// We want to do a transition
-		// TODO: Properly handle transitions under ScummVM
-#ifdef TODO
 		const MusicFlex::SongInfo *info = GameData::get_instance()->getMusic()->getSongInfo(_currentTrack);
 
 		uint32 measure = _midiPlayer->getSequenceCallbackData(0);
 
 		// No transition info, or invalid measure, so fast change
-		if (!info || (measure >= (uint32)info->num_measures) ||
-		        !info->transitions[track] || !info->transitions[track][measure]) {
+		if (!info || (measure >= (uint32)info->_numMeasures) ||
+		        !info->_transitions[track] || !info->_transitions[track][measure]) {
 			_currentTrack = 0;
 			if (track == 0) {
 				_trackState._wanted = 0;
-				_state = MUSIC_PLAY_WANTED;
+				_state = PLAYBACK_PLAY_WANTED;
 			} else {
 				playMusic_internal(track);
 			}
@@ -137,35 +135,34 @@ void MusicProcess::playMusic_internal(int track) {
 		}
 
 		// Get transition info
-		int trans = info->transitions[track][measure];
+		int trans = info->_transitions[track][measure];
 		bool speed_hack = false;
 
 		if (trans < 0) {
 			trans = (-trans) - 1;
 			speed_hack = true;
 		} else {
-			_midiPlayer->finishSequence(0);
+			_midiPlayer->stop();
 			trans = trans - 1;
 		}
 
 		// Now get the transition midi
+		byte *data = nullptr;
+		uint32 size = 0;
 		int xmidi_index = _midiPlayer->isFMSynth() ? 260 : 258;
-		XMidiFile *xmidi = GameData::get_instance()->getMusic()->getXMidi(xmidi_index);
-		XMidiEventList *list;
-
-		if (xmidi)
-			list = xmidi->GetEventList(trans);
-		else
-			list = 0;
-
-		if (list) {
-			_midiPlayer->startSequence(1, list, false, 255, _songBranches[track]);
-			if (speed_hack)
-				_midiPlayer->setSequenceSpeed(1, 200);
+		data = GameData::get_instance()->getMusic()->getRawObject(xmidi_index, &size);
+
+		//warning("Doing a MIDI transition! trans: %d xmidi: %d speedhack: %d", trans, xmidi_index, speed_hack);
+
+		if (data) {
+			_midiPlayer->play(data, size, 1);
+			// TODO: Handle speed hack under scummvm
+			//if (speed_hack)
+			//	_midiPlayer->setSequenceSpeed(1, 200);
 		} else {
-			_midiPlayer->finishSequence(1);
+			_midiPlayer->stop();
 		}
-#endif
+
 		_trackState._wanted = track;
 		_state = PLAYBACK_TRANSITION;
 	}
@@ -210,7 +207,7 @@ void MusicProcess::run() {
 			if (_midiPlayer) {
 				// if there's a track queued, only play this one once
 				bool repeat = (_trackState._queued == 0);
-				_midiPlayer->play(data, size);
+				_midiPlayer->play(data, size, 0);
 				_midiPlayer->setLooping(repeat);
 			}
 




More information about the Scummvm-git-logs mailing list