[Scummvm-git-logs] scummvm master -> deda644626d63ada1894c71ffd5c53ffedd1b37a
athrxx
noreply at scummvm.org
Mon Aug 24 18:15:42 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
deda644626 KYRA: (EOBII/PC98) - sfx fix
Commit: deda644626d63ada1894c71ffd5c53ffedd1b37a
https://github.com/scummvm/scummvm/commit/deda644626d63ada1894c71ffd5c53ffedd1b37a
Author: athrxx (athrxx at scummvm.org)
Date: 2026-08-24T20:13:37+02:00
Commit Message:
KYRA: (EOBII/PC98) - sfx fix
The way this was coded caused lags.
Changed paths:
engines/kyra/sound/drivers/capcom98.cpp
diff --git a/engines/kyra/sound/drivers/capcom98.cpp b/engines/kyra/sound/drivers/capcom98.cpp
index 7696651dfd3..9f7db16d948 100644
--- a/engines/kyra/sound/drivers/capcom98.cpp
+++ b/engines/kyra/sound/drivers/capcom98.cpp
@@ -63,6 +63,7 @@ public:
void setMusicVolume (int vol);
void setSoundEffectVolume (int vol);
+ void updateQueue();
void nextTick();
virtual void processSounds() = 0;
@@ -101,6 +102,15 @@ private:
Common::Array<uint32> _storedEvents;
+ struct EnqueuedTrack {
+ EnqueuedTrack(const uint8 *d, uint8 v, bool l) : data(d), volume(v), loop(l) {}
+ const uint8 *data;
+ uint8 volume;
+ bool loop;
+ };
+ Common::Array<EnqueuedTrack> _enqueuedTracks;
+
+ const int _queueLen;
const bool _playerPrio;
const uint16 _playFlags;
};
@@ -320,15 +330,24 @@ private:
uint16 CapcomPC98Player::_flags = 0;
CapcomPC98Player::CapcomPC98Player(bool playerPrio, uint16 playFlags, uint16 chanReserveFlags, uint16 chanDisableFlags) : _playerPrio(playerPrio), _playFlags(playFlags), _chanReserveFlags(chanReserveFlags), _chanDisableFlags(chanDisableFlags),
- _data(nullptr), _curPos(nullptr), _numEventsTotal(0), _numEventsLeft(0), _volume(0), _midiTicker(0), _loop(false), _fadeState(0), _fadeSpeed(1), _fadeTicker(0), _musicVolume(0), _sfxVolume(0) {
+ _data(nullptr), _curPos(nullptr), _numEventsTotal(0), _numEventsLeft(0), _volume(0), _midiTicker(0), _loop(false), _fadeState(0), _fadeSpeed(1), _fadeTicker(0), _musicVolume(0), _sfxVolume(0), _queueLen(1) {
memset(_soundMarkers, 0, sizeof(_soundMarkers));
_flags = 0;
}
void CapcomPC98Player::startSound(const uint8 *data, uint8 volume, bool loop) {
- stopSound();
-
PC98AudioCore::MutexLock lock = lockMutex();
+
+ if (!(_flags & stopFlag()))
+ stopSound();
+
+ if ((_flags & playFlag())) {
+ if (_enqueuedTracks.size() >= _queueLen)
+ _enqueuedTracks.remove_at(0);
+ _enqueuedTracks.push_back(EnqueuedTrack(data, volume, loop));
+ return;
+ }
+
_numEventsTotal = _numEventsLeft = READ_LE_UINT16(data);
_data = _curPos = data + 2;
_volume = volume & 0x7F;
@@ -345,12 +364,8 @@ void CapcomPC98Player::startSound(const uint8 *data, uint8 volume, bool loop) {
}
void CapcomPC98Player::stopSound() {
- while (_flags & playFlag()) {
- g_system->delayMillis(4);
- PC98AudioCore::MutexLock lock = lockMutex();
- _flags |= stopFlag();
- }
- g_system->delayMillis(8);
+ PC98AudioCore::MutexLock lock = lockMutex();
+ _flags |= stopFlag();
}
void CapcomPC98Player::fadeOut(uint16 speed) {
@@ -384,6 +399,13 @@ void CapcomPC98Player::setSoundEffectVolume (int vol) {
updateMasterVolume();
}
+void CapcomPC98Player::updateQueue() {
+ if (!(_flags & playFlag()) && _enqueuedTracks.size()) {
+ EnqueuedTrack t = _enqueuedTracks.remove_at(0);
+ startSound(t.data, t.volume, t.loop);
+ }
+}
+
void CapcomPC98Player::nextTick() {
if (_flags & playFlag()) {
if (_flags & kFadeOut) {
@@ -1448,8 +1470,10 @@ void CapcomPC98AudioDriverInternal::setSoundEffectVolume(int volume) {
}
void CapcomPC98AudioDriverInternal::timerCallback() {
- for (int i = 0; i < 2; ++i)
+ for (int i = 0; i < 2; ++i) {
+ _players[i]->updateQueue();
_players[i]->nextTick();
+ }
}
PC98AudioCore::MutexLock CapcomPC98AudioDriverInternal::lockMutex() {
More information about the Scummvm-git-logs
mailing list