[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