[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