[Scummvm-git-logs] scummvm master -> c19336e46922097d695e07f0779fd7bede060d04
antoniou79
a.antoniou79 at gmail.com
Mon Feb 17 23:03:45 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:
d488ec3c05 BLADERUNNER: Improve simulation of original KIA quit behavior
c19336e469 BLADERUNNER: Prevent cause assertion fault and no subtitles for #11294
Commit: d488ec3c05639cc5d49f6db86db46d5d83005186
https://github.com/scummvm/scummvm/commit/d488ec3c05639cc5d49f6db86db46d5d83005186
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2020-02-18T00:58:53+02:00
Commit Message:
BLADERUNNER: Improve simulation of original KIA quit behavior
Changed paths:
engines/bladerunner/ui/kia.cpp
diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp
index 54b481a..95258cb 100644
--- a/engines/bladerunner/ui/kia.cpp
+++ b/engines/bladerunner/ui/kia.cpp
@@ -56,6 +56,7 @@
#include "common/str.h"
#include "common/keyboard.h"
+#include "common/debug.h"
namespace BladeRunner {
@@ -654,6 +655,10 @@ void KIA::mouseDownCallback(int buttonId, void *callbackData) {
self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(kSfxBUTN5P), 70, 0, 0, 50, 0);
if (buttonId == 12) {
int endTrackId = self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(kSfxSHUTDOWN), 70, 0, 0, 50, 0);
+
+ self->_vm->_surfaceFront.fillRect(Common::Rect(0, 0, 640, 480), 0);
+ self->_vm->blitToScreen(self->_vm->_surfaceFront);
+
if (endTrackId != -1) {
// wait until the full clip has played (similar to the original)
uint32 timeNow = self->_vm->_time->currentSystem();
Commit: c19336e46922097d695e07f0779fd7bede060d04
https://github.com/scummvm/scummvm/commit/c19336e46922097d695e07f0779fd7bede060d04
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2020-02-18T00:58:53+02:00
Commit Message:
BLADERUNNER: Prevent cause assertion fault and no subtitles for #11294
Bug #11294 is a case where output audio hardware is disabled
If the output sound device is disabled or no hardware output device is connected (eg. Windows 10 may disable output audio hardware when no output device is attached/available), then the game should still be playable. We now use the duration of the tracks (in ms) to detect a track's ending.
Also isReady is checked for mixer when playing VQA videos (it wasn't before).
Changed paths:
engines/bladerunner/aud_stream.cpp
engines/bladerunner/aud_stream.h
engines/bladerunner/audio_mixer.cpp
engines/bladerunner/audio_mixer.h
engines/bladerunner/audio_player.cpp
engines/bladerunner/audio_player.h
engines/bladerunner/audio_speech.cpp
engines/bladerunner/music.cpp
engines/bladerunner/script/script.cpp
engines/bladerunner/script/script.h
engines/bladerunner/vqa_player.cpp
diff --git a/engines/bladerunner/aud_stream.cpp b/engines/bladerunner/aud_stream.cpp
index ff2f9d2..30613cb 100644
--- a/engines/bladerunner/aud_stream.cpp
+++ b/engines/bladerunner/aud_stream.cpp
@@ -129,7 +129,7 @@ bool AudStream::rewind() {
/**
* Returns audio length in milliseconds
*/
-int AudStream::getLength() const {
+uint32 AudStream::getLength() const {
int bytesPerSecond = _overrideFrequency > 0 ? _overrideFrequency : _frequency;
if (_flags & 1) { // 16 bit
bytesPerSecond *= 2;
@@ -141,8 +141,7 @@ int AudStream::getLength() const {
// since everything is 44100, we easily get overflows with ints
// thus we must use doubles
double res = (double)_sizeDecompressed * 1000.0 / (double)bytesPerSecond;
-
- return (int32)res;
+ return (uint32)res;
}
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/aud_stream.h b/engines/bladerunner/aud_stream.h
index 2b709a3..9deb820 100644
--- a/engines/bladerunner/aud_stream.h
+++ b/engines/bladerunner/aud_stream.h
@@ -61,7 +61,7 @@ public:
int getRate() const override { return _overrideFrequency > 0 ? _overrideFrequency : _frequency; };
bool endOfData() const override { return _p == _end; }
bool rewind() override;
- int getLength() const;
+ uint32 getLength() const;
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/audio_mixer.cpp b/engines/bladerunner/audio_mixer.cpp
index fe39f57..27d72d0 100644
--- a/engines/bladerunner/audio_mixer.cpp
+++ b/engines/bladerunner/audio_mixer.cpp
@@ -23,6 +23,7 @@
#include "bladerunner/audio_mixer.h"
#include "bladerunner/bladerunner.h"
+#include "bladerunner/time.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
@@ -46,7 +47,7 @@ AudioMixer::~AudioMixer() {
_vm->getTimerManager()->removeTimerProc(timerCallback);
}
-int AudioMixer::play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void (*endCallback)(int, void *), void *callbackData) {
+int AudioMixer::play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void (*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs) {
Common::StackLock lock(_mutex);
int channel = -1;
@@ -72,13 +73,13 @@ int AudioMixer::play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream
channel = lowestPriorityChannel;
}
- return playInChannel(channel, type, stream, priority, loop, volume, pan, endCallback, callbackData);
+ return playInChannel(channel, type, stream, priority, loop, volume, pan, endCallback, callbackData, trackDurationMs);
}
-int AudioMixer::playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData) {
+int AudioMixer::playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs) {
Common::StackLock lock(_mutex);
- return playInChannel(kMusicChannel, Audio::Mixer::kMusicSoundType, stream, 100, false, volume, 0, endCallback, callbackData);
+ return playInChannel(kMusicChannel, Audio::Mixer::kMusicSoundType, stream, 100, false, volume, 0, endCallback, callbackData, trackDurationMs);
}
void AudioMixer::stop(int channel, uint32 time) {
@@ -89,7 +90,9 @@ void AudioMixer::stop(int channel, uint32 time) {
adjustVolume(channel, 0, time);
} else {
_channels[channel].isPresent = false;
- _vm->_mixer->stopHandle(_channels[channel].handle);
+ if (_channels[channel].sentToMixer) {
+ _vm->_mixer->stopHandle(_channels[channel].handle);
+ }
if (_channels[channel].endCallback != nullptr) {
_channels[channel].endCallback(channel, _channels[channel].callbackData);
}
@@ -97,7 +100,7 @@ void AudioMixer::stop(int channel, uint32 time) {
}
}
-int AudioMixer::playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData) {
+int AudioMixer::playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs) {
_channels[channel].isPresent = true;
_channels[channel].stream = stream;
_channels[channel].priority = priority;
@@ -110,6 +113,8 @@ int AudioMixer::playInChannel(int channel, Audio::Mixer::SoundType type, Audio::
_channels[channel].panDelta = 0;
_channels[channel].endCallback = endCallback;
_channels[channel].callbackData = callbackData;
+ _channels[channel].timeStarted = _vm->_time->currentSystem();
+ _channels[channel].trackDurationMs = trackDurationMs;
Audio::AudioStream *audioStream = stream;
@@ -118,8 +123,10 @@ int AudioMixer::playInChannel(int channel, Audio::Mixer::SoundType type, Audio::
}
if (!_vm->_mixer->isReady()) {
- return -1;
+ _channels[channel].sentToMixer = false;
+ return channel;
}
+ _channels[channel].sentToMixer = true;
_vm->_mixer->playStream(
type,
@@ -135,7 +142,9 @@ int AudioMixer::playInChannel(int channel, Audio::Mixer::SoundType type, Audio::
bool AudioMixer::isActive(int channel) const {
Common::StackLock lock(_mutex);
- return _channels[channel].isPresent && _vm->_mixer->isSoundHandleActive(_channels[channel].handle);
+ return _channels[channel].isPresent
+ && ((_channels[channel].sentToMixer && _vm->_mixer->isSoundHandleActive(_channels[channel].handle))
+ || (!_channels[channel].sentToMixer && !_channels[channel].loop && (_vm->_time->currentSystem() - _channels[channel].timeStarted < _channels[channel].trackDurationMs)));
}
void AudioMixer::timerCallback(void *self) {
@@ -177,7 +186,9 @@ void AudioMixer::tick() {
channel->volumeDelta = 0.0f;
}
- _vm->_mixer->setChannelVolume(channel->handle, (channel->volume * Audio::Mixer::kMaxChannelVolume) / 100); // map [0..100] to [0..kMaxChannelVolume]
+ if (channel->sentToMixer) {
+ _vm->_mixer->setChannelVolume(channel->handle, (channel->volume * Audio::Mixer::kMaxChannelVolume) / 100); // map [0..100] to [0..kMaxChannelVolume]
+ }
if (channel->volume <= 0.0f) {
stop(i, 0);
@@ -191,10 +202,15 @@ void AudioMixer::tick() {
channel->panDelta = 0.0f;
}
- _vm->_mixer->setChannelBalance(channel->handle, (channel->pan * 127) / 100); // map [-100..100] to [-127..127]
+ if (channel->sentToMixer) {
+ _vm->_mixer->setChannelBalance(channel->handle, (channel->pan * 127) / 100); // map [-100..100] to [-127..127]
+ }
}
- if (!_vm->_mixer->isSoundHandleActive(channel->handle) || channel->stream->endOfStream()) {
+ if ((channel->sentToMixer && !_vm->_mixer->isSoundHandleActive(channel->handle))
+ || channel->stream->endOfStream()
+ || (!channel->sentToMixer && !channel->loop && _vm->_time->currentSystem() - channel->timeStarted >= channel->trackDurationMs)
+ ) {
stop(i, 0);
}
}
diff --git a/engines/bladerunner/audio_mixer.h b/engines/bladerunner/audio_mixer.h
index 46467c6..13ec916 100644
--- a/engines/bladerunner/audio_mixer.h
+++ b/engines/bladerunner/audio_mixer.h
@@ -58,6 +58,9 @@ class AudioMixer {
float panTarget;
void (*endCallback)(int channel, void *data);
void *callbackData;
+ uint32 timeStarted;
+ uint32 trackDurationMs;
+ bool sentToMixer;
};
BladeRunnerEngine *_vm;
@@ -69,8 +72,8 @@ public:
AudioMixer(BladeRunnerEngine *vm);
~AudioMixer();
- int play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData);
- int playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData);
+ int play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);
+ int playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);
void stop(int channel, uint32 delay);
void adjustVolume(int channel, int newVolume, uint32 time);
@@ -80,7 +83,7 @@ public:
void pause(int channel, uint32 delay);
private:
- int playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData);
+ int playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);
bool isActive(int channel) const;
void tick();
diff --git a/engines/bladerunner/audio_player.cpp b/engines/bladerunner/audio_player.cpp
index e5045f0..389716e 100644
--- a/engines/bladerunner/audio_player.cpp
+++ b/engines/bladerunner/audio_player.cpp
@@ -132,7 +132,7 @@ void AudioPlayer::mixerChannelEnded(int channel, void *data) {
audioPlayer->remove(channel);
}
-int AudioPlayer::playAud(const Common::String &name, int volume, int panFrom, int panTo, int priority, byte flags, Audio::Mixer::SoundType type) {
+int AudioPlayer::playAud(const Common::String &name, int volume, int panStart, int panEnd, int priority, byte flags, Audio::Mixer::SoundType type) {
/* Find first available track or, alternatively, the lowest priority playing track */
int track = -1;
int lowestPriority = 1000000;
@@ -200,9 +200,11 @@ int AudioPlayer::playAud(const Common::String &name, int volume, int panFrom, in
priority,
flags & kAudioPlayerLoop,
actualVolume,
- panFrom,
+ panStart,
mixerChannelEnded,
- this);
+ this,
+ audioStream->getLength()
+ );
if (channel == -1) {
delete audioStream;
@@ -210,8 +212,8 @@ int AudioPlayer::playAud(const Common::String &name, int volume, int panFrom, in
return -1;
}
- if (panFrom != panTo) {
- _vm->_audioMixer->adjustPan(channel, panTo, (60 * audioStream->getLength()) / 1000);
+ if (panStart != panEnd) {
+ _vm->_audioMixer->adjustPan(channel, panEnd, (60 * audioStream->getLength()) / 1000);
}
_tracks[track].isActive = true;
@@ -232,6 +234,18 @@ bool AudioPlayer::isActive(int track) const {
return _tracks[track].isActive;
}
+/**
+* Return the track's length in milliseconds
+*/
+uint32 AudioPlayer::getLength(int track) const {
+ Common::StackLock lock(_mutex);
+ if (track < 0 || track >= kTracks) {
+ return 0;
+ }
+
+ return _tracks[track].stream->getLength();
+}
+
void AudioPlayer::stop(int track, bool immediately) {
if (isActive(track)) {
_vm->_audioMixer->stop(_tracks[track].channel, immediately ? 0 : 60);
diff --git a/engines/bladerunner/audio_player.h b/engines/bladerunner/audio_player.h
index bb6f3f3..bb516cd 100644
--- a/engines/bladerunner/audio_player.h
+++ b/engines/bladerunner/audio_player.h
@@ -34,6 +34,7 @@ namespace BladeRunner {
class BladeRunnerEngine;
class AudioCache;
+class AudStream;
enum AudioPlayerFlags {
kAudioPlayerLoop = 1,
@@ -44,6 +45,7 @@ class AudioPlayer {
#if BLADERUNNER_ORIGINAL_BUGS
static const int kTracks = 6;
#else
+ // increase tracks, reduce probability of tracks being skipped
static const int kTracks = 12;
#endif // BLADERUNNER_ORIGINAL_BUGS
@@ -53,7 +55,7 @@ class AudioPlayer {
int priority;
int volume;
int pan;
- Audio::AudioStream *stream;
+ AudStream *stream;
};
BladeRunnerEngine *_vm;
@@ -68,6 +70,7 @@ public:
int playAud(const Common::String &name, int volume, int panStart, int panEnd, int priority, byte flags = 0, Audio::Mixer::SoundType type = Audio::Mixer::kSFXSoundType);
bool isActive(int track) const;
+ uint32 getLength(int track) const;
void stop(int track, bool immediately);
void stopAll();
void adjustVolume(int track, int volume, uint32 delay, bool overrideVolume);
diff --git a/engines/bladerunner/audio_speech.cpp b/engines/bladerunner/audio_speech.cpp
index 8d2f18d..f812986 100644
--- a/engines/bladerunner/audio_speech.cpp
+++ b/engines/bladerunner/audio_speech.cpp
@@ -104,7 +104,8 @@ bool AudioSpeech::playSpeech(const Common::String &name, int pan) {
_speechVolume,
pan,
mixerChannelEnded,
- this);
+ this,
+ audioStream->getLength());
_isActive = true;
diff --git a/engines/bladerunner/music.cpp b/engines/bladerunner/music.cpp
index 3151774..e7a62a2 100644
--- a/engines/bladerunner/music.cpp
+++ b/engines/bladerunner/music.cpp
@@ -98,7 +98,7 @@ bool Music::play(const Common::String &trackName, int volume, int pan, int32 tim
_stream = new AudStream(_data);
_isNextPresent = false;
- _channel = _vm->_audioMixer->playMusic(_stream, volumeStart, mixerChannelEnded, this);
+ _channel = _vm->_audioMixer->playMusic(_stream, volumeStart, mixerChannelEnded, this, _stream->getLength());
if (_channel < 0) {
delete _stream;
_stream = nullptr;
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index e6a5a25..8738edc 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -1091,9 +1091,9 @@ int ScriptBase::Random_Query(int min, int max) {
return _vm->_rnd.getRandomNumberRng(min, max);
}
-void ScriptBase::Sound_Play(int id, int volume, int panFrom, int panTo, int priority) {
- debugC(6, kDebugScript, "Sound_Play(%d, %d, %d, %d, %d)", id, volume, panFrom, panTo, priority);
- _vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(id), volume, panFrom, panTo, priority);
+void ScriptBase::Sound_Play(int id, int volume, int panStart, int panEnd, int priority) {
+ debugC(6, kDebugScript, "Sound_Play(%d, %d, %d, %d, %d)", id, volume, panStart, panEnd, priority);
+ _vm->_audioPlayer->playAud(_vm->_gameInfo->getSfxTrack(id), volume, panStart, panEnd, priority);
}
void ScriptBase::Sound_Play_Speech_Line(int actorId, int sentenceId, int volume, int a4, int priority) {
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index 828a736..eb8d49e 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -163,7 +163,7 @@ protected:
int Global_Variable_Increment(int, int);
int Global_Variable_Decrement(int, int);
int Random_Query(int min, int max);
- void Sound_Play(int id, int volume, int panFrom, int panTo, int priority);
+ void Sound_Play(int id, int volume, int panStart, int panEnd, int priority);
void Sound_Play_Speech_Line(int actorId, int sentenceId, int volume, int a4, int priority);
void Sound_Left_Footstep_Walk(int actorId);
void Sound_Right_Footstep_Walk(int actorId);
diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp
index 5a08954..059a16d 100644
--- a/engines/bladerunner/vqa_player.cpp
+++ b/engines/bladerunner/vqa_player.cpp
@@ -148,8 +148,10 @@ int VQAPlayer::update(bool forceDraw, bool advanceFrame, bool useTime, Graphics:
queueAudioFrame(_decoder.decodeAudioFrame());
}
}
- // Use speech sound type as in original engine
- _vm->_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_soundHandle, _audioStream);
+ if (_vm->_mixer->isReady()) {
+ // Use speech sound type as in original engine
+ _vm->_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_soundHandle, _audioStream);
+ }
_audioStarted = true;
}
if (_frameNext + audioPreloadFrames < _frameEnd) {
More information about the Scummvm-git-logs
mailing list