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

mduggan mgithub at guarana.org
Sat Apr 25 02:00:32 UTC 2020


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:
329f01dccc ULTIMA8: Statically allocate map data as size is fixed
bf747226cc ULTIMA8: Support caching of song info


Commit: 329f01dccce8c06f0ad9e195616be6c41f8b1e12
    https://github.com/scummvm/scummvm/commit/329f01dccce8c06f0ad9e195616be6c41f8b1e12
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-25T10:57:33+09:00

Commit Message:
ULTIMA8: Statically allocate map data as size is fixed

Changed paths:
    engines/ultima/ultima8/world/current_map.cpp
    engines/ultima/ultima8/world/current_map.h


diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 4a86cff301..4a4857145d 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -52,11 +52,7 @@ const int INT_MAX_VALUE = 0x7fffffff;
 
 CurrentMap::CurrentMap() : _currentMap(0), _eggHatcher(0),
 	  _fastXMin(-1), _fastYMin(-1), _fastXMax(-1), _fastYMax(-1) {
-	_items = new list<Item *> *[MAP_NUM_CHUNKS];
-	_fast = new uint32*[MAP_NUM_CHUNKS];
 	for (unsigned int i = 0; i < MAP_NUM_CHUNKS; i++) {
-		_items[i] = new list<Item *>[MAP_NUM_CHUNKS];
-		_fast[i] = new uint32[MAP_NUM_CHUNKS / 32];
 		Std::memset(_fast[i], false, sizeof(uint32)*MAP_NUM_CHUNKS / 32);
 	}
 
@@ -72,13 +68,6 @@ CurrentMap::CurrentMap() : _currentMap(0), _eggHatcher(0),
 
 CurrentMap::~CurrentMap() {
 //	clear();
-
-	for (unsigned int i = 0; i < MAP_NUM_CHUNKS; i++) {
-		delete[] _items[i];
-		delete[] _fast[i];
-	}
-	delete[] _items;
-	delete[] _fast;
 }
 
 void CurrentMap::clear() {
diff --git a/engines/ultima/ultima8/world/current_map.h b/engines/ultima/ultima8/world/current_map.h
index bb74c60f93..e14676c88d 100644
--- a/engines/ultima/ultima8/world/current_map.h
+++ b/engines/ultima/ultima8/world/current_map.h
@@ -211,12 +211,12 @@ private:
 
 	// item lists. Lots of them :-)
 	// items[x][y]
-	Std::list<Item *> **_items;
+	Std::list<Item *> _items[MAP_NUM_CHUNKS][MAP_NUM_CHUNKS];
 
 	ProcId _eggHatcher;
 
 	// Fast area bit masks -> fast[ry][rx/32]&(1<<(rx&31));
-	uint32 **_fast;
+	uint32 _fast[MAP_NUM_CHUNKS][MAP_NUM_CHUNKS / 32];
 	int32 _fastXMin, _fastYMin, _fastXMax, _fastYMax;
 
 	int _mapChunkSize;


Commit: bf747226cc8b5e5953cba7f4ccb6d9e72b6a66f2
    https://github.com/scummvm/scummvm/commit/bf747226cc8b5e5953cba7f4ccb6d9e72b6a66f2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-25T11:00:11+09:00

Commit Message:
ULTIMA8: Support caching of song info

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


diff --git a/engines/ultima/ultima8/audio/music_flex.cpp b/engines/ultima/ultima8/audio/music_flex.cpp
index 09db8ac7a2..0688c5654a 100644
--- a/engines/ultima/ultima8/audio/music_flex.cpp
+++ b/engines/ultima/ultima8/audio/music_flex.cpp
@@ -32,8 +32,10 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(MusicFlex, Archive)
 
 
-MusicFlex::MusicFlex(Common::SeekableReadStream *rs) : Archive(rs), _songs(nullptr) {
+MusicFlex::MusicFlex(Common::SeekableReadStream *rs) : Archive(rs) {
 	Std::memset(_info, 0, sizeof(SongInfo *) * 128);
+	_songs = new XMidiData *[_count];
+	Std::memset(_songs, 0, sizeof(XMidiData *) * _count);
 	loadSongInfo();
 }
 
@@ -42,8 +44,9 @@ MusicFlex::~MusicFlex() {
 	for (i = 0; i < 128; i++) {
 		delete _info[i];
 	}
-
-	Archive::uncache();
+	for (i = 0; i < _count; i++) {
+		delete _songs[i];
+	}
 	delete [] _songs;
 }
 
@@ -58,7 +61,7 @@ MusicFlex::SongInfo::~SongInfo() {
 	}
 }
 
-XMidiFile *MusicFlex::getXMidi(uint32 index) {
+MusicFlex::XMidiData *MusicFlex::getXMidi(uint32 index) {
 	if (index >= _count)
 		return nullptr;
 	cache(index);
@@ -72,17 +75,24 @@ const MusicFlex::SongInfo *MusicFlex::getSongInfo(uint32 index) const {
 }
 
 void MusicFlex::cache(uint32 index) {
-	// Caching not currently supported
+	if (index >= _count) return;
+	uint32 size;
+	uint8 *data = getRawObject(index, &size);
+	if (!data) {
+		error("Unable to cache song %d from sound/music.flx", index);
+		return;
+	}
+	_songs[index] = new XMidiData(data, size);
 }
 
 void MusicFlex::uncache(uint32 index) {
-	// Caching not currently supported
+	if (index >= _count) return;
+	delete _songs[index];
+	_songs[index] = nullptr;
 }
 
 bool MusicFlex::isCached(uint32 index) const {
 	if (index >= _count) return false;
-	if (!_songs) return false;
-
 	return (_songs[index] != nullptr);
 }
 
@@ -97,7 +107,7 @@ void MusicFlex::loadSongInfo() {
 	const uint8 *buf = getRawObject(0, &size);
 
 	if (!buf || !size) {
-		error("Unable to load song _info from sound/music.flx");
+		error("Unable to load song info from sound/music.flx");
 	}
 	IBufferDataSource ds(buf, size);
 	Std::string line;
diff --git a/engines/ultima/ultima8/audio/music_flex.h b/engines/ultima/ultima8/audio/music_flex.h
index 490566d6bd..b3995f38d7 100644
--- a/engines/ultima/ultima8/audio/music_flex.h
+++ b/engines/ultima/ultima8/audio/music_flex.h
@@ -29,7 +29,6 @@
 namespace Ultima {
 namespace Ultima8 {
 
-class XMidiFile;
 
 class MusicFlex : public Archive {
 public:
@@ -45,11 +44,19 @@ public:
 		int         *_transitions[128];
 	};
 
+	struct XMidiData {
+		XMidiData(byte *data, uint32 size) : _data(data), _size(size)
+		{}
+
+		byte 	*_data;
+		uint32 	_size;
+	};
+
 	MusicFlex(Common::SeekableReadStream *rs);
 	~MusicFlex() override;
 
 	//! Get an xmidi
-	XMidiFile *getXMidi(uint32 index);
+	XMidiData *getXMidi(uint32 index);
 
 	//! Get song info
 	const SongInfo *getSongInfo(uint32 index) const;
@@ -66,11 +73,11 @@ public:
 	}
 
 private:
-	SongInfo        *_info[128];
-	XMidiFile       **_songs;
+	SongInfo   *_info[128];
+	XMidiData  **_songs;
 
 	//! Load the song info
-	void            loadSongInfo();
+	void       loadSongInfo();
 };
 
 } // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/audio/music_process.cpp b/engines/ultima/ultima8/audio/music_process.cpp
index f87645dadc..414e619a1c 100644
--- a/engines/ultima/ultima8/audio/music_process.cpp
+++ b/engines/ultima/ultima8/audio/music_process.cpp
@@ -104,6 +104,8 @@ void MusicProcess::playMusic_internal(int track) {
 		return;
 	}
 
+	MusicFlex *musicflex = GameData::get_instance()->getMusic();
+
 	// No current track if not playing
 	if (_midiPlayer && !_midiPlayer->isPlaying())
 		_trackState._wanted = _currentTrack = 0;
@@ -117,7 +119,7 @@ void MusicProcess::playMusic_internal(int track) {
 
 	} else {
 		// We want to do a transition
-		const MusicFlex::SongInfo *info = GameData::get_instance()->getMusic()->getSongInfo(_currentTrack);
+		const MusicFlex::SongInfo *info = musicflex->getSongInfo(_currentTrack);
 
 		uint32 measure = _midiPlayer->getSequenceCallbackData(0);
 
@@ -147,14 +149,13 @@ void MusicProcess::playMusic_internal(int track) {
 		}
 
 		// Now get the transition midi
-		uint32 size = 0;
 		int xmidi_index = _midiPlayer->isFMSynth() ? 260 : 258;
-		byte *data = GameData::get_instance()->getMusic()->getRawObject(xmidi_index, &size);
+		MusicFlex::XMidiData *xmidi = musicflex->getXMidi(xmidi_index);
 
 		//warning("Doing a MIDI transition! trans: %d xmidi: %d speedhack: %d", trans, xmidi_index, speed_hack);
 
-		if (data) {
-			_midiPlayer->play(data, size, 1, trans, speed_hack);
+		if (xmidi && xmidi->_data) {
+			_midiPlayer->play(xmidi->_data, xmidi->_size, 1, trans, speed_hack);
 		} else {
 			_midiPlayer->stop();
 		}
@@ -188,18 +189,17 @@ void MusicProcess::run() {
 		if (_midiPlayer)
 			_midiPlayer->stop();
 
-		byte *data = nullptr;
-		uint32 size = 0;
+		MusicFlex::XMidiData *xmidi = nullptr;
 
 		if (_trackState._wanted) {
 			int xmidi_index = _trackState._wanted;
 			if (_midiPlayer && _midiPlayer->isFMSynth())
 				xmidi_index += 128;
 
-			data = GameData::get_instance()->getMusic()->getRawObject(xmidi_index, &size);
+			xmidi = GameData::get_instance()->getMusic()->getXMidi(xmidi_index);
 		}
 
-		if (data) {
+		if (xmidi && xmidi->_data) {
 #ifdef TODO
 			// TODO: support branches in tracks.
 			// Not clear how to do this with the scummvm xmidi parser..
@@ -213,7 +213,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, 0, 0, false);
+				_midiPlayer->play(xmidi->_data, xmidi->_size, 0, 0, false);
 				_midiPlayer->setLooping(repeat);
 			}
 




More information about the Scummvm-git-logs mailing list