BLADERUNNER: Fixed ambient sounds after load

After loading a game, ambient sounds stoped playing, now they are
working properly.
Also some smaller compiler warnings were fixed.
This commit is contained in:
Peter Kohaut
2018-11-24 17:19:40 +01:00
parent 79b7de93e7
commit 88fa8c3c5c
6 changed files with 72 additions and 55 deletions
+2 -2
View File
@@ -186,10 +186,10 @@ void ActorDialogueQueue::save(SaveFileWriteStream &f) {
void ActorDialogueQueue::load(SaveFileReadStream &f) {
_entries.clear();
int count = f.readInt();
uint count = f.readInt();
assert(count <= kMaxEntries);
_entries.resize(count);
for (int i = 0; i < count; ++i) {
for (uint i = 0; i < count; ++i) {
Entry &e = _entries[i];
e.isNotPause = f.readBool();
e.isPause = f.readBool();
+1 -1
View File
@@ -32,7 +32,7 @@ class SaveFileReadStream;
class SaveFileWriteStream;
class ActorDialogueQueue {
static const int kMaxEntries = 25;
static const uint kMaxEntries = 25;
struct Entry {
bool isNotPause;
+66 -48
View File
@@ -355,70 +355,88 @@ void AmbientSounds::save(SaveFileWriteStream &f) {
for (int i = 0; i != kNonLoopingSounds; ++i) {
// 73 bytes per non-looping sound
NonLoopingSound &s = _nonLoopingSounds[i];
f.writeBool(s.isActive);
f.writeStringSz(s.name, 13);
f.writeSint32LE(s.hash);
f.writeInt(s.audioPlayerTrack);
f.writeInt(s.timeMin);
f.writeInt(s.timeMax);
f.writeUint32LE(s.nextPlayTime);
f.writeInt(s.volumeMin);
f.writeInt(s.volumeMax);
f.writeInt(s.volume);
f.writeInt(s.panStartMin);
f.writeInt(s.panStartMax);
f.writeInt(s.panEndMin);
f.writeInt(s.panEndMax);
f.writeInt(s.priority);
NonLoopingSound &track = _nonLoopingSounds[i];
f.writeBool(track.isActive);
f.writeStringSz(track.name, 13);
f.writeSint32LE(track.hash);
f.writeInt(-1); // track.audioPlayerTrack is not used after load
f.writeInt(track.timeMin);
f.writeInt(track.timeMax);
f.writeInt(0); // track.nextPlayTime is not used after load
f.writeInt(track.volumeMin);
f.writeInt(track.volumeMax);
f.writeInt(track.volume);
f.writeInt(track.panStartMin);
f.writeInt(track.panStartMax);
f.writeInt(track.panEndMin);
f.writeInt(track.panEndMax);
f.writeInt(track.priority);
f.padBytes(4); // field_45
}
for (int i = 0; i != kLoopingSounds; ++i) {
// 33 bytes per looping sound
LoopingSound &s = _loopingSounds[i];
f.writeBool(s.isActive);
f.writeStringSz(s.name, 13);
f.writeSint32LE(s.hash);
f.writeInt(s.audioPlayerTrack);
f.writeInt(s.volume);
f.writeInt(s.pan);
LoopingSound &track = _loopingSounds[i];
f.writeBool(track.isActive);
f.writeStringSz(track.name, 13);
f.writeSint32LE(track.hash);
f.writeInt(-1); // track.audioPlayerTrack is not used after load
f.writeInt(track.volume);
f.writeInt(track.pan);
}
}
void AmbientSounds::load(SaveFileReadStream &f) {
removeAllLoopingSounds(0);
removeAllNonLoopingSounds(true);
f.skip(4); // TODO: _isDisabled
uint32 now = g_system->getMillis();
for (int i = 0; i != kNonLoopingSounds; ++i) {
// 73 bytes per non-looping sound
NonLoopingSound &s = _nonLoopingSounds[i];
s.isActive = f.readBool();
s.name = f.readStringSz(13);
s.hash = f.readSint32LE();
s.audioPlayerTrack = f.readInt();
s.timeMin = f.readInt();
s.timeMax = f.readInt();
s.nextPlayTime = f.readUint32LE();
s.volumeMin = f.readInt();
s.volumeMax = f.readInt();
s.volume = f.readInt();
s.panStartMin = f.readInt();
s.panStartMax = f.readInt();
s.panEndMin = f.readInt();
s.panEndMax = f.readInt();
s.priority = f.readInt();
NonLoopingSound &track = _nonLoopingSounds[i];
track.isActive = f.readBool();
track.name = f.readStringSz(13);
track.hash = f.readSint32LE();
f.skip(4); // track.audioPlayerTrack is not used after load
track.audioPlayerTrack = -1;
track.timeMin = f.readInt();
track.timeMax = f.readInt();
f.skip(4); // track.nextPlayTime is not used after load
track.nextPlayTime = now + _vm->_rnd.getRandomNumberRng(track.timeMin, track.timeMax);
track.volumeMin = f.readInt();
track.volumeMax = f.readInt();
track.volume = f.readInt();
track.panStartMin = f.readInt();
track.panStartMax = f.readInt();
track.panEndMin = f.readInt();
track.panEndMax = f.readInt();
track.priority = f.readInt();
f.skip(4); // field_45
}
for (int i = 0; i != kLoopingSounds; ++i) {
// 33 bytes per looping sound
LoopingSound &s = _loopingSounds[i];
s.isActive = f.readBool();
s.name = f.readStringSz(13);
s.hash = f.readSint32LE();
s.audioPlayerTrack = f.readInt();
s.volume = f.readInt();
s.pan = f.readInt();
LoopingSound &track = _loopingSounds[i];
track.isActive = f.readBool();
track.name = f.readStringSz(13);
track.hash = f.readSint32LE();
f.skip(4); // track.audioPlayerTrack is not used after load
track.audioPlayerTrack = -1;
track.volume = f.readInt();
track.pan = f.readInt();
}
for (int i = 0; i != kLoopingSounds; ++i) {
LoopingSound &track = _loopingSounds[i];
if (track.isActive) {
track.audioPlayerTrack = _vm->_audioPlayer->playAud(track.name, 1, track.pan, track.pan, 99, kAudioPlayerLoop | kAudioPlayerOverrideVolume);
if (track.audioPlayerTrack == -1) {
removeLoopingSoundByIndex(i, 0);
} else {
_vm->_audioPlayer->adjustVolume(track.audioPlayerTrack, _ambientVolume * track.volume / 100, 2, false);
}
}
}
}
+2 -2
View File
@@ -58,13 +58,13 @@ bool SaveFile::readHeader(Common::SeekableReadStream &in, SaveFileHeader &header
header._thumbnail = nullptr;
if (!skipThumbnail) {
header._thumbnail = new Graphics::Surface();
header._thumbnail = new Graphics::Surface(); // freed by ScummVM's smartptr
int32 pos = s.pos();
s.skip(4); //skip size;
void *thumbnailData = new byte[kThumbnailSize];
void *thumbnailData = new byte[kThumbnailSize]; // freed by ScummVM's smartptr
s.read(thumbnailData, kThumbnailSize);
// TODO: cleanup - remove magic constants
-1
View File
@@ -353,7 +353,6 @@ void SceneObjects::load(SaveFileReadStream &f) {
_sceneObjects[i].id = f.readInt();
_sceneObjects[i].type = (SceneObjectType)f.readInt();
_sceneObjects[i].boundingBox = f.readBoundingBox(true);
debug("screenRectangle[%i]: %08x", i, f.pos());
_sceneObjects[i].screenRectangle = f.readRect();
_sceneObjects[i].distanceToCamera = f.readFloat();
_sceneObjects[i].isPresent = f.readBool();
+1 -1
View File
@@ -32,7 +32,7 @@ namespace BladeRunner {
class BladeRunnerEngine;
class KIAShapes {
static const int kShapeCount = 132;
static const uint kShapeCount = 132;
BladeRunnerEngine *_vm;
const Shape *_shapes[kShapeCount];